皆様こんにちは。
今回はCloudFormationを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCloudFormationよりRDSの作成を行います。
このブログはCloudFormationによるRDSの作成をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。

1.高可用性アーキテクト構築目次

目次はこちら

2.RDSとは

Amazon Relational Database Service (Amazon RDS) は、AWS クラウド でリレーショナルデータベースを簡単にセットアップし、運用し、スケーリングすることのできるウェブサービスです。業界スタンダードのリレーショナルデータベース向けに、費用対効果に優れたエクステンションを備え、一般的なデータベース管理タスクを管理します。
引用:Amazon Relational Database Service (Amazon RDS) とは

今回は高可用性アーキテクトを構築していくうえで必要なデータベースとしてRDSをマルチAZ配置で利用します。
類似サービスとして「Amazon DynamoDB」、「Amazon Redshift」などがあげられます。

3.フロー図

file

マルチAZ配置で冗長化し、以下のフローで可用性を高めます。

  1. 障害が発生し、マスターのRDSが利用不可になります。
  2. フェイルオーバー(スレーブのRDSをマスターに昇格)し、処理をもう一台のRDSで引き継ぎます。

4.RDS構築

ではこれからRDSを構築していきましょう。
RDSの構築の全体のソースコードは下記の通りです。
ファイル名「ut-RDS-CF」

AWSTemplateFormatVersion: "2010-09-09"
Resources:
#サブネットグループ作成
  RDSSubnetGroup:
    Type: "AWS::RDS::DBSubnetGroup"
    Properties:
      DBSubnetGroupDescription: "dedicated to ut-rds"
      DBSubnetGroupName: "ut_dbsubnet"
      SubnetIds:
      - !ImportValue ut-prisubnet-1-id
      - !ImportValue ut-prisubnet-2-id
      Tags:
      -
        Key: "Name"
        Value: "ut_dbsubnet"

#RDSインスタンス作成
  RDSInstance:
    Type: "AWS::RDS::DBInstance"
    Properties:
      DBInstanceIdentifier: "ut-rds"
      DBInstanceClass: "db.t3.micro"
      Engine: "mysql"
      EngineVersion: "8.0.20"
      MasterUsername: "admin"
      MasterUserPassword: "xxxxx"
      DBName: "utrds"
      BackupRetentionPeriod: 0
      MultiAZ: true
      PubliclyAccessible: false
      StorageType: "gp2"
      AllocatedStorage: 20
      StorageEncrypted: true
      KmsKeyId: !ImportValue ut-KMS-Arn
      CopyTagsToSnapshot: false
      DeletionProtection: false
      DeleteAutomatedBackups: true
      DBSubnetGroupName: !Ref RDSSubnetGroup
      VPCSecurityGroups:
      - !ImportValue ut-SG-RDS-id
      Tags:
      -
        Key: "Name"
        Value: "ut-rds"

サブネットグループ作成部分のソースコードとRDS作成部分のソースコードをそれぞれ説明していきます。

4-1.サブネットグループ

RDSを作成する前にRDSで使用するサブネットグループを作成します。

4-2-1.サブネットグループとは

DB サブネットグループは VPC に作成するサブネット (通常はプライベート) のコレクションで、DB インスタンス用に指定します。DB サブネットグループを使用することにより、CLI または API を使用して DB インスタンスを作成するときに、特定の VPC を指定することができます。コンソールを使用する場合は、使用する VPC とサブネットを選択できます。
各 DB サブネットグループには、特定の AWS リージョン 内の少なくとも 2 つのアベイラビリティーゾーンにサブネットが必要です。
引用:DBサブネットグループの使用

4-2-2.サブネットグループ作成

サブネットグループには二つのプライベートサブネットを指定します。
ソースコードは下記の通りです。

#サブネットグループ作成
  RDSSubnetGroup:
    Type: "AWS::RDS::DBSubnetGroup"
    Properties:
      DBSubnetGroupDescription: "dedicated to ut-rds"
      DBSubnetGroupName: "ut_dbsubnet"
      SubnetIds: 
      - !ImportValue ut-prisubnet-1-id
      - !ImportValue ut-prisubnet-2-id
      Tags: 
      - 
        Key: "Name"
        Value: "ut_dbsubnet"

設定項目は下記の通りです。

使用するオプション 設定値 説明
DBSubnetGroupDescription dedicated to ut-rds サブネットグループの説明を入力
DBSubnetGroupName ut_dbsubnet 設定したいサブネットグループの名前を入力
SubnetIds !ImportValue ut-prisubnet-1-id
!ImportValue ut-prisubnet-2-id
二つのプライベートサブネットのIDを参照
Tags Key=Name,Value=ut_dbsubnet 設定したいタグを入力

これでサブネットグループ作成のソースコードの説明は以上です。

4-2.RDS作成

次はRDSを作成していきましょう。RDSの作成のソースコードは下記の通りです。

#RDSインスタンス作成
  RDSInstance:
    Type: "AWS::RDS::DBInstance"
    Properties:
      DBInstanceIdentifier: "ut-rds"
      DBInstanceClass: "db.t3.micro"
      Engine: "mysql"
      EngineVersion: "8.0.20"
      MasterUsername: "admin"
      MasterUserPassword: "xxxxx"
      DBName: "utrds"
      BackupRetentionPeriod: 0
      MultiAZ: true
      PubliclyAccessible: false
      StorageType: "gp2"
      AllocatedStorage: 20
      StorageEncrypted: true
      KmsKeyId: !ImportValue ut-KMS-Arn
      CopyTagsToSnapshot: false
      DeleteAutomatedBackups: true
      DBSubnetGroupName: !Ref RDSSubnetGroup
      VPCSecurityGroups: 
      - !ImportValue ut-SG-RDS-id
      Tags: 
      - 
        Key: "Name"
        Value: "ut-rds"

設定項目は下記の通りです。

使用するオプション 設定値 説明
DBInstanceIdentifier ut-rds 設定したいDBインスタンス識別子を入力
DBInstanceClass db.t3.micro DBインスタンスタイプを入力
Engine "mysql" 使用したいDBエンジンを入力
EngineVersion 8.0.20 設定したいエンジンのversionを入力
MasterUsername admin 設定したいマスターユーザー名を入力
MasterUserPassword xxxxx 設定したいDBパスワードを入力
DBName utrds 設定したいデータベース名を入力
BackupRetentionPeriod 0 今回は自動バックアップを利用しないので無効化
MultiAZ true 高可用性のためマルチAZを有効化
PubliclyAccessible false パブリックアクセスを無効化
AllocatedStorage 20 コストを考慮して最小値を入力
StorageEncrypted true 暗号化を有効に
KmsKeyId !ImportValue ut-KMS-Arn KMSのARNを参照
CopyTagsToSnapshot false 今回はスナップショットを作成しないので無効化
DeleteAutomatedBackups true RDS削除に生成されるスナップショットの自動削除を有効化
DBSubnetGroupName !Ref RDSSubnetGroup サブネットグループネームを参照
VPCSecurityGroups !ImportValue ut-SG-RDS-id RDS用のSGのidを参照
Tags Key=Name,Value=ut-rds 設定したいタグを入力

これでRDS作成のソースコードの説明は以上です。

5.RDS検証

スタック作成後、構築されたRDSが機能してるかの検証をしていきます。
作成したRDSがEC2から接続できるかのテストをしましょう。
※こちらの検証はEC2構築後に検証しています

①SSHでEC2に接続したら以下のコマンドでRDSに接続します。

mysql -h エンドポイント -P 3306 -u ユーザー名 -p データベース名

出力

Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [utrds]>

これでRDSに接続できました。

6.感想

RDS作成はオプションコマンドも多く作成が大変でしたがエラーなどは発生しないで作成完了することができてよかったです。

7.参照

AWS CloudFormation – AWS::RDS::DBSubnetGroup
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnet-group.html
AWS CloudFormation – AWS::RDS::DBInstance
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html

Last modified: 2022-06-22

Author