☁️くもをもくもくまなぶ

クラウドコンピューティングサービスの学んだことを中心につらつらと書いています

AWS App Runner VPC Supportを試してみた

教材

リリースされたことは知っていましたが、触ってこなかったです。。

背景

ちょうどイベントで取り扱われていることもあり、それならばと触ってみようということが目的です。

実際にやってみた

AWS公式ブログを参考に実施するとハマりポイントが2点ありましたので、先に紹介します。

注意点1 RDSインスタンスの設定
To simplify capacity management for this database, I use Amazon Aurora Serverless. In the RDS console, I create an Amazon Aurora MySQL-Compatible database. For the Capacity type, I choose Serverless.
To simplify connecting later, I enable AWS Identity and Access Management (IAM) database authentication.

ブログではAurora MySQL Serverless を選択しIAM DB認証を利用と記載がありますが、
ドキュメントを見る限りできなかったです。。orz

・Aurora Serverless v1 では、以下の機能はサポートされていません。
 ・AWS Identity and Access Management (IAM) データベース認証
・Aurora Serverless v2 (プレビュー) では、以下の Aurora の機能はサポートされていません。
 ・AWS Identity and Access Management (IAM) データベース認証

{{< message_box color="danger" >}}
もしAurora Serverlessで設定できる方法が分かる方は切実に教えて下さい。。
{{< /message_box >}}

以上より今回は、Aurora RDS MySQL-Compatible ではなく、RDS for MySQL 5.7.37 で行っています。

注意点2 EC2からRDSにアクセスする際のコマンド

ブログでは mysql -h <DATABASE_HOST> -u admin -P と紹介されていますが、
実際に行うときは、 mysql -h <DATABASE_HOST> -u admin -p です。

mysqlコマンドでは、 -P-p ではパラメータオプションが次の通り異なります。

$ mysql --help
...
  -p, --password[=name]
                      Password to use when connecting to server. If password is
                      not given it's asked from the tty.
  -P, --port=#        Port number to use for connection or 0 for default to, in
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
...
注意点3 SQLのエスケープ漏れ

ブログからコピーアンドペーストすると1箇所、'とすべき箇所で、となっているため、
EC2 Instance Connectで接続しているコンソール画面で入力待ち状態になります。

誤)ブログに記載のあるSQL

GRANT SELECT ON bookcase.* TO 'bookuser'@'%;

正)修正するSQL

GRANT SELECT ON bookcase.* TO 'bookuser'@'%';

上記を注意の上で今回実施する中で参考になった点を記載します。

参考になったこと1 RDSへのIAM DB認証

IAM Roleの作成方法が個人的に初めて行う流れでした。

  1. 信頼するポリシーから作成
    Image in a image block
  2. 対象のRDS Instance IDとユーザの記載
    Image in a image block
  • 結果的に、作成したIAM Roleに信頼ポリシーが紐づく
    Image in a image block
  1. IAM Role(RDS-Connect-Role)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:${Region}:${AccountID}:dbuser:${RDS Instance ResourceID}/${User Name}"
            ]
        }
    ]
}
  1. 上記のIAM Roleに付随する信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "tasks.apprunner.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
参考になったこと2 App Runnerのパラメータ設定

ブログにも記載のある server.py を見ていただけるとわかりますが、
ソースコードに記載のある接続情報はすべて変数のみとなっています。
すべて import os に基づいてパラメータを取り込む形となっています。

DATABASE_HOST ${RDS Instance Host}
DATABASE_PORT 3306
DATABASE_USER bookuser
DATABASE_NAME bookcase
参考になったこと3 PythonのWebフレームワーク「Pyramid」

個人的に、Flask, Djangoは知っていましたが、Pyramidを知りませんでした。

参考になったこと4 GitHubリポジトリとの連携

Githubのプライベートリポジトリにあるファイルも問題なく連携可能です。

Image in a image block
フォルダ構成

今回はいろいろあり東京リージョン(ap-northeast-1)で実施しました。

├── cert
│   └── ap-northeast-1-bundle.pem
├── requirements.txt
└── server.py
Image in a image block
MySQLで事前準備するデータを作成するEC2のコマンド
sudo yum install mariadb -y
mysql -h ${RDS Instance Host} -u admin -p
  • SQLで実行するコマンドは以下のとおりです
CREATE USER bookuser IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
CREATE DATABASE bookcase;
SHOW databases;
GRANT SELECT ON bookcase.* TO 'bookuser'@'%';
USE bookcase;
CREATE TABLE authors (
  authorId INT,
  name varchar(255)
 );
CREATE TABLE books (
  bookId INT,
  authorId INT,
  title varchar(255),
  year INT
);
SHOW tables;
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);
  • 実行すると次のような結果が得られます
MySQL [(none)]>
MySQL [(none)]> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bookcase           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)
MySQL [bookcase]> SHOW tables;
+--------------------+
| Tables_in_bookcase |
+--------------------+
| authors            |
| books              |
+--------------------+
2 rows in set (0.00 sec)

MySQL [bookcase]>
MySQL [bookcase]> INSERT INTO authors VALUES (1, "Issac Asimov");
Query OK, 1 row affected (0.05 sec)

MySQL [bookcase]> INSERT INTO authors VALUES (2, "Robert A. Heinlein");
Query OK, 1 row affected (0.01 sec)

MySQL [bookcase]> INSERT INTO books VALUES (1, 1, "Foundation", 1951);
Query OK, 1 row affected (0.01 sec)

MySQL [bookcase]> INSERT INTO books VALUES (2, 1, "Foundation and Empire", 1952);
Query OK, 1 row affected (0.02 sec)

MySQL [bookcase]> INSERT INTO books VALUES (3, 1, "Second Foundation", 1953);
Query OK, 1 row affected (0.00 sec)

MySQL [bookcase]> INSERT INTO books VALUES (4, 2, "Stranger in a Strange Land", 1961);
Query OK, 1 row affected (0.00 sec)

MySQL [bookcase]>
実行結果
Image in a image block

実行結果はシンプルな単一Webページですが、
今回はApp RunnerのプライベートなRDSインスタンスへの接続が目的のため、
データが取得できていることで目的を達しています。

まとめ

結果はシンプルなものでしたが、
たどり着くまでに初めてのことばかりでしたので、
非常に学ぶことが多かったです。

App Runnerも単独では、DynamoDBなどVPCの制約を受けないサービスを中心に、
稼働する仕組みが必要でしたが、VPC Supportですごい簡単になりました。

GithubのPushイベントを検知して自動Deploymentを実行することも可能なので、
途中で、手動Deploymentが手間になったので、自動Deploymentにしましたが、
ローカルでPushすればDeploymentが動いたので楽でした。

RDSもこれまでID・パスワード認証しか使ってこなったので、
機能としてはIAM DB認証があることは知っていたものの、
こうやって使うことを実践できたのは個人的にいい経験となりました。

同じようにAWSブログから実践するときの回避、注意点が参考になれば幸いです。

あと、Aurora ServerlessでIAM DB認証する方法も分かれば教えて下さい。。
自分がブログを変に読んでしまったのかな。。

参考