【初心者】Amazon Aurora Serverless (v1) を使ってみる


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.所感

  • 自動停止後、最初にアクセスする人が数十秒待たされるくらいであれば、開発・検証用途であれば許容範囲かなと思った。