CFNでマルチAZ配置のRDSを作成する

CloudFormationを使用してマルチAZ配置のRDSを作成する

CloudFormationを使用して、マルチAZ配置のRDSを作成する

RDSが提供する機能の1つにマルチAZ配置があります。

Amazon RDS マルチ AZ 配置では、Amazon RDS はプライマリデータベース (DB) インスタンスを自動的に作成し、データを別の AZ のインスタンスに同期的にレプリケートします。障害を検出すると、Amazon RDS は手動の介入なしにスタンバイインスタンスに自動的にフェイルオーバーします。

Amazon RDS マルチ AZ

本ページでは、CloudFormationを使用して、マルチAZ配置を有効化したRDSを作成します。

構築する環境

Diagram of RDS Multi-AZ deployment using CloudFormation.

RDS DBインスタンスを作成します。
MySQLタイプのDBインスタンスを作成します。
そしてマルチAZ配置を有効化します。

EC2インスタンスも作成します。
DBインスタンスに接続するクライアントとして使用します。
インスタンスは最新版のAmazon Linux 2です。

2種類のVPCエンドポイントを作成します。

1つ目はSSM用です。
SSM Session Managerを使用して、プライベートサブネット内のEC2インスタンスに接続するためです。

2つ目はS3用です。
S3バケット上に構築されたyumリポジトリにアクセスするためです。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/110

テンプレートファイルのポイント解説

RDS

Resources:
  DBInstance:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Delete
    Properties:
      AllocatedStorage: !Ref DBAllocatedStorage
      #AvailabilityZone:
      DBInstanceClass: !Ref DBInstanceClass
      DBInstanceIdentifier: dbinstance
      DBSubnetGroupName: !Ref DBSubnetGroup
      Engine: !Ref DBEngine
      EngineVersion: !Ref DBEngineVersion
      MasterUsername: !Ref DBMasterUsername
      MasterUserPassword: !Ref DBMasterUserPassword
      MultiAZ: true
      VPCSecurityGroups:
        - !Ref DBSecurityGroup
Code language: YAML (yaml)

DBインスタンスをマルチAZ配置するためには、MultiAZプロパティで設定を行います。
本プロパティに「true」を設定することで、マルチAZ配置が有効化されます。

なおマルチAZ配置を有効化する上での注意点があります。

You can’t set the AvailabilityZone parameter if the MultiAZ parameter is set to true.

AWS::RDS::DBInstance

上記に従い、AvailabilityZoneプロパティは設定しません。

(参考) EC2インスタンス

Resources:
  Instance:
    Type: AWS::EC2::Instance
    Properties:
      IamInstanceProfile: !Ref InstanceProfile
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref InstanceSubnet
          GroupSet:
            - !Ref InstanceSecurityGroup
      UserData: !Base64 |
        #!/bin/bash -xe
        yum update -y
        yum install -y mariadb
Code language: YAML (yaml)

EC2インスタンスからDBインスタンスにアクセスするために、クライアントパッケージを準備する必要があります。
今回はユーザデータを使用して、パッケージをインストールします。

ユーザデータに関する詳細については、以下のページをご確認ください。

https://awstut.com/2021/12/02/ec2-init-4ways

Amazon Linux 2から各種RDSに接続するためのクライアントパッケージについては、以下のページをご確認ください。

https://awstut.com/2022/03/21/al2-connect-to-all-rds

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • EC2インスタンス:i-06419d1a3dc94757c
  • DBインスタンスのID:dbinstance
  • DBインスタンスのエンドポイントのDNS名:dbinstance.cl50iikpthxs.ap-northeast-1.rds.amazonaws.com

AWS Management Consoleから各リソースを確認します。

RDSを確認します。

Detail of RDS 1.

確かにDBインスタンスが作成されていることがわかります。
プライマリインスタンスはap-northeast-1a側のサブネットに配置されていることがわかります。

より詳細な設定を確認します。

Detail of RDS 2.

マルチAZ配置が有効化されていることがわかります。
そしてスタンバイインスタンスがap-northeast-1d側のサブネットに配置されていることもわかります。

動作確認

プライマリインスタンスにアクセス

EC2インスタンスからプライマリインスタンスに接続します。
EC2インスタンスへのアクセスはSSM Session Managerを使用します。

% aws ssm start-session --target i-06419d1a3dc94757c
...
sh-4.2$
Code language: Bash (bash)

SSM Session Managerの詳細につきましては、以下のページをご確認ください。

https://awstut.com/en/2021/12/11/accessing-a-linux-instance-via-ssm-session-manager

ユーザーデータによるEC2インスタンスの初期化処理の実行状況を確認します。

sh-4.2$ sudo yum list installed | grep mariadb
mariadb.aarch64                       1:5.5.68-1.amzn2                 @amzn2-core
mariadb-libs.aarch64                  1:5.5.68-1.amzn2                 installed

sh-4.2$ mysql -V
mysql  Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (aarch64) using readline 5.1
Code language: Bash (bash)

正常にMySQLクライアントパッケージがインストールされていることがわかります。

このクライアントパッケージを使用して、DBインスタンスに接続します。

sh-4.2$ mysql -h dbinstance.cl50iikpthxs.ap-northeast-1.rds.amazonaws.com  -P 3306 -u testuser -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.28 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 [(none)]>
Code language: Bash (bash)

接続できました。

試しにテスト用データベースおよびテーブルを作成し、テストデータを保存します。

MySQL [(none)]> CREATE database test;

MySQL [(none)]> use test;

MySQL [test]> CREATE TABLE planet (id INT UNSIGNED AUTO_INCREMENT, name VARCHAR(30), PRIMARY KEY(id));

MySQL [test]> INSERT INTO planet (name) VALUES ("Mercury");
MySQL [test]> INSERT INTO planet (name) VALUES ("Venus");
MySQL [test]> INSERT INTO planet (name) VALUES ("Earth");
MySQL [test]> INSERT INTO planet (name) VALUES ("Mars");
MySQL [test]> INSERT INTO planet (name) VALUES ("Jupiter");
MySQL [test]> INSERT INTO planet (name) VALUES ("Saturn");
MySQL [test]> INSERT INTO planet (name) VALUES ("Uranus");
MySQL [test]> INSERT INTO planet (name) VALUES ("Neptune");

MySQL [test]> select * from planet;
+----+---------+
| id | name    |
+----+---------+
|  1 | Mercury |
|  2 | Venus   |
|  3 | Earth   |
|  4 | Mars    |
|  5 | Jupiter |
|  6 | Saturn  |
|  7 | Uranus  |
|  8 | Neptune |
+----+---------+
Code language: Bash (bash)

正常に動作しました。

スタンバイインスタンスの昇格

プライマリインスタンスからスタンバイインスタンスにフェイルオーバーさせます。
具体的には、インスタンスクラスを「db.t4g.micro」「db.t4g.small」に変更してフェイルオーバーさせます。

Detail of RDS 3.

インスタンスクラスの変更完了後、ログを確認します。

Detail of RDS 6.

インスタンスクラスの変更に伴い、マルチAZ配置されているインスタンス間でフェイルオーバーが発生したことがわかります。

改めてインスタンスの詳細を確認します。

Detail of RDS 4.
Detail of RDS 5.

エンドポイントのDNS名等はフェイルオーバー前から変更されていません。
プライマリインスタンスがap-northeast-1d側のサブネットに配置されています。
そして引き続きマルチAZ配置が有効化されており、スタンバイインスタンスがap-northeast-1a側のサブネットに配置されています。

このようにプライマリインスタンスに障害等が発生した場合は、自動的にスタンバイインスタンスにフェイルオーバーされます。

新プライマリインスタンスにアクセス

改めて新プライマリインスタンスにアクセスし、保存されているデータを確認します。

sh-4.2$ mysql -h dbinstance.cl50iikpthxs.ap-northeast-1.rds.amazonaws.com  -P 3306 -u testuser -p
Enter password:
...

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+


MySQL [(none)]> use test;

MySQL [test]> select * from planet;
+----+---------+
| id | name    |
+----+---------+
|  1 | Mercury |
|  2 | Venus   |
|  3 | Earth   |
|  4 | Mars    |
|  5 | Jupiter |
|  6 | Saturn  |
|  7 | Uranus  |
|  8 | Neptune |
+----+---------+
Code language: Bash (bash)

確かにフェイルオーバー前に保存したデータが表示されました。
このことから、マルチAZ配置された2台のインスタンスでは、データがレプリケーションされており、フェイルオーバーした後も、データが引き継がれるということがわかります。

まとめ

CloudFormationを使用して、マルチAZ配置を有効化したRDSを作成しました。