🚀

AWS App RunnerとAmazon DynamoDBを連携させてみた

2021/12/20に公開

こんにちは、べこです。
本記事は AWS Advent Calendar 2021 20日目の記事です。

はじめに

本記事ではAWS App Runner(以降、App Runner)でデプロイしたアプリケーションでAmazon DynamoDB(以降、DynamoDB)上のデータを取得、表示することを目的としています。
そのため、App Runner、DynamoDBのサービス説明については簡単な記載に留めます。

App Runnerとは

  • AWS上で、コンテナ化されたWebアプリを"最も簡単"かつ"最速"で、ビルド、デプロイ、実行出来るサービス
  • "App"と"Runner"の間には半角スペースが必須です。
  • ※その他の説明、ドキュメント等の紹介は記事の最後にまとめてます。

DynamoDBとは

  • フルマネージドなkey-value型のNoSQLデータベース

そもそも何故DynamoDBと連携?

App Runnerは記事執筆時点(2021/12/20)ではVPC内のリソースにアクセスすることが出来ず、Amazon Aurora等のRDBとアプリケーションを連携することが出来ません。
そのため、今回はVPCを経由せずにアクセス可能なDynamoDBとApp Runnerでデプロイしたアプリケーションを連携させます。

作業手順

下記の手順で作業を行います。

  1. App RunnerにアタッチするIAMロールを作成する。(AWS CLI)
  2. DynamoDBにテーブルを作成する。(コンソール)
  3. App Runnerでアプリケーションをデプロイする。(コンソール)
  4. 動作確認

1. App RunnerにアタッチするIAMロールを作成する。(AWS CLI)

コンソール上からIAMロールを作成しようとしましたが、記事執筆時点(2021/12/20)では「信頼されたエンティティ」のユースケース選択時にApp Runnerが存在しなかったため、今回はAWS CLIでIAMロール作成とIAMポリシーのアタッチを行います。

まず、下記コマンドを実行し、信頼関係ポリシードキュメントを作成します。

cat << EOF > dynamorunner-role-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "tasks.apprunner.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF

次に、下記コマンドを実行し、IAMロール「dynamorunner-role」を作成します。

aws iam create-role \
 --role-name dynamorunner-role \
 --path '/dynamorunner/' \
 --assume-role-policy-document file://dynamorunner-role-policy.json

最後に、作成したIAMロールにAWS管理ポリシー「AmazonDynamoDBReadOnlyAccess」をアタッチします。

aws iam attach-role-policy \
 --role-name dynamorunner-role \
 --policy-arn arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess

2. DynamoDBにテーブルを作成する。(コンソール)

今回デプロイするのは「key」の"1"に該当する「message」を取得し、表示するだけの非常に簡素なアプリなので、下記のようなテーブルを作成します。

ちなみに今回は東京リージョンで行いました。

3. App Runnerでアプリケーションをデプロイする。(コンソール)

こちらも東京リージョンで行いました。

それではApp Runnerのサービスを作成しましょう。

App Runnerはコンテナレジストリ上のコンテナイメージ、もしくはGitHub上のソースコードからアプリをデプロイすることが出来ます。
今回はGitHub上のソースコードからデプロイするため、「ソースコードリポジトリ」を選択し、「新規追加」をクリックします。

次はGitHubのリポジトリと接続するためにコネクションを作成します。
コネクションは一度作成すると、AWS上に保持されるため、今後も同じものを使い続けることが出来ます。
任意の「接続名」を入力し、適当なGitHubアプリケーションをインストールします。
GitHubアプリケーションをインストールする際、コネクションの対象を全てのリポジトリか任意のリポジトリかを選択することが出来ます。

コネクション作成後、作成したコネクション、対象のリポジトリ、対象のブランチを選択します。
今回はこのリポジトリのソースをデプロイしました。

そして構築設定を行います。
今回はNext.jsのアプリなので、下図のように設定しました。
ポートは3000です。

任意のサービス名を入力し、環境変数を設定します。
環境変数はDynamoDBからItemを取得するために使用します。
REGIONとして使用しているリージョン名を、TABLE_NAMEとして手順2で作成したDynamoDBのテーブル名を設定します。

最後にセキュリティ項目にて、手順1で作成したIAMロールを選択します。

内容を確認し、「確認とデプロイ」をクリックします。
たったこれだけで、GitHub上のソースコードからアプリや必要なインフラがよしなに用意されるのです。。。

本アプリでは、デプロイに6分ほどかかりました。
デプロイ時のログはコンソール上に表示されるため、状況が確認しやすいです。

動作確認

それでは実際にアプリがデプロイされているか確認します。
「デフォルトドメイン」として記載されているURLがアプリのURLです。デフォルトポートを3000に設定したため、動作確認は記載のURLにアクセスするだけです。

出ました!
無事にDynamoDBの対象テーブルに登録した「Welcome to DynamoDB !」という文字列が取得、表示出来ています。

参考

本記事の執筆にあたり、下記記事を参考にさせて頂きました。
本記事より難易度の高いことをされていて、かつ内容も非常に分かりやすかったです。
もしかして App Runner 上 Next.js の SSR で直接 DynamoDB 呼べますか?

【おまけ】App Runner、近々VPC対応するってよの話

本記事の冒頭で「App Runnerは記事執筆時点(2021/12/20)ではVPC内のリソースにアクセスすることが出来ない」と言いましたが、実はVPCアクセスに関するissueが2021/11/20に「coming soon」となったそうです。
App RunnerがVPC内のリソースにアクセス可能になったら、めちゃくちゃ便利になりますね。楽しみです。
2021/11/20、VPCに関するissueが「coming soon」になった。

【おまけ】App Runnerのあれこれ

Discussion