1. 目的
- AWSのデータベース関連サービスの復習をしている。Aurora Serverless について、「使ってない時に勝手に停止するDBらしい」程度の認識しかなかったため、実際に使ってみてもう少し理解を深める。
2. Amazon Aurora Serverless とは(自分の理解)
- RDSなどと同じく、AWSマネージドのRDBだが、自動でスケールイン・アウトするなどよりマネージドの範囲が増えているもの。
- 類似サービス(RDS, Aurora)との比較はこちらのサイトを参照。
- 2021/4現在、GAされているものは「v1」とされており、機能拡張版の「v2」がpreview提供されている。今回は基本を学ぶため、普通の「v1」を使用する。
3. やったこと
- Aurora ServerlessのDBを作成する。
- 自動起動/自動停止の動作を確認し、停止状態から何秒くらいで起動するのか測定する。
- ユースケースとして、WordPressのバックエンドとして使ってみる。
- Data APIを有効化し、Lambda関数からのクエリを実行する。
4. 構成図
5. 設定手順
5.1 Aurora Serverless DBの作成
- Aurora ServerlessのDBを作成する。
- マネージメントコンソールの「Amazon RDS - データベース - データベース作成」から以下の設定にて作成する。
- エンジンのタイプ: Amazon Aurora
- キャパシティータイプ: サーバーレス ※この選択により、Aurora Serverlessになる。
- 数分間アイドル状態のままの場合、コンピューティング性能を一時停止する: チェックを入れる ※このチェックをONにしないと、自動停止機能が有効にならない(初期設定はOFF)。
- Aurora Serverless DBを作成したVPC内に、MySQLクライアントをインストールしたEC2インスタンスを用意し、MySQLクライアントを用いて接続する。接続後、動作確認用のテーブルを作成する。
[ec2-user@ip-10-0-0-232 ~]$ mysql -h mksamba-aurora-serverless-qiita.cluster-XXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
mysql> create database mksambadb;
mysql> use mksambadb;
mysql> create table mksambadb.mytable(id int, stamp varchar(30));
5.2 自動起動/自動停止の動作確認
- DBが起動中なのか停止しているのか、またいつステータスが変わったのかはマネージメントコンソールで確認できる。
- サイズが「0個のキャパシティーユニット」の場合、停止している。(1個以上であれば起動している。)
- 「ログとイベント」にて、起動/停止、スケールイン/アウトの履歴が確認できる。
- DBが停止中に、EC2インスタンスにて、「DBに接続しデータを1行INSERTする」スクリプトを実行し動作を確認する。
- 起動に要する時間(スクリプトの開始時刻と、DB接続成功時刻の差)が27秒になっている。
connectiontest.py
import MySQLdb
import datetime
num = 0
dt_now = datetime.datetime.now()
print("startaccess:",dt_now)
connection = MySQLdb.connect(
host='mksamba-aurora-serverless-qiita.cluster-XXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com',
user='admin',
passwd='password',
db='mksambadb')
cursor = connection.cursor()
dt_now = datetime.datetime.now()
print("connectionsuccess:",dt_now)
cursor.execute("INSERT INTO mksambadb.mytable VALUES (%s, %s)", (num, dt_now))
connection.commit()
connection.close()
[ec2-user@ip-10-0-0-232 ~]$ python3 connectiontest.py
startaccess: 2021-04-17 05:41:02.592952
connectionsuccess: 2021-04-17 05:41:29.695891
5.3 WordPressバックエンドとしての使用
- AWS公式「チュートリアル: Amazon Linux 2 での WordPress ブログのホスト」に従い、WordPressサイトを構築する。
- 上記の手順ではEC2インスタンス内にMySQLをインストールしているが、その部分の手順のみAurora Serverless DBを使用するよう変更する。
- 自前のMySQLやRDS同様、普通にバックエンドDBとして使うことができ、サイトにアクセスがない場合に自動停止が、停止中に再びアクセスした場合に自動起動が発生した。
5.4 Data APIの利用
5.4.1 Data APIとは
- Data APIは、セッションを張らずにAurora Serverless DB内のデータにアクセスできるAPI。以下の手順をふめば利用可能となる。
- DB側でData APIを有効化する。
- DB接続用のID/PasswordをSecret Managerに登録する。
- クライアント(例: Lambda関数) で、Secret ManagerからID/Passwordを取得し、Data API経由でAurora Serverlessにアクセスする。
5.4.2 Data APIの有効化
- DBの設定を変更し、Data APIを有効化する。
5.4.3 マネージメントコンソールからのData API動作確認
- マネージメントコンソールからData APIの動作を確認する。Amazon RDS - Query Editor を選択すると、DBへの接続情報を求められるため、今回作成したAurora Serverless DBの情報を入力する。
- マネージメントコンソール上でSQLのクエリを実行することができる。
5.4.4 Lambda関数からのData API利用
-
Lambdaなど外部からのData API経由でのアクセスを行うため、Secret ManagerにDBのID/Passwordを登録する。手順は別記事「【初心者】AWS Secrets Manager と AWS Systems Manager Parameter Store を使ってみる」参照。
-
以下の内容を含むLambda関数を作成する。
- Secret Managerから、Aurora Serverless DBに接続するためのID/Passwordを取得
- Data API経由でAurora Serverless DBに接続し、select文を実行
-
コードはAWS公式「Aurora Serverless の Data API の使用」内のサンプルをそのままコピペする。
-
Lambda関数に対して、SecretManager、KMS、RDS DataServiceの権限付与が必要(今回は検証なのでPoweruser相当の権限を付けている)。
dataapi-test.py
import json
import boto3
def lambda_handler(event, context):
rdsData = boto3.client('rds-data')
cluster_arn = '[Aurora Serverless DBクラスタのARN]'
secret_arn = '[SecretManagerのSecretのARN]'
response1 = rdsData.execute_statement(
resourceArn = cluster_arn,
secretArn = secret_arn,
database = 'mksambadb',
sql = 'select * from mytable')
print (response1)
- 実行結果は以下の通り。少し見にくいが、JSON形式でレコードの取得を行うことができた。
{'ResponseMetadata': {'RequestId': '4e69e984-c5b1-4f53-ac9a-dca6c1f37ce8', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '4e69e984-c5b1-4f53-ac9a-dca6c1f37ce8', 'content-type': 'application/json', 'content-length': '103', 'date': 'Sat, 17 Apr 2021 06:40:52 GMT'}, 'RetryAttempts': 0}, 'numberOfRecordsUpdated': 0, 'records': [[{'longValue': 0}, {'stringValue': '2021-04-17 05:41:29.695891'}]]}
6.所感
- 自動停止後、最初にアクセスする人が数十秒待たされるくらいであれば、開発・検証用途であれば許容範囲かなと思った。