🔄

Amazon RDS インスタンスクラスの AZ 制限とBlue/Green Deployments での対処法

に公開

はじめに

Amazon RDS の Blue/Green Deployments は、データベースの更新を安全に実行するための強力な機能です。しかし、特定のインスタンスクラスに変更する際、アベイラビリティゾーン(AZ)の制限により予期しないエラーが発生することがあります。

本記事では、実際に発生したトラブルケースとAWSサポートとのやり取りを通じて得た知見を共有します。

発生した問題

実行環境

  • RDS MySQL 8.0.40
  • Multi-AZ 構成
  • ストレージタイプ: gp3
  • 変更前: db.r7g.2xlarge
  • 変更後: db.r8g.xlarge

エラーの内容

以下のコマンドで Blue/Green Deployment を作成しようとしたところ:

terminal
aws rds create-blue-green-deployment \
    --blue-green-deployment-name upgrade-myapp-db \
    --source arn:aws:rds:ap-northeast-1:xxxxxx:db:myapp-db \
    --target-db-instance-class db.r8g.xlarge

次のエラーが発生しました:

Unable to provision blue/green deployment because the subnet group that contains the blue DB instance(s) has an invalid configuration. For instructions to resolve the issues, see https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets . Then, delete and recreate the blue/green deployment.

原因の解明

AWSサポートとのやり取りから、以下の事実が判明しました:

1. インスタンスクラスのAZ制限

db.r8g.xlarge は東京リージョン(ap-northeast-1)の全てのAZで利用可能ではありません。

参考:東京リージョンのAZ制限について(2025年6月時点)

東京リージョンの特徴

  • 東京リージョンでは ap-northeast-1b は古いAZのため、多くの新しいインスタンスクラスで利用できません
  • 一般的に利用可能なAZ:ap-northeast-1a, ap-northeast-1c, ap-northeast-1dの3つ

AZ制限があるインスタンスクラス(調査時点)

  • db.r8g.* (Graviton4世代) → サイズにより制限が異なる
    • 詳細は後述の全サイズ調査結果を参照

注意: AZ制限は時期により変更される可能性があります。実際の運用前には必ず最新状況を確認してください。

利用可能なAZの確認方法

terminal
aws rds describe-orderable-db-instance-options \
    --engine mysql \
    --engine-version 8.0.40 \
    --db-instance-class db.r8g.xlarge \
    --region ap-northeast-1 \
    --query "OrderableDBInstanceOptions[?StorageType=='gp3'].AvailabilityZones[].Name" \
    --output text
result
ap-northeast-1a ap-northeast-1d

このコマンドで確認したところ、db.r8g.xlarge は以下のAZでのみ利用可能でした:

  • ap-northeast-1a
  • ap-northeast-1d

全インスタンスクラスのAZ制限を調査する方法

AZ制限があるインスタンスクラス(3つ未満のAZでしか利用できない)を調べる場合:

terminal
aws rds describe-orderable-db-instance-options \
    --engine mysql \
    --engine-version 8.0.40 \
    --region ap-northeast-1 \
    --query "OrderableDBInstanceOptions[?StorageType=='gp3' && length(AvailabilityZones) < \`3\`].[DBInstanceClass,join(', ', AvailabilityZones[].Name)]" \
    --output table

現時点での結果(2025年6月28日時点):

result
---------------------------------------------------------
|          DescribeOrderableDBInstanceOptions           |
+------------------+------------------------------------+
|  db.r8g.12xlarge |  ap-northeast-1a, ap-northeast-1d  |
|  db.r8g.2xlarge  |  ap-northeast-1a, ap-northeast-1d  |
|  db.r8g.48xlarge |  ap-northeast-1a, ap-northeast-1d  |
|  db.r8g.8xlarge  |  ap-northeast-1a, ap-northeast-1d  |
|  db.r8g.large    |  ap-northeast-1a, ap-northeast-1d  |
|  db.r8g.xlarge   |  ap-northeast-1a, ap-northeast-1d  |
+------------------+------------------------------------+

r8g系全サイズのAZ制限調査

r8g系でサイズによる制限の違いを確認するため、全サイズを調査:

terminal
aws rds describe-orderable-db-instance-options \
    --engine mysql \
    --engine-version 8.0.40 \
    --region ap-northeast-1 \
    --query "OrderableDBInstanceOptions[?StorageType=='gp3' && starts_with(DBInstanceClass, 'db.r8g.')].[DBInstanceClass,join(', ', AvailabilityZones[].Name)]" \
    --output table

結果(2025年6月28日時点):

result
--------------------------------------------------------------------------
|                   DescribeOrderableDBInstanceOptions                   |
+------------------+-----------------------------------------------------+
|  db.r8g.12xlarge |  ap-northeast-1a, ap-northeast-1d                   |
|  db.r8g.16xlarge |  ap-northeast-1a, ap-northeast-1c, ap-northeast-1d  |
|  db.r8g.24xlarge |  ap-northeast-1a, ap-northeast-1c, ap-northeast-1d  |
|  db.r8g.2xlarge  |  ap-northeast-1a, ap-northeast-1d                   |
|  db.r8g.48xlarge |  ap-northeast-1a, ap-northeast-1d                   |
|  db.r8g.4xlarge  |  ap-northeast-1a, ap-northeast-1c, ap-northeast-1d  |
|  db.r8g.8xlarge  |  ap-northeast-1a, ap-northeast-1d                   |
|  db.r8g.large    |  ap-northeast-1a, ap-northeast-1d                   |
|  db.r8g.xlarge   |  ap-northeast-1a, ap-northeast-1d                   |
+------------------+-----------------------------------------------------+

サイズによる制限パターンが複雑で、単純に「新世代は制限あり」「大きいほど緩い」ではないことが分かります。

2. サブネットグループの設定問題

元のDBインスタンスのサブネットグループには以下のAZのサブネットのみが含まれていました:

  • ap-northeast-1a
  • ap-northeast-1c

Multi-AZ構成のため、Blue/Green Deployment では両方のAZにインスタンスを作成する必要がありますが、ap-northeast-1c では db.r8g.xlarge が利用できないため、エラーが発生していました。

対応方法

1. サブネットグループの修正

サブネットグループに ap-northeast-1d のサブネットを追加する手順:

  1. RDSコンソールから「サブネットグループ」を選択
  2. 対象のサブネットグループを編集
  3. ap-northeast-1d のサブネットを追加

2. Blue/Green Deployment の再作成

terminal
aws rds create-blue-green-deployment \
    --blue-green-deployment-name upgrade-myapp-db \
    --source arn:aws:rds:ap-northeast-1:xxxxxx:db:myapp-db \
    --target-db-instance-class db.r8g.xlarge

しかし、この対応後も新たな問題が発生しました。
Green環境のプライマリは AZ-d に配置され、コマンドの指定通り db.r8g.xlarge となっていました。しかし、
Green環境のリードレプリカが ap-northeast-1c に配置されてしまい、db.r8g.xlarge への変更ができませんでした。

AWSサポートによると、Blue/Greenデプロイで --target-db-instance-class を指定した場合、グリーン側のメインインスタンスは指定したインスタンスクラスが利用可能なAZに自動で配置されるそうです。
しかし、グリーン側のリードレプリカについては、ブルー側と同じインスタンスクラスで作成される仕様となっており、必ずしも希望するAZに配置されるとは限らないとのことでした。

3. AWSサポートから提示された解決手順

AWSサポートによると、グリーン側のリードレプリカでも db.r8g.xlarge のような AZ に制限があるインスタンスタイプを使いたい場合、以下のように グリーン側のプライマリ/セカンダリの AZ 構成を調整する必要があります。

🛠️ 手順の概要

  1. グリーン側のリードレプリカに対してフェイルオーバーを実行し、希望の AZ をプライマリにする
  2. セカンダリの AZ が希望の AZ になるまで、マルチAZを一度無効化 → 再有効化を繰り返す
    • ※RDS ではセカンダリの AZ を直接指定できない
  3. 希望する AZ 構成が整ったら、リードレプリカのインスタンスタイプを db.r8g.xlarge に変更する

📘 ポイント補足

  • マルチAZ構成の制約により、セカンダリAZを明示指定できない点が最大のネック
  • 運が悪いと 2. の「有効化→無効化」を何度も繰り返す必要がある
  • この方法は現状のRDS仕様に起因する回避策であり、正直「不便」「不完全」と感じる部分もあります。

まとめ

今回の教訓

  1. 事前確認の重要性: インスタンスクラス変更前に利用可能なAZを必ず確認する
  2. サブネットグループの設計: 将来の変更を見据えて複数AZのサブネットを含める
  3. Blue/Green Deploymentの制限理解: リードレプリカのAZ配置は自動決定される

実務での対応

時間的制約により、最終的に db.r7g.xlarge(AZ制限なし)への変更で対応完了。
AZ制限のあるインスタンスクラスへの変更時は十分な計画と時間的余裕が必要です。

今回の結果はあくまでも、AWSの仕様制限が可視化された結果で、それ以上でもそれ以下でもない、という受け止めです。

参考リンク

Discussion