Cloudformation で RDS (Amazon Aurora MySQL ) からクローンを作成する

# はじめに
Amazon Auroraでは、既存のAuroraクラスターを素早く複製するクローン機能があります。
クローン機能を使い、CloudformationでAuroraを作成する方法についてまとめます。

# 事前準備
- Amazon Auroraを起動
    - エンジンバージョンは、`5.7.mysql_aurora.2.10.2`
    - ![スクリーンショット 2022-12-13 10.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/204a3adb-4dd2-4202-dcc4-c8ec2bb954ba.png)


# CloudFormationでスタックを作成
下記のymlファイルでスタックを作成します。

```yml
AWSTemplateFormatVersion: '2010-09-09'
Description: For each environment of project
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Clone source DB cluster information
        Parameters:
          - EngineType
          - MySQLMajorVersion
          - MySQLMinorVersion
          - CloneSourceDBCluster
      - Label:
          default: RDS Configuration
        Parameters:
          - DBInstanceClass
          - DBSubnetGroup
          - DBParameterGroup
          - DBClusterParameterGroup
          - DBSecurityGroup
          - DBInstanceIdentifierName
          - DBClusterIdentifierName

Parameters:
  EngineType:
    Type: String
    Description: Clone source DB cluster engine type.
    Default: aurora-mysql
  MySQLMajorVersion:
    Type: String
    Description: Clone source DB cluster mysql major version. For example 5.7
  MySQLMinorVersion:
    Type: String
    Description: Clone source DB cluster mysql minor version. For example 2.10.2
  CloneSourceDBCluster:
    Type: String
    Description: Clone source DB cluster name.
  DBInstanceClass:
    Type: String
    Default: db.t3.small
  DBSubnetGroup:
    Type: String
    Description: DB Subnet Group
  DBClusterParameterGroup:
    Type: String
    Description: DB Cluster Parameter Group
  DBParameterGroup:
    Type: String
    Description: DB instance Parameter Group
  DBSecurityGroup:
    Type: AWS::EC2::SecurityGroup::Id
    Description: Security Group ID
  DBInstanceIdentifierName:
    Type: String
    Description: DB instance identifier name
  DBClusterIdentifierName:
    Type: String
    Description: DB cluster identifier name

Resources:
  DBCluster:
    Type: AWS::RDS::DBCluster
    DeletionPolicy: Delete
    Properties:
      BackupRetentionPeriod: 7
      DBClusterIdentifier: !Ref DBClusterIdentifierName
      DBSubnetGroupName: !Ref DBSubnetGroup
      DBClusterParameterGroupName: !Ref DBClusterParameterGroup
      Engine: !Ref EngineType
      EngineVersion: !Sub ${MySQLMajorVersion}.mysql_aurora.${MySQLMinorVersion}
      EngineMode: provisioned
      VpcSecurityGroupIds:
        - !Ref DBSecurityGroup
      PreferredBackupWindow: 16:00-17:00
      DeletionProtection: false
      PreferredMaintenanceWindow: tue:18:00-tue:19:00
      SourceDBClusterIdentifier: !Ref CloneSourceDBCluster
      RestoreType: copy-on-write
      UseLatestRestorableTime: true

  DBInstance:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Delete
    Properties:
      DBClusterIdentifier: !Ref DBCluster
      DBInstanceIdentifier: !Ref DBInstanceIdentifierName
      DBInstanceClass: !Ref DBInstanceClass
      DBSubnetGroupName: !Ref DBSubnetGroup
      DBParameterGroupName: !Ref DBParameterGroup
      Engine: !Ref EngineType
      EngineVersion: !Sub ${MySQLMajorVersion}.mysql_aurora.${MySQLMinorVersion}
      PubliclyAccessible: false
      AvailabilityZone: !Sub ${AWS::Region}a
      AutoMinorVersionUpgrade: false
      EnablePerformanceInsights: false
      PreferredMaintenanceWindow: tue:18:00-tue:19:00
      PromotionTier: 1
      MonitoringInterval: 0
```



## ymlファイルの解説

ymlファイルは、AWSの公式ドキュメントがわかりやすかったので、参考にしました。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html

### 必須プロパティ
クローンを作成する上で必須のプロパティは、3つです。
- SourceDBClusterIdentifier
    - クローン元のクラスター識別子名
- RestoreType
    - `copy-on-write`は、クローン元からクローンとして復元されます。
- UseLatestRestorableTime
    - クラスターを最新の復元可能なバックアップ時刻に復元するかどうかを示す値。`true`にすることで、最新から復元する。

### 不要プロパティ
クローンを作成する上で、記載してはならないプロパティは、４つあります。
クローン元に依存するため、指定できないようです。
- MasterUsername
- MasterUserPassword
- SnapshotIdentifier
    - スナップショットからAuroraを作成（復元）する
- StorageEncrypted
    - DB クラスターを暗号化するかどうか

### 注意点
クローン元と作成するAuroraのエンジンバージョンは、同じにしてください。
今回の場合は、`5.7.mysql_aurora.2.10.2`です。
- Engine
- EngineVersion

## 入力するパラメータ
入力するパラメータは、結論から言うと、以下のようになります。
下記画像の上部の赤枠は、クローン元の情報であり`クローン元に依存するパラメータ`、
下部は、`作成するAuroraに関するパラメータ`を記載します。
![スクリーンショット 2022-12-13 10.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/37abe505-8802-98af-ce8d-24c0e1a89280.png)

### クローン元に依存するパラメータ
各パラメータで入力する値を説明していきます。

バージョンに関する３点は、クローン元と同じ値にします。
- EngineType
- MySQLMajorVersion
- MySQLMinorVersion

また、クローン元の識別子を以下のパラメータに記載します。
- CloneSourceDBCluster
![スクリーンショット 2022-12-13 10.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/204a3adb-4dd2-4202-dcc4-c8ec2bb954ba.png)

### 作成するAuroraに関するパラメータ
各パラメータは、自身の環境に合わせて記載しましょう。

- DBSubnetGroup
    ![スクリーンショット 2022-12-13 10.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f7048698-9b13-e991-8079-6fb974ab9564.png)
- DBParameterGroup
- DBClusterParameterGroup
    ![スクリーンショット 2022-12-13 10.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/52332782-22a9-de56-6367-5aefff44134c.png)
- DBSecurityGroup
    - Aurora用のセキュリティーグループのID
- DBInstanceIdentifierName
    - インスタンスの識別子名
- DBClusterIdentifierName
    - クラスターの識別子名

上記のパラメータからスタックを作成すると、`test`というクラスターからクローンが作成されました！

![スクリーンショット 2022-12-13 10.39.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/18d6d65d-15ff-7aa5-304e-c47f9bc7d8b0.png)