megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

RDS PostgreSQL Blue/Greenデプロイでメジャーアップグレード

Blue/Green デプロイを利用してPostgreSQLのメジャーバージョンアップを試みた際、何回かエラーに出会い躓いたので手順を残します。

環境

サービス バージョン
Amazon RDS PostgreSQL 15.x から 18.x
アップグレード方式 Blue/Green デプロイメント

手順

1. パラメータグループの作成

Blue/Greenの同期に論理レプリケーションを使用するため、BlueとGreen両方で rds.logical_replication を有効にしたパラメータグループが必要です。

「パラメータグループ」から「パラメータグループの作成」を選択して、以下の2つを作成する。

用途 ファミリー グループ名の例
Blue用 postgres15 postgres15-logical
Green用 postgres18 postgres18-params

タイプはどちらもDB parameter groupを選択。作成したらそれぞれ rds.logical_replication1 にする。 PostgreSQL15用のParameter Groupsを作成し、rds.logical_replicationのValueを1にしている。

PostgreSQL18用のParameter Groupsを作成し、rds.logical_replicationのValueを1にしている。

2. Blue用パラメータグループの適用

  1. データベースから対象インスタンスを開き、「変更」を選択
    • パラメータグループを postgres15-logical に変更し、すぐに適用
  2. インスタンスを再起動してパラメータをin-syncにする

移行対象のRDSの編集画面でparameter groupを先ほど作ったPostgreSQL15のParameter groupに変更している

3. Blue/Green デプロイメントの作成

  1. データベースから対象インスタンスを選択
  2. 「アクション」から「Blue/Green デプロイメントの作成」を選択
  3. エンジンバージョン: 18.x
  4. DBパラメータグループ: postgres18-params
  5. 「ステージング環境を作成」をクリック

Blue/Green deployment画面でpramater groupとして先ほど作ったPostgreSQL18用のparameter groupを選択している。

これでGreen環境がPostgreSQL 18で作成されて、論理レプリケーションで同期が始まります。

4. Green環境の動作確認

  1. Green環境のステータスが「利用可能」になるまで待つ
  2. Green環境のエンドポイントに接続して、アプリが正常に動くか確認する

5. スイッチオーバー(本番切替)

  1. データベース一覧からBlue/Greenデプロイメントを選択
  2. 「アクション」から「スイッチオーバー」を選択
  3. 確認して実行

ダウンタイムは1分未満で、Green環境が本番に昇格します。エンドポイント名も自動で入れ替わるので、アプリ側の接続先を変える必要はありません。

対象インスタンスグループを選択し、switch overを押下しようとしている

6. 事後作業

  1. アプリの動作確認
  2. バージョンが18.xになっていることを確認
  3. 問題なければ旧Blue環境(例: xxxx-old1)を削除
  4. データベース一覧に残っているBlue/Greenデプロイメント(例: bg-deployment-1)も手動で削除する(旧Blue削除後も自動では消えない)
  5. 必要であれば本番インスタンスのパラメータグループを default.postgres18 に戻す
  6. 不要になったパラメータグループ(postgres15-logicalpostgres18-params)を削除

注意事項

再起動によるダウンタイム

数秒のダウンタイムを伴う再起動が3回発生する。

  1. パラメータグループの適用時
  2. スイッチオーバー時
  3. パラメータグループを戻すとき

3回目は必須ではなく、rds.logical_replication が有効なまま残るだけなので、次のメンテナンスウィンドウで自動適用されるのを待ってからパラメータグループを消してもいい。

料金

Green環境が存在する間はRDSインスタンス2台分の料金が発生する。

つまずいたポイント

最初はパラメータグループを作らずにそのままBlue/Greenデプロイメントでメジャーアップグレードしようとした。
すると以下のエラーが出た。

The current parameter group associated with the blue instance (blue-green-params-xxx) is not the default.
You need to explicitly specify a new parameter group (default or custom) for the green instance when creating a blue/green deployment with the --target-engine-version option set to an engine version that's different from the blue instance.

「Blueのパラメータグループがデフォルトじゃないから、Greenに使うパラメータグループを明示的に指定してくれ」ということらしいが、Blueはデフォルトのパラメータグループ。
どゆこと・・・。

ただ何故かマイナーバージョンアップでなら問題ない。
そこでマイナーバージョンアップを実施し、スイッチオーバーする前にGreenを18に上げてからすればいいのでは?と思って試したら、今度はこれ。

Major Version Upgrade not supported for Postgres Read Replica DB Instances

「Read ReplicaのPostgreSQLはメジャーバージョンアップグレードに対応していない」とのこと。
Blue/Greenデプロイメントで作成されるGreenはRead Replicaとして扱われるため、この方法もダメだった。

結局、正しい対処方法はBlue用・Green用それぞれに rds.logical_replication を有効にしたパラメータグループを作って割り当てること。 本記事の手順1・2がそれにあたる。
マイナーバージョンアップではAWSが勝手にやってくれるが、メジャーの場合は自分で用意しないといけない。

感想

簡単な作業だと思ったのに、やっぱり初めての作業はちょいちょい躓くんだなぁ。
ステージングで確認して良かった。