CFnで AuroraServerless v2 が利用可能になったので構築してみた

## 概要
2022/10/5 から AuroraServerless v2 が利用可能となりました。
https://aws.amazon.com/jp/about-aws/whats-new/2022/10/amazon-aurora-serverless-v2-supports-aws-cloudformation/

ちょうど案件でAuroraServerless v2の構築依頼が来ていたのでタイミングがバッチリでした🙌

## 作成されるリソース
- セキュリティーグループ
- クラスターパラメータグループ (time_zone のみ 日本に変更 他デフォルト)
- DBパラメータグループ (デフォルト)
- サブネットグループ
- Aurora Serverless v2 クラスター
    - Aurora Serverless インスタンス
    - マスターユーザー
    - キャパシティ (v2の場合 MinCapacityは0.5から選択可能)

## CFnテンプレート
```aurora-serverless-v2.yaml
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  NamePrefix:
    Type: String
  VpcId:
    Description: VPC ID
    Type: AWS::EC2::VPC::Id
  SgAllowIP:
    Description: AP VPC subnet
    Type: String
    Default: 10.0.0.0/16
  RdsDbMasterUsername:
    Description: RdsDbMasterUsername
    Type: String
  RdsDbMasterUserPassword:
    Description: RdsDbMasterUserPassword
    Type: String
    NoEcho: true
  MinCapacity: 
    Type: String
  MaxCapacity: 
    Type: String
  Subnets:
    Type: List<AWS::EC2::Subnet::Id>

Resources:
  RdsDbSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupName: !Sub ${NamePrefix}-sub-gp
      DBSubnetGroupDescription: !Sub ${NamePrefix}-sub-gp
      SubnetIds: !Ref 'Subnets'

  RdsSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Sub ${NamePrefix}-sg
      GroupDescription: !Sub ${NamePrefix}-sg
      VpcId: !Ref 'VpcId'
      GroupDescription: Allow MySQL (TCP3306)
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIp: !Ref 'SgAllowIP'

  RdsDbClusterParameterGroup:
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: CloudFormation Aurora Cluster Parameter Group
      Family: aurora-mysql8.0
      Parameters: 
          time_zone: Asia/Tokyo
      Tags: 
          - Key: Name
            Value: !Sub ${NamePrefix}-pg

  RdsDbClusterParameterGroup:
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: CloudFormation Aurora Cluster Parameter Group
      Family: aurora-mysql8.0
      Parameters: 
          time_zone: Asia/Tokyo
      Tags: 
          - Key: Name
            Value: !Sub ${NamePrefix}-cl-pg

  RdsDbParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: CloudFormation Aurora Cluster Parameter Group
      Family: aurora-mysql8.0
      Tags: 
          - Key: Name
            Value: !Sub ${NamePrefix}-pg

# Aurora Serverless v2 is supported by AWS CloudFormation starting 10/5/2022.
# https://aws.amazon.com/jp/about-aws/whats-new/2022/10/amazon-aurora-serverless-v2-supports-aws-cloudformation/
  RdsDbCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      BackupRetentionPeriod: 7
      DBClusterIdentifier: !Ref 'NamePrefix'
      DBClusterParameterGroupName: !Ref 'RdsDbClusterParameterGroup'
      DBSubnetGroupName: !Ref 'RdsDbSubnetGroup'
      Engine: aurora-mysql
      EngineVersion: 8.0.mysql_aurora.3.02.1
      ServerlessV2ScalingConfiguration: 
        MinCapacity: !Ref MinCapacity
        MaxCapacity: !Ref MaxCapacity
      MasterUsername: !Ref 'RdsDbMasterUsername'
      MasterUserPassword: !Ref 'RdsDbMasterUserPassword'
      Port: 3306
      PreferredBackupWindow: 21:00-21:30
      PreferredMaintenanceWindow: Tue:20:00-Tue:20:30
      StorageEncrypted: true
      VpcSecurityGroupIds:
        - !Ref 'RdsSecurityGroup'
  DBInstance:
    Type: 'AWS::RDS::DBInstance'
    Properties:
      DBClusterIdentifier:
        Ref: RdsDbCluster
      DBInstanceIdentifier: !Ref 'NamePrefix'
      Engine: aurora-mysql
      EngineVersion: 8.0.mysql_aurora.3.02.1
      DBInstanceClass: db.serverless
      DBParameterGroupName: !Ref RdsDbParameterGroup
```

## ハマりポイント
[AWSの記事](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#aws-resource-rds-dbcluster--examples
) にも記載例があったので試してみるとクラスターしか構築されず、インスタンスが0のままとなりハマってました。
```example-serverless-v2.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: ServerlessV2 Cluster
Parameters:
  MasterUsername:
    Type: String
  MasterUserPassword:
    Type: String
    NoEcho: true
  DBClusterIdentifier:
    Type: String
  MinCapacity:
    Type: String
  MaxCapacity:
    Type: String
Resources:
  RDSDBCluster:
    Type: 'AWS::RDS::DBCluster'
    DeletionPolicy: Delete
    Properties:
      Engine: aurora-mysql
      MasterUsername: !Ref MasterUsername
      MasterUserPassword: !Ref MasterUserPassword
      ServerlessV2ScalingConfiguration:
        MinCapacity: !Ref MinCapacity
        MaxCapacity: !Ref MaxCapacity
```
※上記テンプレートの場合クラスターしか作成されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233935/2f545198-b879-4842-c64f-589bc929c28a.png)

色々試してみると、 リソースに `Type: 'AWS::RDS::DBInstance'` が必要でした。
v1の時は `AWS::RDS::DBInstance` は不要だったと思うのですが v2はAurora同様にDBInstanceのリソースが必要とでした。
※v2の詳細を理解できていないので宿題とします📝


DBInstanceのリソースには `DBInstanceClass` の指定が必要で `db.serverless` という特殊なインスタンスクラスを指定する必要があります。
> レイヤーに 1 つ以上の Aurora Serverless v2 DB インスタンスを追加します。DB クラスターに Aurora レプリカを追加する の一般的な手順に従います。新しい DB インスタンスごとに、AWS Management Console では サーバーレス、AWS CLI では db.serverless という特別な DB インスタンスクラス名、または Amazon RDS API を指定します。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.upgrade.html

また `AWS::RDS::DBCluster` のリソースで明示的に `EngineVersion: 8.0.mysql_aurora.3.02.1`  を指定しないとデフォルトでmysql5.7系となりエラーになってしまうので、DBClusterとDBInstanceのどちらも `EngineVersion` の指定が必要でした。