python-hello-db

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のクラスタを利用。

構成図

手順

0. リポジトリのコピー

このリポジトリを自分のアカウントのリポジトリにコピーしてください。インポートの方法は以下を参考にしてください。 https://docs.github.com/ja/get-started/importing-your-projects-to-github/importing-source-code-to-github/importing-a-repository-with-github-importer

1. Amazon Aurora MySQL の準備

参考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);
    
    

2. App Runner タスク 用 の IAM ロールの作成

  • 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"
         }
       ]
     }
    

3. Systems Manager (Parameter Store) 用 の VPC エンドポイントの作成

参考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 を選択します。

  • エンドポイントを作成をクリックします。

  • エンドポイントが作成済みになったことを確認します。

4. Parameter Store の作成

  • Aurora のパスワード用をパラメータストアを作成します。以下の設定をして、パラメータを作成 をクリックします。
    • 名前: DB_PASS
    • タイプ: 安全な文字列
    • 値: <Aurora の user01 ユーザ のパスワード>

5. App Runner のサービスの作成

  • App Runner の画面で サービスの作成 を選択します。

  • ソースコードレポジトリ を選択して、新規追加をクリックします。

  • ユーザ名(またはメールアドレス)とパスワードを入力して GitHub にログインします。

  • Authorize AWS Connector for GitHub をクリックします。

  • 接続名に名前を入力して 別のアプリケーションをインストールする をクリックします。

  • リポジトリ に 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 を選択します。
  • 次へをクリックします。

  • 作成とデプロイをクリックします。

6. デプロイの確認

  • イベントログに Service status is set to RUNNING と表示され、 左上に Create Service が成功しました と表示されたらデプロイが終了です。デフォルトドメインをクリックします。

  • 以下のように表示されたら成功です。