RDSのアップグレードにBlue/Green Deploymentを使用してみた

こんにちは!SRE一年生の墨(YOUTRUST/X)です!

今回はRDSアップグレードの際にブルー/グリーンデプロイを使用した事例について共有します。
弊社特有の環境や要件により一般的ではない対応となりましたので、皆様の参考になれば幸いです。

対応背景

2024年XX月AWS Healthより下記のようなありがたくも嬉しくはないRDS MySQLバージョンのEOL*1通知が届きました。😂
他タスクを優先していたところ期限残り1ヶ月となったところで重い腰を上げました。
近年RDSは約1年でサポートが切れるのが通例のため年次対応とはいえ対応負荷が上がっています。

AWS Health RDSアップグレード通知

要件

影響範囲としてはプライマリDB1台、リードレプリカ2台が対象でした。
弊社に入社して初のDBアップデートということもあり、まずは要件の整理を行いました。

  • 対象バージョンまでアップグレードする
  • 事前検証が可能なこと
  • ユーザー影響を最小限にする
  • できる限り直前の状態にロールバックを可能にする

特殊な要件はありませんでしたが、弊社サービスはto Cサービスも提供しており、ありがたいことに深夜でもアクセスがあります。
そのためメンテナンス時間を設けず影響を少なくした上でのアップグレードが最良でした。

調査と対応方針

アップグレードバージョン

対応前のバージョンは8.0.35でした。
個人的には8.4系はLTS版*2ということもあり、サクッと最新の8.4.4にメジャーアップグレードしたいところですが、変更内容を網羅的に調べる時間もないため今回はマイナーバージョンアップグレードすることとしました。

公式ドキュメントを確認し、最近出たばかりで2026/03までサポートがある8.0.41を選択しました。
また、変更点はClaude 3.7 Sonnetにまとめてもらい、破壊的変更がないことを確認しました。(バージョンアップのドキュメント全部読んでたのが懐かしいですね。。。☺️)

ただ、実際には8.4系と8.0系で大きな機能追加はないとのことです。
詳しくは下記ブログをご覧ください。 thinkit.co.jp

アップグレード方法

事前検証が可能なこと」「ユーザー影響を最小限に」と「ロールバックを可能にする」という要件があったためブルー/グリーンデプロイ方式を採用しました。 ブルー/グリーンデプロイとはアプリのデプロイ環境ではよく使用される方法です。
Blue(現行環境)とGreen(新環境)を用意し、Green環境でテスト行い問題なければ切り替えることで安全にアップデートする方式のことです。

RDSでもブルー/グリーンデプロイ機能は標準機能として提供されており、データのレプリケートからエンドポイント切替まで自動化されているためこちらを採用することにしました。
ただ非同期バイナリログレプリケーションを使用しているためデータ遅延や不整合が発生することがあるため厳格な整合性やリアルタイム性が求められるシステムでは注意が必要です。 docs.aws.amazon.com

事前検証

弊社はインフラリソースはTerraformで管理していますが、Terraformでブルーグリーン機能を使用するとGreen作成 → 切り替え → Blue削除が自動で行われるためGreenに影響があった場合切り戻せません。また、Green環境が正常か検証できないといった問題がありました。
そこで下記のように実装することとし、検証を行いました。
また、切替時はJMeter*3で10秒毎にリクエストを送りましたが、ダウンタイムなしで切り替えることができました。
エンドポイントも自動で切り替わるためアクセスをRoute53などで管理している場合でも問題ありません。

  1. Webコンソールから手動でGreen環境作成
  2. レプリカのパラメータグループなど設定不可な箇所を修正
  3. DB直接接続にクエリやレプリケーションの検証
  4. Green環境へ切替
  5. Terraformのコードをリソースの実態へ合わせる
  6. Blue環境(旧リソース)を削除

また他記事で下記のような記述がありましたが、弊社環境では下記の通りとなりました。

  • プライマリDBの設定値binlog_formatはMIXEDの必要がある → 弊社環境ではMIXEDのため検証なし
  • パラメータストア反映前の項目があると失敗することがある → 失敗しない
  • サブネットグループに3つリソースが紐づいていないといけない → 2つでも問題なし
  • パラメータグループなどの設定はレプリカ用の設定項目がないのでプライマリの物が反映される → プライマリの設定が反映された

Greenリソース作成

切替前日の昼間にWebコンソールからGreen環境を作成、検証をして問題ないことを確認しました。
パラメータグループやオプショングループなどをレプリカだけ分けている場合などは切替前に変更しましょう。 同時にパラメータ調整や再起動が必要な設定はこの時にしておくとよいでしょう。

神頼み🙏

初めての対応でしたが、ここまでで必要な準備はすべて完了しました。
最後に帰宅途中近所の神社で神頼み⛩️をし、YOUTRUSTへ投稿してから早朝対応に向けて寝ました笑
神頼み投稿

ブルーグリーン切替とTerraformの整合対応

ブルーグリーン切替

深夜〜早朝の中でも、ユーザー影響が最も少ないと判断した朝4時に、上司立ち合いのもとで切替作業を行い、問題なく完了しました!🥳🎉
切替はボタンを押すだけで切替後もBlue環境はサフィックスにoldが付く形で残るため安心感がありました。

Terraformの整合対応

切替後は急を要する作業ではないためTerraformコード変更とBlue環境削除は後日行いました。
因みに弊社ではセキュリティ上の理由から、ローカル環境でTerraformコマンドを実行できないため、GitHub ActionsのPlan時にstateリソースの入れ替えを行いました。

  - name: Import RDS Instance
    run: |
      terraform init -upgrade
      terraform state rm module.backend.aws_db_instance.webapp_main
      terraform import module.backend.aws_db_instance.webapp_main arn:aws:rds:ap-northeast-1:111111111111:db:youtrust-webapp-production
      terraform state rm module.backend.aws_db_instance.webapp_replica\[\"0\"\]
      terraform import module.backend.aws_db_instance.webapp_replica\[\"0\"\] arn:aws:rds:ap-northeast-1:111111111111:db:youtrust-webapp-production-read-replica-1
      terraform state rm module.backend.aws_db_instance.webapp_replica\[\"1\"\]
      terraform import module.backend.aws_db_instance.webapp_replica\[\"1\"\] arn:aws:rds:ap-northeast-1:111111111111:db:youtrust-webapp-production-read-replica-2
    working-directory: ${{ matrix.dir }}

なお、上記対応によりBlue環境はTerraform管理外となるため手動で削除しました。

学び

知見も溜まったので次回は8.4系にアップグレードするかAurora移行に挑戦したいです!

仕事は準備が9割と言いますが、事前に方針決め、調査、検証がいかに重要かを再確認できました。
また、改めてマネージドサービスの便利さを実感しました。
これからもマネージドサービスを積極的に使用し、作業効率や安全性を高めていきたいです。

最後に

スタートアップだからこそ自身で手を挙げればやったことがないことも挑戦できる環境が整っています! もしこのブログを読んで興味をもっていただけたら下記を覗いてみてください!

youtrust.jp

herp.careers

参考リンク

*1:EOLとは「End Of Life」の略です。 EOLは製品の販売開始から時間が経過するのに伴い、メーカーが保守サポートなどのサービス提供を打ち切ることを意味します。

*2:LTSとは「Long-Term Support」の頭文字で「長期サポート」の意味です。その名のとおり本番環境で長期間安心して使えるように、安定したサポートを目指しているバージョン系列のこと。

*3:JMeterとは、Webサービスを中心にさまざまなアプリケーションの負荷テストおよびパフォーマンスの計測が行えるツールです。Apacheソフトウェア財団によって開発されているJavaアプリケーションで、正式名称は「Apache JMeter」です。