App Runner + VPC のサンプルコード。 参考blog: https://aws.amazon.com/jp/blogs/news/deep-dive-on-aws-app-runner-vpc-networking/
参考blog から以下を変更しています。
- DB認証をIAMデータベース認証からパスワード認証に変更。
- Auroraのパスワードはパラメータストアに保管し、App Runner からパラメータストアへのアクセスは VPC エンドポイントを利用。
- Aurora は Serverless ではなくProvisionedのクラスタを利用。
このリポジトリを自分のアカウントのリポジトリにコピーしてください。インポートの方法は以下を参考にしてください。 https://docs.github.com/ja/get-started/importing-your-projects-to-github/importing-source-code-to-github/importing-a-repository-with-github-importer
参考blogでは、Aurora Serverless で IAMデータベース認証を利用すると書いてあるが、Aurora Serverless では IAMデータベース認証をサポートしていないので、Provisioned のAurora MySQLを作成します。
- プライベートサブネットにAurora MySQL を作成します。
- 同じ VPC 内で Amazon Linux EC2 インスタンスを起動します。EC2 インスタンスからデータベースに接続するには、MySQL クライアントが必要です。MySQL のコミュニティ開発ブランチである MariaDB をインストールします。
sudo yum install mariadb
- 管理者ユーザーを使用してデータベースに接続します。
mysql -h <DATABASE_HOST> -u admin -p
- 管理者ユーザーのパスワードを入力してログインします。次に、IAM 認証を使用するように設定された新しいユーザー (user01) を作成します。
create user 'user01'@'%' identified by '<パスワード>';
- bookcase データベースを作成し、user01 へ bookcase データベースにクエリを実行する権限を付与します。
CREATE DATABASE bookcase; GRANT SELECT ON bookcase.* TO 'user01'@'%';
- authors テーブルと books テーブルを作成します。
USE bookcase;
CREATE TABLE authors ( authorId INT, name varchar(255) ); CREATE TABLE books ( bookId INT, authorId INT, title varchar(255), year INT );
- 2 つのテーブルにいくつかの値を挿入します。
INSERT INTO authors VALUES (1, "Issac Asimov"); INSERT INTO authors VALUES (2, "Robert A. Heinlein"); INSERT INTO books VALUES (1, 1, "Foundation", 1951); INSERT INTO books VALUES (2, 1, "Foundation and Empire", 1952); INSERT INTO books VALUES (3, 1, "Second Foundation", 1953); INSERT INTO books VALUES (4, 2, "Stranger in a Strange Land", 1961);
- Get-Parameters という名前の IAM ロールを作成します。このロールには以下のポリシーを付与します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "SSMGetparameters", "Effect": "Allow", "Action": "ssm:GetParameters", "Resource": "*" }, { "Sid": "KMSDecrypt", "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "*" } ] }
- IAMロールの信頼ポリシーには、以下の構成を設定します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "tasks.apprunner.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
参考blogには無い手順ですが、Systems Manager の VPC Endpoint Systems Manager 経由で Parameter Store に接続します。
-
VPC の エンドポイントを開き、エンドポイントの作成をクリックします。
-
名前タグを入力し、サービスカテゴリに AWS のサービスを選択します。サービスで "com.amazonaws.ap-northeast-1.ssm"を選択します。
-
Aurora MySQL と同じVPC の apprunner-testのプライベートサブネットを選択します。
-
App Runner のタスク からの接続を拒否しないセキュリティグループを選択します。ここでは default を選択します。
-
エンドポイントを作成をクリックします。
- Aurora のパスワード用をパラメータストアを作成します。以下の設定をして、パラメータを作成 をクリックします。
- 名前: DB_PASS
- タイプ: 安全な文字列
- 値: <Aurora の user01 ユーザ のパスワード>
-
リポジトリ に python-hello-db を選択して、Install をクリックします。
-
以下のようにエラーが表示されたら、キャンセルをクリックしてください。
-
再度新規追加をクリックしてください。
-
GitHubアプリケーションにアカウントを選択して、次へをクリックします。
-
リポジトリとブランチを選択して、デプロイトリガーに手動を選択し、次へをクリックします。
-
ランタイム、構築コマンド、開始コマンド、ポートを入力します。
- ランタイム: python3
- 構築コマンド: pip install -r requirements.txt
- 開始コマンド: python server.py
- ポート: 8080
-
サービス名、仮想CPUとメモリ、環境変数を入力します。
- サービス名: bookcase
- 仮想CPUとメモリ: 1vCPU 2GB
- 環境変数
- DATABASE_HOST: Aurora インスタンスのエンドポイント名
- DATABASE_NAME: bookcase
- DATABASE_PASS: DB_PASS
- DATABASE_PORT: 3306
- DATABASE_USER: user01
-
作成したIAM ロールを選択します。
-
カスタム VPC を選択して新規追加をクリックして VPC コネクタを作成します。
-
VPC コネクタの設定をして、追加をクリックします。
- VPC コネクタ名: my-vpc
- VPC: Aurora MySQL のVPCを選択。今回は 10.0.0.0/16 を選択します。
- サブネット: プライベートサブネットを選択
- セキュリティグループ: App Runner のタスク からの接続を拒否しないセキュリティグループを選択します。今回は default を選択します。
-
次へをクリックします。
-
作成とデプロイをクリックします。