本文へスキップ
hdknr blog

RDS Blue/Green デプロイでのバージョン移行

RDS for MySQL のマイナー/メジャー移行を Blue/Green で行うときの Terraform 設計、切替のタイムライン、DNS 伝播による実停止時間の実測

概要

RDS の Blue/Green デプロイは、本番(Blue)のレプリカとして別バージョンの環境(Green)を作り、同期させたうえでエンドポイントを切り替える機能。バージョン移行のダウンタイムを短くする目的で使う。

実停止時間は「書き込み停止1秒」ではない

最も重要な実測値がここにある。RDS 側の書き込み停止が1秒でも、アプリから見た停止は24秒になった。差分の原因は DNS 伝播である。

切替時にエンドポイントの向き先が変わるため、アプリケーション側の DNS キャッシュが切れるまで旧インスタンスを見続ける。移行計画のダウンタイム見積りは、RDS が公表する切替時間ではなく DNS TTL とコネクションプールの挙動を含めた実測で立てる必要がある。

対象方式RDS の書き込み停止アプリから見た停止
stagein-place約5分
20GB / Multi-AZBlue/Green約1秒18秒(完全停止15秒 + 部分障害3秒)
200GB / db.m6g.2xlargeBlue/Green約1秒24秒(完全停止15秒 + 部分障害9秒)

切替時にアプリが返すエラーは「接続不能」ではなく 1290 read-only になる。旧インスタンスを見続けたまま書き込もうとするためで、エラーハンドリングと監視のパターンをこれに合わせる。

流入を止めるなら web ではなく job 側

ALB で流入を遮断するのは逆効果だった。 16秒の障害を回避するために4分の全断を作ることになる。止めるべきは web ではなく job / celery のような書き込みワーカー側である。

「復旧」の判定をポーリングだけで行うと停止時間を短く見積もる。ヘルスチェックの余裕の計算式も事前に検証しておく。

Terraform state が壊れる

Blue/Green 切替は Terraform state を壊す。 切替で DbiResourceId が変わるため、state rm + import のやり直しが必須になる。移行手順書にこの工程を明示的に入れておく。

事前に潰しておく前提条件

Terraform 側の設計 — family 差し替えではなく「併設」

パラメータグループを新バージョン用の family に差し替える形で書くと、Blue/Green の途中状態を表現できない。新旧のパラメータグループを併設しておき、切替後に不要な側を消す設計にする。

切替後は実質ロールバックできない

Green へ切り替えた時点で、旧 Blue へ戻す現実的な経路は失われると考えたほうがよい。切替前の検証と、切替後に発覚した問題を前進で直す準備の両方が要る。

効果が大きかった準備

公式の事前資料に載っていない落とし穴が複数あるため、リハーサルを1回通すことが最も効く。

Extended Support 課金を避けるための期日管理

標準サポート終了日を超えると Extended Support 課金が始まる。終了日当日に移行を完了させれば課金は $0 に抑えられる(実例では下限見積り約 $1,022/月 を回避)。逆に言えば、この期日が移行スケジュールを規定する。

関連ページ

ソース記事