Aurora Serverless V2 を CDK v2 で構築できるか試してみたぞい！（2022/10/18版）

> 更新メモ
> - 2022/05/24 新規投稿
> - 2022/10/18 結論に CloudFormation/CDK の最新の状況を記載

2022年4月21日に、Amazon Aurora Serverless V2 の一般提供が開始されたので、遅ればせながら試してみました。

- [Amazon Web Servicfes ブログ：Amazon Aurora Serverless v2 の一般提供開始](https://aws.amazon.com/jp/blogs/news/amazon-aurora-serverless-v2-is-generally-available-instant-scaling-for-demanding-workloads/)

> Aurora Serverless（MySQL互換）の自力での構築は初めてなので、プロダクション環境を作るために必要なことを調べながら…という、まだまだ半端な内容が含まれますので、暖かく見守っていただければ。


# 結論

2022年5月24日時点（CDK v2.25.0）では Aurora Serverless V2 の構築は未対応の状況でした。

[(rds): support for Aurora Serverless V2 · Issue #20197 · aws/aws-cdk](https://github.com/aws/aws-cdk/issues/20197)

- インスタンスタイプに `SERVERLESS` という値を指定しないといけないけど、CDK v2 が対応していないため、ServerlessCluster ではなく、DatabaseCluster で無理やりインスタンスタイプを書き換える回避策が Issue の中で紹介されている（自分で試してはいない）

**（追記） 2022年10月18日時点**

- [2022年10月5日 CloudFormation がサポート開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/10/amazon-aurora-serverless-v2-supports-aws-cloudformation/)
- [CDK はプルリクのレビュー中、もうすぐリリースされるか！](https://github.com/aws/aws-cdk/pull/22446)

# 試した内容

## 利用したライブラリ

| ライブラリ名 | バージョン |
| --- | --- |
| aws-cdk-lib | 2.25.0 |


## 現時点の実装コード

とりあえず、Aurora Serverless V2 を構築してみようとしたけど、ダメだったので諦めて V1 を構築したコードを参考に貼っておく。

```tsx
import * as cdk from 'aws-cdk-lib';
import * as rds from 'aws-cdk-lib/aws-rds';

import * as env from './env'; // .env.xxx から環境設定を取得する自作部品

/**
 * Aurora Serverless V1 の定義
 *   - お試しなので VPC, Secret は省略して既定値に委ねる
 * @todo CDK が Aurora Serverless v2 を正式にサポートしたら修正する
 */
const auroraServerlessV1luster = (scope: Construct): rds.ServerlessCluster => {
  return new rds.ServerlessCluster(scope, 'ServerlessCluster', {
    // engine: rds.DatabaseClusterEngine.auroraMysql({
    //   version: rds.AuroraMysqlEngineVersion.of('8.0.mysql_aurora.3.02.0'),
    // }),
    engine: rds.DatabaseClusterEngine.AURORA_MYSQL,
    defaultDatabaseName: env.rdsDatabaseName(),
    enableDataApi: true,
    // 自動バックアップの保持期間
    backupRetention: env.rdsBackupRetention(),
    // キャパシティ
    scaling: {
      autoPause: cdk.Duration.hours(1), // V2だったら 0 を指定するけど、現状は V1 なので1時間で自動停止
      minCapacity: rds.AuroraCapacityUnit.ACU_1,
      maxCapacity: rds.AuroraCapacityUnit.ACU_2,
    },
    // Aurora MySQL のパラメータ
    parameterGroup: new rds.ParameterGroup(scope, 'ParameterGroup', {
      engine: rds.DatabaseClusterEngine.AURORA_MYSQL,
      parameters: {
        // 文字コードの構成：UTF-8 の 4 バイト文字を有効化
        character_set_client: 'utf8mb4',
        character_set_connection: 'utf8mb4',
        character_set_database: 'utf8mb4',
        character_set_results: 'utf8mb4',
        character_set_server: 'utf8mb4',
        collation_connection: 'utf8mb4_bin',
        collation_server: 'utf8mb4_bin',
        // 一般ログの構成
        general_log: '1', // 一般ログを有効化（既定値：0）
        // スロークエリログの構成
        // @see https://dev.mysql.com/doc/refman/8.0/ja/slow-query-log.html
        // log_queries_not_using_indexes: '1',
        // log_output: 'TABLE',
        long_query_time: '3', // 指定時間（秒）を超えるクエリをログ出力（既定値:10秒）
        slow_query_log: '1', // スロークエリログを有効化（既定値：0）
        // 監査ログの構成
        server_audit_events: 'CONNECT,QUERY,QUERY_DCL,QUERY_DDL,QUERY_DML,TABLE', // 監査対象イベント（既定値：なし）
        server_audit_logging: '1', // 監査ログの有効化
        server_audit_logs_upload: '1', // 監査ログの CloudWatch Logs へのアップロードを有効化
        // タイムゾーンの構成：日本
        time_zone: 'Asia/Tokyo',
      },
    }),
    // アンデプロイ時の処理
    removalPolicy: env.removalPolicy(),
  });
};
```

- `AuroraMysqlEngineVersion` が定義している MySQL バージョンの値にも `8.0.mysql_aurora.3.02.0` に対応する値が未定義
- `AuroraCapacityUnit` が定義しているキャパシティユニットの最小値にも `0.5` に対応する値が未定義
- 以下を参考に、各種ログを CloudWatch Logs に出力するようにしてみたけど、構築された環境ではログ保持期間が「失効しない」になっている。ログ保持期間も運用ポリシーに合わせて CDK で設定する方法を継続して調べて見る予定
  - [DevelopersIO: Aurora ServerlessでログをCloudWatch Logsへ出力可能になりました](https://dev.classmethod.jp/articles/uploading-to-cloudwatch-aurora-serverless/)


# 最後に

CDK が Aurora Serverless V2 に対応したら、内容を更新しますぞ〜。


以上。