モジュール 3: Mysfit 情報の保存
このモジュールでは、Amazon DynamoDB をセットアップして Mysfit 情報を中央データベーステーブルに保存します。
概要
ここまでで、サービスはデプロイされ、コードリポジトリ更新時にサービスへの変更を自動的に実施する CI/CD パイプラインも動作しています。これにより、アプリケーションの新機能の構想から実際に Mysthical Mysfits のお客様に利用してもらうまでを迅速に進めることができます。俊敏性が高くなったことを生かして、Mythical Mysfits ウェブサイトのアーキテクチャに別の基礎的な機能であるデータ階層を追加しましょう。
このモジュールでは、Amazon DynamoDB にテーブルを作成します。Amazon DynamoDB はスケーラブルなマネージド型 NoSQL データベースサービスで、非常に高速なパフォーマンスを誇ります。すべての Mysfit を静的な JSON ファイルに保存するのではなく、データベースに保存することにより、さらにスケーラブルで優れた拡張性を備えたウェブサイトを作成することが可能になります。
アーキテクチャ図

所要時間
20 分
使用する AWS のサービス
GitHub で試す
実装手順
-
ステップ 1: Mythical Mysfits に NoSQL データベースを追加する
A: DynamoDB テーブルを作成する
アーキテクチャに DynamoDB テーブルを追加するために、MysfitsTable というテーブルを定義するもう 1 つの JSON CLI 入力ファイルを含めてあります。このテーブルには、MysfitId というハッシュキー属性で定義されたプライマリインデックス、およびさらに 2 つのセカンダリインデックスが設定されます。1 番目のセカンダリインデックスには Species のハッシュキーと MysfitId の範囲キーがあり、2 番目のセカンダリインデックスには Alignment のハッシュキーと MysfitId の範囲キーがあります。
これら 2 つのセカンダリインデックスがあれば、テーブルに対しクエリを実行して、指定された Species や Alignment に一致する Mysfit すべてを取得できるようになります。お気付きかもしれませんが、このフィルター機能はウェブサイトではまだ動作していません。このファイルは、~/environment/aws-modern-application-workshop/module-3/aws-cli/dynamodb-table.json で見ることができます。このファイルを変更する必要はありません。既に実行できる状態になっています。DynamoDB のインデックスとその他主要コンセプトの詳細については、このページをご覧ください。
AWS CLI を使ってテーブルを作成するには、Cloud9 のターミナルで以下のコマンドを実行します。
aws dynamodb create-table --cli-input-json file://~/environment/aws-modern-application-workshop/module-3/aws-cli/dynamodb-table.json
コマンドの実行後、ターミナルから以下の AWS CLI コマンドを実行することで、新規作成したテーブルの詳細情報の表示が可能になります。
aws dynamodb describe-table --table-name MysfitsTable
以下のコマンドを実行してテーブルに保存されたすべての項目を取得すると、テーブルが空であることがわかります。
aws dynamodb scan --table-name MysfitsTable
{ "Count": 0, "Items": [], "ScannedCount": 0, "ConsumedCapacity": null }
B: DynamoDB テーブルに項目を追加する
複数の Mysfit 項目をこのテーブルに一括で挿入するために使用できる JSON ファイルも用意されています。これは DynamoDB API BatchWriteItem によって実行できます。
用意された JSON ファイルを使用するこの API をコールするには、以下のターミナルコマンドを実行します (応答として、未処理の項目はないことがサービスによって報告されます)。
aws dynamodb batch-write-item --request-items file://~/environment/aws-modern-application-workshop/module-3/aws-cli/populate-dynamodb.json
ここでテーブルのコンテンツすべてをスキャンする同じコマンドを実行すれば、テーブルに項目がロードされたことがわかります。
aws dynamodb scan --table-name MysfitsTable
-
ステップ 2: 最初の実際のコード変更をコミットする
A: 更新された Flask サービスコードをコピーする
テーブルにデータが入力されたので、今からアプリケーションコードを変更し、モジュール 2 で使用した静的 JSON ファイルに戻る代わりに、このテーブルからデータを読み取るようにします。Flask マイクロサービス用に新しい Python ファイルのセットを含めてありますが、今回は静的な JSON ファイルを読み取るのではなく、DynamoDB にリクエストを送るようにします。
このリクエストは、boto3 という AWS Python SDK を使って形成されます。この SDK は、Python コードによって AWS のサービスとの連携を実現させる、強力かつシンプルな方法です。これによってサービスクライアントの定義と関数が使用できるようになり、それらはこのワークショップの一環として既に実行している AWS API や CLI コマンドとの対称性を有しています。boto3 を使用すると、これらのコマンドを正しく動作する Python コードへとシンプルに変換できます。
新しいファイルを CodeCommit リポジトリに直接コピーするには、以下のコマンドをターミナルで実行します。
cp ~/environment/aws-modern-application-workshop/module-3/app/service/* ~/environment/MythicalMysfitsService-Repository/service/
B: 更新された Flask サービスコードをコピーする
これから、git コマンドラインクライアントを使用して、これらのコード変更を CodeCommit にチェックインする必要があります。
以下のコマンドを実行してコードの新たな変更内容をチェックインし、CI/CD パイプラインを起動します。
cd ~/environment/MythicalMysfitsService-Repository
git add .
git commit -m "Add new integration to DynamoDB."
git push
すると、5~10 分でコード変更が CodePipeline 内の CI/CD パイプラインを通り抜け、Amazon ECS の AWS Fargate へのデプロイ済み Flask サービスへと出てくることになります。
AWS CodePipeline コンソールを自由に調べて、変更のパイプラインでの進行状況を確認してみてください。
-
ステップ 3: S3 内のウェブサイトコンテンツを更新する
最後に、新しい index.html ページを S3 バケットにパブリッシュし、レスポンスをクエリ文字列でフィルターする新しい API 機能が使用されるようにすることが必要です。新しい index.html ファイルは、~/environment/aws-modern-application-workshop/module-3/web/index.html にあります。
このファイルを Cloud9 IDE で開き、モジュール 2 のときと同様に、“REPLACE_ME” と表示された文字列を適切な NLB エンドポイントに置き換えます。/mysfits パスは含めないよう注意してください。
必要なら、既に編集した /module-2/ ディレクトリ内のファイルを参照してください。エンドポイントを NLB のポイントに置換してから、以下のコマンドを実行して新しい index.html ファイルをアップロードします (モジュール 1 で作成したバケット名に置き換える)。
aws s3 cp --recursive ~/environment/aws-modern-application-workshop/module-3/web/ s3://your_bucket_name_here/
Mythical Mysfits ウェブサイトに再度アクセスし、DynamoDB テーブルから新たな Mysfits が加わっていることや、フィルター機能がどのように動作しているかを確認します。
モジュール 3 はこれで終了です。