CloudFormationで暗号化されたシングルAZのRDSを構築する方法

## 構成
![スクリーンショット 2022-12-04 4.12.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/bb1ffc19-b3e9-06ff-59a8-02df901e4af0.png)


## 完成したテンプレート
```:テンプレート
AWSTemplateFormatVersion: 2010-09-09
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: RdsInstance
        Parameters:
          - DBName
          - DBInstanceClass
          - DBAllocatedStorage
          - Engine
          - EngineVersion
          - DBUsername
          - DBPassword
          - AvailabilityZone
          - DeletionProtection
          - StorageType
          - CopyTagsToSnapshot
          - KmsKeyArn
          - VPCSecurityGroups
      -
        Label:
          default: RdsSubnetGroup
        Parameters:
          - DBSubnetGroupName
          - SubnetidA
          - SubnetidC

Parameters:
  DBName:
    Default: 'cf-rds'
    Type: String

  DBInstanceClass:
    Default: db.t3.micro
    Type: String

  DBAllocatedStorage:
    Default: '20'
    Description: The size of the database (GiB)
    Type: Number
    MinValue: '20'
    MaxValue: '20'

  Engine:
    Type: String
    AllowedValues:
      - mysql
      - postgres
    Default: 'mysql'

  EngineVersion:
    Type: String
    AllowedValues:
      - '8.0.28'
    Default: '8.0.28'
  DBUsername:
    NoEcho: 'true'
    Type: String
    # 文字数制限
    MinLength: '1'
    MaxLength: '16'
    AllowedPattern: '[a-zA-Z0-9]*'

  DBPassword:
    NoEcho: 'true'
    Type: String
    MinLength: '8'
    MaxLength: '41'

  DeletionProtection:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
    Default: 'false'
  
  StorageType:
    Type: String
    AllowedValues:
      - 'gp2'
      - 'gp3'
    Default: 'gp2'
  
  CopyTagsToSnapshot:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
    Default: 'false'
  
  KmsKeyArn:
    NoEcho: 'true'
    Type: String
    Default: ''
  
  VPCSecurityGroups:
    Type: AWS::EC2::SecurityGroup::Id
  
  AvailabilityZone:
    Type: AWS::EC2::AvailabilityZone::Name
# サブネットグループ
  DBSubnetGroupName:
    Type: String
    Default: 'DBSubnetGroupName'
  
  SubnetidA:
    Type: AWS::EC2::Subnet::Id

  SubnetidC:
    Type: AWS::EC2::Subnet::Id

Resources:
# RDSインスタンス作成
  MyDB:
    Type: 'AWS::RDS::DBInstance'
    DeletionPolicy: Delete
    Properties:
      DBInstanceIdentifier: !Ref DBName
      DBInstanceClass: !Ref DBInstanceClass
      AllocatedStorage: !Ref DBAllocatedStorage
      Engine: !Ref Engine
      EngineVersion: !Ref EngineVersion
      MasterUsername: !Ref DBUsername
      MasterUserPassword: !Ref DBPassword
      PubliclyAccessible: false
      AvailabilityZone: !Ref AvailabilityZone
      StorageType: !Ref StorageType
      KmsKeyId: !Ref KmsKeyArn
      # 自動バックアップの無効化
      BackupRetentionPeriod: 0
      # シングルAZ
      MultiAZ: 'false'
      # DB暗号化
      StorageEncrypted: true
      DeletionProtection: !Ref DeletionProtection
      CopyTagsToSnapshot: !Ref CopyTagsToSnapshot
      DBSubnetGroupName: !Ref RDSSubnetGroup
      VPCSecurityGroups:
        - !Ref VPCSecurityGroups
#サブネットグループ作成
  RDSSubnetGroup:
    Type: "AWS::RDS::DBSubnetGroup"
    Properties:
      DBSubnetGroupDescription: !Ref DBSubnetGroupName
      DBSubnetGroupName: !Ref DBSubnetGroupName
      SubnetIds: 
      - !Ref SubnetidA
      - !Ref SubnetidC
```

CloudFormationで新規スタックを作成する方法の詳細は次の記事をご参照下さい。
<a href="https://qiita.com/kazunobu2211/items/3fd42d5482a3331332d0" rel="nofollow noopener" target="_blank">CloudFormationで新規スタックを作成する方法</a>


今回はYAMLで作成しておりますので、JSONに変換したい方は次の記事をご参照下さい。
<a href="https://qiita.com/kazunobu2211/items/49deda949e97ea86bbf4" rel="nofollow noopener" target="_blank">YAMLからJSONに変換する方法</a>

## 構築手順

###  １パラメータ入力 
各パラメータを入力します。`スタックの名前は任意の名前を入れる`

#### RDSインスタンス
![スクリーンショット 2022-12-04 3.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/0d025e4a-8e7b-048c-4ec0-98034de2b360.png)
|パラメータ名|用途|備考|
|-|-|-|
|DBInstanceIdentifier|DB識別子|例：CF-Mysql|
|DBInstanceClass|RDSインスタンスクラス|例：db.t3.micro|
|DBAllocatedStorage|DBに割り当てられるストレージの量(単位:GiB)|例：20|
|Engine|DBインスタンスで使用するデータベースエンジン|例：mysql|
|EngineVersion|使用するデータベースエンジンのバージョン|例：8.0.28|
|DBUsername|DBのマスターユーザー名|例：kazunobu|
|DBPassword|DBのマスターユーザーのパスワード|8文字以上|
|AvailabilityZone|DBインスタンスを起動させるAZ||
|DeletionProtection|DBインスタンスが削除保護が有効になっているかどうか|trueかfalse|
|StorageType|DBインスタンスに関連付けられるストレージタイプ|例：gp2|
|CopyTagsToSnapshot|スナップショットにタグをコピーするかどうか|trueかfalse|
|KmsKeyArn|暗号化に使用されるAWS KMSキーのARN|事前に作成が必要|
|VPCSecurityGroups|DBインスタンスに割り当てるセキュリティグループ|事前に作成が必要|


#### サブネットグループ
![スクリーンショット 2022-12-04 3.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/ba32a1f8-610c-6318-735c-19431c0d1a53.png)

そもそも、サブネットグループって何だっけ？という方は次の記事をご参照ください。
<a href="https://qiita.com/kazunobu2211/items/ac8062b2458023eaeb88" rel="nofollow noopener" target="_blank">サブネットグループとは</a>
|パラメータ名|用途|備考|
|-|-|-|
|DBSubnetGroupName|サブネットグループの名前|例：CF-SubnetGroup|
|SubnetidA|サブネットを選択|SubnetidCとは異なるAZのサブネットを選択|
|SubnetidC|サブネットを選択|SubnetidAとは異なるAZのサブネットを選択|

### 2 CloudFormation詳細設定 
次へを選択。`CloudFormationスタック作成時の詳しい設定`について次の記事をご参照ください。
<a href="https://qiita.com/kazunobu2211/items/3fd42d5482a3331332d0#cloudformation%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86" target="_blank rel="nofollow noopener"">CloudFormationスタック作成時の詳しい設定について</a>

### 3 最終確認
最終確認を行い`送信`を選択

### 4 正常終了確認 
ステータスがCREATE_COMPLETEになったらスタック正常終了です。
![スクリーンショット 2022-11-26 10.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/dd61219e-6c23-d7e7-5b71-7f2886888f89.png)

## 参考にしたサイト
<a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-deletionprotection" target="_blank rel="nofollow noopener"">CloudFormation RDSAWS公式</a>
<a href="https://cloud5.jp/cf-rds/" target="_blank rel="nofollow noopener"">CloudFormationによる【RDS】の構築 - 協栄情報ブログ</a>