はじめに

Aurora Global Database は低レイテンシーなグローバル読み取りに有効なソリューションです。
しかしマイナーバージョンアップを行う際、特有の作法を知らないとトラブルに直面します。
実際に Terraform からプライマリクラスターのマイナーバージョンを更新したところ、15 分以上「Modifying」のまま処理が完了しない事象が発生しました。

本記事ではこの事象の原因を特定し、解決策が有効であるかコンソールと CLI を用いて検証した内容を解説します。

前提条件

今回の検証環境は、以下の構成で構築しています。

  • Global Database 名: yoshimura-global-db
  • プライマリクラスター (ap-northeast-1) : yoshimura-primary-db-cluster
  • ライターインスタンス: yoshimura-primary-db-instance-1
  • セカンダリクラスター (ap-northeast-3) : yoshimura-secondary-db-cluster
  • インスタンス: なし(ヘッドレス構成)
  • エンジン: Aurora PostgreSQL 15.8
  • 設定: 自動マイナーバージョンアップデートは無効

結論:アップグレード順序の誤り

公式ドキュメントには、マイナーバージョンアップグレードについて以下の制約が明記されています。

今回の事象は、先にプライマリクラスターに対してアップデートを実行していたことが大きな要因です。
また、セカンダリクラスターを更新するには、ヘッドレス構成のままでは制約によりアップグレードできないことも判明しました。

解決策

ヘッドレス構成を維持したままではアップグレードができないため、一時的にセカンダリに対してDBインスタンスを追加します。
その上で、「セカンダリ → プライマリ」の順番でアップグレードを進めます。

エラーを再現してみる

まずは失敗するパターンを確認するため、プライマリクラスターのみの更新を試みます。
コンソールから、エンジンバージョンを 15.12 に変更して適用してみたところ、以下のエラーメッセージが出ました。
やはり、セカンダリクラスターを先にアップグレードする必要があるようです。

Cannot upgrade DB cluster ‘yoshimura-primary-db-cluster’ to engine version 15.12 as global replica(s) are running lower version. Please upgrade global replicas first before upgrading the primary member.

DBクラスタ ‘yoshimura-primary-db-cluster’ をエンジンバージョン 15.12 にアップグレードできません。グローバルレプリカがより低いバージョンで実行中です。プライマリメンバーをアップグレードする前に、まずグローバルレプリカをアップグレードしてください。

正しいアップグレード手順

1. セカンダリクラスターにDBインスタンスを作成

ではセカンダリクラスターをマイナーバージョンアップグレードします。
アップグレードの前提条件を満たすため、セカンダリクラスターにDBインスタンスを追加します。
現在、ヘッドレス構成のクラスターに対してマネジメントコンソールからインスタンスを追加する操作はサポートされていないようなので、AWS CLI コマンドを使用してDBインスタンスを作成します。

aws rds create-db-instance \
--db-instance-identifier yoshimura-secondary-db-instance-1 \
--db-cluster-identifier yoshimura-secondary-db-cluster \
--db-instance-class db.r5.large \
--engine aurora-postgresql \
--region ap-northeast-3

コマンド実行後、セカンダリ側に yoshimura-secondary-db-instance-1 が作成されたことが確認できました。

2. セカンダリクラスターのマイナーアップグレードを実施

前提条件が整ったので、セカンダリクラスターから先にアップグレードを行います。
コンソールでバージョン 15.12 を選択して更新を実行しました。

数分待機すると、セカンダリクラスターのステータスが「利用可能」になり、正常に更新されたことが確認できました。
(プライマリクラスターとセカンダリクラスターのメジャーおよびマイナーエンジンバージョンが一致していない場合、フェイルオーバーができないので注意してください)

3. プライマリクラスターのマイナーアップグレード実施

セカンダリの更新完了を受けて、改めてプライマリクラスターのアップグレードを実施します。

4. 全クラスターのバージョン更新確認

最後に、Global Database 全体の状態をチェックします。

プライマリクラスターおよびセカンダリクラスターのアップグレードが完了し、グローバルデータベースのバージョンも更新されていることが確認できました。
(セカンダリDBインスタンスの削除をお忘れなく)

おわりに

Aurora Global Database のマイナーアップグレードは、セカンダリから順に行うのが鉄則です。
ヘッドレス構成の場合は「インスタンスの追加」というひと手間が必要になる点を忘れないようにしましょう。

参考ドキュメント

Aurora Global Database のマイナーバージョンアップグレード
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-upgrade.html#aurora-global-database-upgrade.minor

Amazon Aurora PostgreSQL の更新
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.html