CloudFormationを使用して、マルチAZ配置のRDSを作成する
RDSが提供する機能の1つにマルチAZ配置があります。
Amazon RDS マルチ AZ 配置では、Amazon RDS はプライマリデータベース (DB) インスタンスを自動的に作成し、データを別の AZ のインスタンスに同期的にレプリケートします。障害を検出すると、Amazon RDS は手動の介入なしにスタンバイインスタンスに自動的にフェイルオーバーします。
Amazon RDS マルチ AZ
本ページでは、CloudFormationを使用して、マルチAZ配置を有効化したRDSを作成します。
構築する環境
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インスタンスにアクセスするために、クライアントパッケージを準備する必要があります。
今回はユーザデータを使用して、パッケージをインストールします。
ユーザデータに関する詳細については、以下のページをご確認ください。
Amazon Linux 2から各種RDSに接続するためのクライアントパッケージについては、以下のページをご確認ください。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- EC2インスタンス:i-06419d1a3dc94757c
- DBインスタンスのID:dbinstance
- DBインスタンスのエンドポイントのDNS名:dbinstance.cl50iikpthxs.ap-northeast-1.rds.amazonaws.com
AWS Management Consoleから各リソースを確認します。
RDSを確認します。
確かにDBインスタンスが作成されていることがわかります。
プライマリインスタンスはap-northeast-1a側のサブネットに配置されていることがわかります。
より詳細な設定を確認します。
マルチ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の詳細につきましては、以下のページをご確認ください。
ユーザーデータによる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」に変更してフェイルオーバーさせます。
インスタンスクラスの変更完了後、ログを確認します。
インスタンスクラスの変更に伴い、マルチAZ配置されているインスタンス間でフェイルオーバーが発生したことがわかります。
改めてインスタンスの詳細を確認します。
エンドポイントの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を作成しました。