ポケモン API を使った Nuxt+Express アプリ/サーバの開発演習
ヒント集を参照してください。それでも解消しなければ助けを求めましょう。
- AWS のセキュリティ認証情報 にてアクセスキー ID とシークレットアクセスキーを生成してください
- AWS S3 にて空のバケットを作成してください (設定は全てデフォルトで大丈夫です)
- Set and view configuration settings using commands を参考に生成したアクセスキー ID とシークレットアクセスキーを AWS CLI プロファイルに設定してください
- Node v18 / v20 / v22
- 本リポジトリをクローンし、次の使い方に従って実行してください
- 環境変数は実行環境 (ターミナルセッションなど) の環境変数に設定するか .env ファイルを新規作成して記述してください
aws configure # AWS CLI プロファイルの設定
npm install # npm パッケージのインストール
echo "NUXT_BUCKET_NAME=<作成した S3 バケット名>" >> .env # 環境変数 NUXT_BUCKET_NAME の設定
npm run dev # 開発サーバーの起動
aws configure # AWS CLI プロファイルの設定
npm install # npm パッケージのインストール
echo "NUXT_BUCKET_NAME=<作成した S3 バケット名>" >> .env # 環境変数 NUXT_BUCKET_NAME の設定
echo "NUXT_PUBLIC_BACKEND_ORIGIN=http://localhost:4000" >> .env # 環境変数 NUXT_PUBLIC_BACKEND_ORIGIN の設定
npm run dev:express # 開発サーバーの起動
https://us-east-1.console.aws.amazon.com/iamv2/home#/roles より「ロールを作成」をクリック
カスタム信頼ポリシーを選択し、以下のカスタム信頼ポリシーを作成
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "tasks.apprunner.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシーから AmazonS3FullAccess を指定
ロール名を入力して作成
https://us-east-1.console.aws.amazon.com/apprunner/home#/services からサービスの作成をクリック
リポジトリタイプは「ソースコードリポジトリ」を指定、必要に応じてAWS Connector for GitHubアプリをインストールし、webdino/lyceum-pokemonをフォークしたリポジトリを指定
下記の通り設定(ランタイムは適宜最新の Nodejs ランタイムを選択します)
サービス設定は下記のとおり設定
このとき、環境変数 NUXT_BUCKET_NAME は作成した S3 バケット名にしてください
準備で作成したIAMロールをインスタンスロールとして指定
ここでは、IAMロールを lyceum-pokemon-app-runner としています
次の npm スクリプトを用意しています (package.json
の記述と npm run
の出力を参照)。
npm install
: npm パッケージのインストールnpm run dev
: 開発サーバーの起動npm run dev:express
: 開発サーバーの起動 (別プロセスでの Express サーバー起動を含む)npm run build
: アプリケーションのプロダクションビルドを .output ディレクトリに生成するnpm start
: プロダクションビルドを使ったローカルサーバーの起動 (事前にビルドしておくこと)npm run lint
: コードリントnpm run format
: コード整形
変数名 | 説明 | 初期値 |
---|---|---|
NUXT_REGION |
AWS のリージョン | "ap-northeast-1" |
NUXT_BUCKET_NAME |
本アプリケーションのデータ永続化に用いる AWS S3 バケット | "" |
NUXT_PUBLIC_BACKEND_ORIGIN |
Nuxt から Express への API リクエストに用いるオリジン1 | なし |
HOST または NITRO_HOST |
npm start 時反映される Nuxt サーバーのホスト名 |
"0.0.0.0" |
PORT または NITRO_PORT |
npm start 時反映される Nuxt サーバーのポート番号 |
3000 |
FRONTEND_ORIGIN |
Express サーバが CORS を許可するアクセス元オリジン。Nuxt 側のオリジンを設定する | "http://localhost:3000" |
BACKEND_PORT |
Express が HTTP(S) リクエストを受け付けるポート番号 | 4000 |
初期値がなくチェックがあるものについては、必ず自身で値を設定する必要があります。初期値があるものであっても、チェックがあるものについては自身で値を設定する必要がある場合があります。
変数名 | 開発時 Nuxt のみ起動 | 開発時 Nuxt と Express 起動 | App Runner へデプロイ |
---|---|---|---|
NUXT_REGION 2 |
|||
NUXT_BUCKET_NAME 3 |
✔️ | ✔️ | ✔️ |
NUXT_PUBLIC_BACKEND_ORIGIN |
✔️ | ||
HOST または NITRO_HOST |
✔️ | ||
PORT または NITRO_PORT |
✔️ | ||
FRONTEND_ORIGIN |
✔️ | ||
BACKEND_PORT |
✔️ |
画面名 | 機能 |
---|---|
スタート | 「つづきからはじめる」と「あたらしくはじめる」に遷移できる |
あたらしくはじめる | トレーナー名を入力してトレーナーが追加できる |
つづきからはじめる | どのトレーナーを表示するか選択できる |
トレーナー情報 | 「ポケモンをつかまえる」に遷移できる、ポケモンにニックネームをつけられる、ポケモンを削除できる、トレーナーを削除できる |
ポケモンをつかまえる | ポケモンを追加できる |
erDiagram
Trainer ||--o{ Pokemon : pokemons
Trainer {
string name PK "トレーナー名"
}
Pokemon {
int id PK "手持ちポケモン識別子"
string nickname "ニックネーム"
int order "ポケモン図鑑番号"
string name "ポケモン名"
string sprites "スプライト(画像)"
}
サーバー API | AWS S3 |
---|---|
トレーナー名の一覧の取得 | S3 オブジェクトの一覧の取得 |
トレーナーの追加 | S3 オブジェクトの追加または更新 |
トレーナーの取得 | S3 オブジェクトの取得 |
トレーナーの更新 | S3 オブジェクトの追加または更新 |
トレーナーの削除 | S3 オブジェクトの削除 |
ポケモンの追加 | S3 オブジェクトの追加または更新 |
ポケモンの削除 | S3 オブジェクトの追加または更新 |
トレーナー情報 (トレーナーの名前や保有ポケモンのリスト) は AWS S3 のバケットの中に トレーナー名.json のような JSON ファイルとして保存します。 S3 バケット内のファイルリスト = トレーナーリストであり、トレーナーの情報は全てトレーナー名毎の JSON ファイルに含めています。
例えば、トレーナー名が レッド
の場合は次のようになります:
レッド.json
: S3 オブジェクトキー(ファイル名)- 次のコードブロック: S3 オブジェクト値(ファイル内容)
{
"name": "レッド",
"pokemons": [
{
"id": 1,
"nickname": "",
"order": 35,
"name": "pikachu",
"sprites": {
"front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png"
}
},
{
"id": 2,
"nickname": "",
"order": 220,
"name": "espeon",
"sprites": {
"front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/196.png"
}
}
]
}
トレーナー名の一覧の取得
なし
["コジロウ", "サトシ", "ムサシ", "レッド"]
トレーナーの追加
なし
name
: トレーナー名(必須)pokemons
: 手持ちポケモン(任意)
{ "name": "satoshi" }
空(リクエストボディに必要なプロパティが含まれていない場合に返される)
空(すでにトレーナーが存在する場合に返される)
トレーナーの取得
trainerName
: トレーナー名
{ "name": "satoshi", "pokemons": [] }
トレーナーの更新
trainerName
: トレーナー名
name
: トレーナー名(必須)pokemons
: 手持ちポケモン(任意)
{ "name": "satoshi" }
空(トレーナーが存在しない場合に返される)
トレーナーの削除
trainerName
: トレーナー名
ポケモンの追加
trainerName
: トレーナー名
name
: ポケモン名(必須)
ポケモンの削除
trainerName
: トレーナー名pokemonId
: 手持ちポケモン識別子