🥰

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

2022/12/04に公開

構成

スクリーンショット 2022-12-04 4.12.16.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>

構築手順

1パラメータ入力

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

RDSインスタンス

スクリーンショット 2022-12-04 3.27.24.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

そもそも、サブネットグループって何だっけ?という方は次の記事をご参照ください。
<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新規作成手順" target="_blank rel="nofollow noopener"">CloudFormationスタック作成時の詳しい設定について</a>

3 最終確認

最終確認を行い送信を選択

4 正常終了確認

ステータスがCREATE_COMPLETEになったらスタック正常終了です。
スクリーンショット 2022-11-26 10.32.45.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>

Discussion