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

# 1. 目的
- AWSのデータベース関連サービスの復習をしている。Aurora Serverless について、「使ってない時に勝手に停止するDBらしい」程度の認識しかなかったため、実際に使ってみてもう少し理解を深める。

# 2. Amazon Aurora Serverless とは（自分の理解）
- RDSなどと同じく、AWSマネージドのRDBだが、自動でスケールイン・アウトするなどよりマネージドの範囲が増えているもの。
- 類似サービス(RDS, Aurora)との比較はこちらのサイトを参照。
    - [Aurora Serverlessを実際に使ってみたメリットとデメリット](https://service.plan-b.co.jp/blog/tech/28232/)
- 2021/4現在、GAされているものは「v1」とされており、機能拡張版の「v2」がpreview提供されている。今回は基本を学ぶため、普通の「v1」を使用する。

# 3. やったこと

- Aurora ServerlessのDBを作成する。
- 自動起動／自動停止の動作を確認し、停止状態から何秒くらいで起動するのか測定する。
- ユースケースとして、WordPressのバックエンドとして使ってみる。
- Data APIを有効化し、Lambda関数からのクエリを実行する。

# 4. 構成図

![auroraserverlessの図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/aabdbd6c-6ce5-70b9-442c-65869007d040.png)

# 5. 設定手順

## 5.1 Aurora Serverless DBの作成

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

![as01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/92135501-01ce-76ef-75c6-04fa1941bc82.png)

![as02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/0a7d6587-0b41-0b2b-c90d-1dcd5bf1a01c.png)

![as03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/22b13404-4a4c-f651-66d5-752d5aa08c5c.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/525b866a-4ca0-1c3a-fe03-0929e53430e6.png)

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

![as05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/76931257-fe9a-bb09-0f3d-0ae43a092d6f.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 ブログのホスト](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/hosting-wordpress.html)」に従い、WordPressサイトを構築する。
- 上記の手順ではEC2インスタンス内にMySQLをインストールしているが、その部分の手順のみAurora Serverless DBを使用するよう変更する。
- 自前のMySQLやRDS同様、普通にバックエンドDBとして使うことができ、サイトにアクセスがない場合に自動停止が、停止中に再びアクセスした場合に自動起動が発生した。

![as06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/be988a47-d3a8-b817-4397-46e9b0f5c5ac.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/abc4dd3b-084f-6050-6ca4-22158910dcb5.png)

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

![as08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1a3e99cd-5205-b7d0-8c59-89c916844733.png)

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

![as09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5faae929-14c0-39fa-6786-351a1737b7cd.png)

### 5.4.4 Lambda関数からのData API利用

- Lambdaなど外部からのData API経由でのアクセスを行うため、Secret ManagerにDBのID/Passwordを登録する。手順は別記事「[【初心者】AWS Secrets Manager と AWS Systems Manager Parameter Store を使ってみる](https://qiita.com/mksamba/items/0080a342de180120073b)」参照。

- 以下の内容を含むLambda関数を作成する。
    - Secret Managerから、Aurora Serverless DBに接続するためのID/Passwordを取得
    - Data API経由でAurora Serverless DBに接続し、select文を実行
    
- コードはAWS公式「[Aurora Serverless の Data API の使用](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/data-api.html)」内のサンプルをそのままコピペする。
- 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.所感
- 自動停止後、最初にアクセスする人が数十秒待たされるくらいであれば、開発・検証用途であれば許容範囲かなと思った。