LoginSignup
8
11

More than 3 years have passed since last update.

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

Posted at

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. 構成図

auroraserverlessの図.png

5. 設定手順

5.1 Aurora Serverless DBの作成

  • Aurora ServerlessのDBを作成する。
  • マネージメントコンソールの「Amazon RDS - データベース - データベース作成」から以下の設定にて作成する。
    • エンジンのタイプ: Amazon Aurora
    • キャパシティータイプ: サーバーレス ※この選択により、Aurora Serverlessになる。
    • 数分間アイドル状態のままの場合、コンピューティング性能を一時停止する: チェックを入れる ※このチェックをONにしないと、自動停止機能が有効にならない(初期設定はOFF)。

as01a.png

as02a.png

as03a.png

  • 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個以上であれば起動している。)

as04a.png

  • 「ログとイベント」にて、起動/停止、スケールイン/アウトの履歴が確認できる。

as05a.png

  • 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として使うことができ、サイトにアクセスがない場合に自動停止が、停止中に再びアクセスした場合に自動起動が発生した。

as06a.png

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を有効化する。

as07a.png

5.4.3 マネージメントコンソールからのData API動作確認

  • マネージメントコンソールからData APIの動作を確認する。Amazon RDS - Query Editor を選択すると、DBへの接続情報を求められるため、今回作成したAurora Serverless DBの情報を入力する。

as08a.png

  • マネージメントコンソール上でSQLのクエリを実行することができる。

as09a.png

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11