はじめに

こんにちは。ビジネスアクセラレーション事業部の古川です。
この記事は、「AWSに興味はあるけどよく知らない」「資格を持っているけど実際に触ってみたことがない」という方向けに、「30分で学習できる」をテーマに毎週金曜日にお届けする連載シリーズの第三回です。

この記事では、AWS公式チュートリアルの「フルスタックのReactアプリケーションを構築する」に挑戦します。この記事は第三回となります。前回の記事はこちらです。
本日も一緒に取り組んでいただけると嬉しいです!

※本ブログではmacOSを使用しています。
※Gitの代わりにCodeCommitを使用しています。ご了承ください。

1.Amplify Authを設定する

本日はタスク2「ローカルAmplifyアプリを初期化する」を進めます。ブログでは私が実際に行った手順を紹介しますが、公式ガイドも合わせてご確認ください。

このアプリでは、メールアドレスをログイン方法として使います。デフォルトで設定されているため、特に変更する必要はありません。
notesapp/amplify/auth/resource.ts でファイルを開くと、認証方法について書かれたコードを確認できます。

2.Amplify Dataの設定

今回作成するアプリは、ユーザーがメモを作成、削除、一覧表示できるメモアプリです。
この手順では、承認ルールを「誰でも全メモが見える」状態から「ログインした本人の、本人が作ったメモだけを操作できる」状態に変更します。

  1. Finder を開き、notesapp/amplify/data/resource.ts へ移動します。


2.resource.ts  ファイルを、VSコード等のコードエディタで開きます。
3.書かれているコードを全て削除して下記のコードを貼り付け、保存します。

import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
const schema = a.schema({  
Note: a
    .model({
      name:a.string(),
      description: a.string(),
      image: a.string(),
    })
    .authorization((allow) => [allow.owner()]),
});
export type Schema = ClientSchema;
export const data = defineData({
  schema,
  authorizationModes: {
    defaultAuthorizationMode: 'userPool',
  },
});

3.Amplify Storageの設定

この手順では、notesappの中に新しくフォルダとファイルを作成します。しかし、Finder にはデフォルトでファイルを作る機能がないため、VSコード等のコードエディタを使って行います。
なお、ショートカットを設定することで、Finderからファイルを作ることが可能になります

1.VSコード(他のコードエディタでも可)を開きます。
2.「開く」を選択します。


3. 右上の検索バーに「notesapp」と入力し、出てきたnotesappフォルダを選択して開きます。

4.VSコードでnotesappフォルダが開かれます。amplifyの上にカーソルを合わせ、右クリックして新しいフォルダを作成します。「storage」と名前をつけます。

5.storageの上にカーソルを合わせ、新しいファイルを作成します。「resource.ts」と名前をつけます。このようになっていれば成功です。

6.先ほど作成したresource.tsファイルを開き、下記を貼り付けて保存します。

 

import { defineStorage } from "@aws-amplify/backend";

export const storage = defineStorage({
  name: "amplifyNotesDrive",
  access: (allow) => ({
    "media/{entity_id}/*": [
      allow.entity("identity").to(["read", "write", "delete"]),
    ],
  }),
});

4. Amplify Cloudサンドボックスをデプロイする

1.VSコードの画面のまま、backend.ts ファイルに移動します。
2.中身を全て削除し、下記をコピーして貼り付けます。この
コードは、認証、データ、およびストレージのバックエンド定義をインポートします。

import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { data } from './data/resource';
import { storage } from './storage/resource';
/**
 * @see https://docs.amplify.aws/react/build-a-backend/ to add storage, functions, and more
 */
defineBackend({
  auth,
  data,
  storage
});
  1. notesappの階層へ移動します。既に入っている方はこの手順は不要です。ターミナルで下記コマンドを入力します。
    cd ~/notesapp
    4.サンドボックス環境を起動します。サンドボックスを使用すると、フルスタックアプリを迅速に構築、テスト、反復開発できます。詳細はこちらに記載されています。
    npx ampx sandbox

このような画面が出れば成功です。

5.VSコードを開き、amplify_outputs.jsonファイルが作られていることを確認します。

エラーになった場合

私は下記のメッセージが流れ、サンドボックスが起動しないまま終了してしまいました。

Warning: Detected unsettled top-level await at file:///Users/h-furukawa/notesapp/node_modules/@aws-amplify/backend-cli/lib/ampx.js:36
await tracer.startActiveSpan('command', async (span) => {

エラーを見るため、下記のデバッグコマンドを入力します。
npx ampx sandbox --debug

このように返ってきました。
[Error] self-signed certificate in certificate chain

原因

会社独自の証明書が認識されていないことが原因でした。
curlaws コマンドは macOS のシステム証明書ストア(登録済みの会社の証明書)を見るので通りますが、Node.js は独自の証明書ストアしか見ないため、認証が通らず弾かれてしまいます。

解決策

1.登録済みの証明書を取り出すために下記を入力します。
openssl s_client -showcerts -connect cognito-idp.ap-northeast-1.amazonaws.com:443 /dev/null | \
awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' > ~/corp-ca.pem

2.この証明書を、Node.jsに使わせます。下記2つを入力します。
export NODE_EXTRA_CA_CERTS="$HOME/corp-ca.pem"
npx ampx sandbox

私はこの手順でエラーを解消できました。

まとめ

お疲れ様でした!
本日はAmplifyを使用して、認証、データ、ストレージのリソースを設定しました。また、独自のクラウドサンドボックス環境も起動しました。読者の皆様が遭遇したエラーや対処法などありましたら、ぜひコメントで教えていただきたいです!
次回の更新は9/25(金)を予定しています。お楽しみに。