RDS のリードレプリカを作成する AZ は指定できますか?
困っていた内容
RDS のリードレプリカを作成する際、配置する AZ を自分で選択することは可能でしょうか。
また、自動で選択される場合、その選択基準のようなものはありますか。
回答
リードレプリカをシングル AZ 構成で作成する場合は、AZ を指定できます。
一方、マルチ AZ 構成で作成する場合は AZ を指定できません。この場合、プライマリ/スタンバイをどの AZ に配置するかは Amazon RDS がランダムに決定します。[1]
なお、AZ を指定しなかった場合は、DB サブネットグループに含まれる AZ の中から RDS が自動的に選択します。[2]
そのため「必ずこのAZに置きたい」という要件がある場合は、
シングル AZ 構成としたうえで、--availability-zone を明示的にご指定ください。
参考資料
[1]リージョン、アベイラビリティーゾーン、および Local Zones - Amazon Relational Database Service
マルチ AZ DB デプロイで、プライマリ DB インスタンスとセカンダリ DB インスタンスのアベイラビリティーゾーンを選択することはできません。Amazon RDS によってランダムに選択されます。
[2] VPC 内の DB インスタンスの使用 - DB サブネットグループの使用
DB サブネットグループから、Amazon RDS は DB インスタンスに関連付けるサブネットとそのサブネット内の IP アドレスを選択します。DB は、そのサブネットを含むアベイラビリティーゾーンを使用します。
(補足)検証してみた
検証環境の準備
前提として、以下は事前に用意済みとします(作成手順の詳細は割愛します)。
- VPC、および AZ が異なるサブネット(今回は ap-northeast-1a / 1c / 1d)
- 上記サブネットを含む DB サブネットグループ(yutaka-test-db-subnetgroup)
- DB 用の セキュリティグループ
ソース DB インスタンスの作成
リードレプリカの元になるDBインスタンスを、検証用に最小構成(db.t3.micro / 20GiB / シングルAZ)で作成します。
REGION=ap-northeast-1
SOURCE_ID=yutaka-test-db
SUBNET_GROUP=yutaka-test-db-subnetgroup
SG_ID=sg-xxxxxxxxxxxxxxxxx
$ aws rds create-db-instance \
--db-instance-identifier $SOURCE_ID \
--db-instance-class db.t3.micro \
--engine mysql \
--engine-version 8.4.9 \
--master-username admin \
--master-user-password 'XXXXXXXXXXXXXXXXXX' \
--allocated-storage 20 \
--storage-type gp3 \
--db-subnet-group-name $SUBNET_GROUP \
--vpc-security-group-ids $SG_ID \
--no-multi-az \
--no-publicly-accessible \
--backup-retention-period 1 \
--region $REGION

サブネットグループに登録されている AZ を確認
レプリカが配置され得る AZ(=DBサブネットグループが持つAZ)を確認します。
$ aws rds describe-db-subnet-groups \
--db-subnet-group-name $SUBNET_GROUP \
--region $REGION \
--query 'DBSubnetGroups[0].Subnets[].{AZ:SubnetAvailabilityZone.Name,Subnet:SubnetIdentifier}' \
--output table
ap-northeast-1a / 1c / 1d の 3 つが登録されていることを確認できました。
-------------------------------------------------
| DescribeDBSubnetGroups |
+------------------+----------------------------+
| AZ | Subnet |
+------------------+----------------------------+
| ap-northeast-1d | subnet-xxxxxxxxxxxxxxx1d |
| ap-northeast-1a | subnet-xxxxxxxxxxxxxxx1a |
| ap-northeast-1c | subnet-xxxxxxxxxxxxxxx1c |
+------------------+----------------------------+
リードレプリカを作成できるのは、ここに出力された AZ の範囲内のみです。
配置したい AZ のサブネットがサブネットグループに含まれていない場合は、先にサブネットグループを修正する必要があります。
パターン①:Multi-AZ + AZ指定
まず、リードレプリカを作成時、マルチ AZ 構成と AZ 指定を同時に行えるか確認します。
ドキュメントのとおりであれば AZ 指定はできないため、エラーになることが想定されます。
$ aws rds create-db-instance-read-replica \
--db-instance-identifier test-replica-multiaz-az \
--source-db-instance-identifier $SOURCE_ID \
--multi-az \
--availability-zone ap-northeast-1a \
--region $REGION
結果、想定どおりエラーになりました。InvalidParameterCombination として、「Multi-AZインスタンスに対して特定のAZを要求することはできない」旨が明示されています。
An error occurred (InvalidParameterCombination) when calling the CreateDBInstanceReadReplica operation: Requesting a specific availability zone is not valid for Multi-AZ instances.
パターン②:シングルAZ + AZ指定
次に、シングル AZ 構成で AZ を指定した場合の挙動を確認します。
$ aws rds create-db-instance-read-replica \
--db-instance-identifier test-replica-singleaz-1a \
--source-db-instance-identifier $SOURCE_ID \
--no-multi-az \
--availability-zone ap-northeast-1a \
--region $REGION
こちらは正常に作成でき、AvailabilityZone が指定どおり ap-northeast-1a になっていることが確認できました。
{
"DBInstance": {
"DBInstanceIdentifier": "test-replica-singleaz-1a",
"DBInstanceStatus": "creating",
"AvailabilityZone": "ap-northeast-1a",
"MultiAZ": false,
"DBSubnetGroup": {
"DBSubnetGroupName": "yutaka-test-db-subnetgroup"
},
"ReadReplicaSourceDBInstanceIdentifier": "yutaka-test-db"
}
}








