[初心者向け] AWS CLI を利用して各インスタンスの AZ を指定した Aurora クラスターを作成してみた

2023.06.28

アノテーション、テクニカルサポートチームの村上です。
Amazon Aurora は、私がテクニカルサポート業務を始めた当初によく対応させていただいたサービスで、今でも何かアップデートがあるとその機能について試しておかないとという気持ちになるサービスです。そんな Aurora について、みなさんに質問があります。

質問

Aurora クラスターでは、ライターインスタンスの AZ を指定してクラスターを作成することができるのでしょうか?

回答

マネジメントコンソールで Aurora クラスターを作成する場合は、ライターインスタンス 1 台構成の Aurora クラスターを作成した後にリードレプリカを加えることで、ライターインスタンスを指定の AZ へ配置することができます。
最初からリードレプリカを加えた構成で Aurora クラスターを作成しようとすると、マネジメントコンソール上で AZ を指定する為のプルダウンメニューが非表示になります。よって、マネジメントコンソールを利用する場合、最初からリードレプリカを加えた Auroa クラスター構成では AZ を指定することができません。先人の下記ブログではリードレプリカを加えた状態で AZ を選択するとエラーが表示されるとあるので、マネジメントコンソール上の表示も日々進化しているのがわかります。

RDSってなんでAZ(Availability Zone)を指定する項目がふたつあるの?

では、AWS CLI で Aurora クラスターを作成した場合はどうなのでしょうか?
AWS CLI を利用してリードレプリカを持つ Aurora クラスターを作成する場合は、以下の順で AWS CLI コマンドを実行することになります。

1 Aurora クラスターの作成(aws rds create-db-cluster
2 ライターインスタンスの作成(aws rds create-db-instance
3 リードレプリカの作成(aws rds create-db-instance

2 と 3 の実行コマンドを注意深く見ていただくと気づくと思いますが、実はライターインスタンスの作成で利用する AWS CLI コマンドとリードレプリカの作成で利用する AWS CLI コマンドは同一なのです。
また、2 と 3 を同時に実行することもできない為、自ずとライターインスタンス 1 台構成の Aurora クラスターを作成した後に、リードレプリカをクラスターへ追加していくことになります。
ということは、もちろんライターインスタンスの AZ を指定することは可能です。
試しにライターインスタンスとリードレプリカの AZ を指定してクラスターを作成してみたいと思います。

やってみた

クラスターを作成

ライターインスタンスを作成する前に、まずは Aurora クラスターを作成します。マネジメントコンソールを利用して Aurora クラスターを作成することが多いので、インスタンスが無い状態のクラスターを作成することができるのは少し不思議な感じがします。
※必要最低限の設定で作成しています。本記事に掲載されている AWS CLI コマンドをご利用の際は、要件にあったオプションを指定・追加してください。

【クラスターの設定】
DB クラスター識別子:aurora-cluster1
エンジン:aurora-mysql
エンジンバージョン:5.7.mysql_aurora.2.11.3
クラスターで利用する AZ:"ap-northeast-1a" "ap-northeast-1c" "ap-northeast-1d"
ポート番号:3306
マスターユーザー:auroradb
マスターユーザーパスワード:auroradb
データベース名:auroradb

aws rds create-db-cluster \
--db-cluster-identifier aurora-cluster1 \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.11.3 \
--availability-zones "ap-northeast-1a" "ap-northeast-1c" "ap-northeast-1d" \
--port 3306 \
--master-username auroradb \
--master-user-password auroradb \
--database-name auroradb


マネジメントコンソールで確認してみると、確かに 0 インスタンスの Aurora クラスターが作成されていました。

ライターインスタンスを AZ "ap-northeast-1c" に作成

【ライターインスタンス設定】
DB クラスター識別子:aurora-cluster1
DB インスタンス ID:aurora-instance1
エンジン:aurora-mysql
エンジンバージョン:5.7.mysql_aurora.2.11.3
インスタンスクラス:db.t3.small
インスタンスを配置する AZ:"ap-northeast-1c"

aws rds create-db-instance \
--db-cluster-identifier aurora-cluster1 \
--db-instance-identifier aurora-instance1 \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.11.3 \
--db-instance-class db.t3.small \
--availability-zone "ap-northeast-1c"

ライターインスタンスを AZ "ap-northeast-1c" に作成することができました。マネジメントコンソール上で設定項目マルチ AZ を確認すると「なし」となっています。 ライターインスタンス 1 台構成の Aurora クラスターなので当然なのですが。

1 台目のリードレプリカを AZ "ap-northeast-1a" に作成

【リードレプリカ設定( 1 台目)】
DB クラスター識別子:aurora-cluster1
DB インスタンス ID:aurora-replica1
エンジン:aurora-mysql
エンジンバージョン:5.7.mysql_aurora.2.11.3
インスタンスクラス:db.t3.small
インスタンスを配置する AZ:"ap-northeast-1a"

aws rds create-db-instance \
--db-cluster-identifier aurora-cluster1 \
--db-instance-identifier aurora-replica1 \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.11.3 \
--db-instance-class db.t3.small \
--availability-zone "ap-northeast-1a"

1 台目のリードレプリカを AZ "ap-northeast-1a" に作成することができました。マネジメントコンソール上で、設定項目マルチ AZ を確認すると「2 ゾーン」となっています。RDS だと設定項目マルチ AZ は、「あり」か「なし」のどちらかになるので、更に別の AZ にリードレプリカを追加するとどんな表示になるのでしょうか?

2 台目のリードレプリカを AZ "ap-northeast-1d" に作成

【リードレプリカ設定( 2 台目)】
DB クラスター識別子:aurora-cluster1
DB インスタンス ID:aurora-replica2
エンジン:aurora-mysql
エンジンバージョン:5.7.mysql_aurora.2.11.3
インスタンスクラス:db.t3.small
インスタンスを配置する AZ:"ap-northeast-1d"

aws rds create-db-instance \
--db-cluster-identifier aurora-cluster1 \
--db-instance-identifier aurora-replica2 \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.11.3 \
--db-instance-class db.t3.small \
--availability-zone "ap-northeast-1d"

2 台目のリードレプリカを AZ "ap-northeast-1d" に作成することができました。設定項目マルチ AZ は、「3 ゾーン」となりました。

運用面からライターインスタンスの AZ 指定について考えてみる

ライターインスタンスの AZ を固定したい
ライターインスタンスのフェールオーバーをさせない方法を教えてほしい

上記のようなお問い合わせをいただくことがあります。
Aurora クラスターを利用して上記のご要望を実現するには、ライターインスタンス 1 台構成でご利用いただくしかありませんが、もちろんリードレプリカを含む Aurora クラスター構成で上記のようなご質問をいただきます。

マネージドサービスをご利用いただくにあたり、システム要件に合わせてマネージドサービスを過剰にカスタマイズ・インテグレーションするより、マネージドサービスを利用する前提でシステム要件を考えていただくほうが、後の運用を考えた場合に良い選択となることが多いように感じます。
仮にですが、フェールオーバーをした先の AZ ではネットワークレイテンシーによってシステム要件を満たせないとしたら、すぐに再度のフェールオーバーを実施してライターインスタンスを以前の AZ に戻す必要があります。
再度のフェールオーバーによるダウンタイムについては、許容ができるのでしょうか? また、フェールオーバー手順や社内周知についても事前に全て決められていますか?  

返答に困った方は、ぜひ下記 AWS ブログ [Well-Architected for Startups -信頼性の柱- 導入編] をご一読いただき、どのようなシステムが本当に必要なのか時間をとって考えていただけたらと思います。

まとめ

AWS を触り始めた当初は、AWS CLI は上級者が使うものというイメージでしたが、実際はもっと気軽に使える使い勝手が良いツールでした。もし、AWS CLI の利用を躊躇されている方がいたら、まずは設定を見てみるようなコマンドから試してみてはいかがでしょうか。

この記事がどなたかのお役に立てば幸いです。

参考資料