ブルーグリーンデプロイの仕組み ― ダウンタイムゼロで本番を切り替える方法


ブルーグリーンデプロイの仕組み ユーザー リクエスト ロード バランサー (切替スイッチ) Blue 環境(現行版) Server1 Server2 Server3 ▶ 稼働中 Green 環境(新版) Server1 Server2 Server3 ■ デプロイ済み・待機中 共有 DB 切り替え後: Green が本番に Blue はロールバック用
ブルーグリーンデプロイのイメージ: ロードバランサーで環境を切り替え
ひよこ ひよこ

ブルーグリーンデプロイって何なの?色の名前がついてて不思議なんだけど…

ペンギン先生 ペンギン先生

本番環境をまったく同じ構成で2つ用意して、片方を「ブルー」、もう片方を「グリーン」と呼ぶ手法だよ。今動いているのがブルーだとしたら、新しいバージョンをグリーンにデプロイして、準備ができたらロードバランサートラフィックをグリーンに切り替える。これだけでダウンタイムゼロのリリースが実現できるんだ。

ひよこ ひよこ

へえ!もし新しいバージョンにバグがあったらどうするの?

ペンギン先生 ペンギン先生

そこがブルーグリーンの最大の強みだよ。ブルー環境はそのまま残っているから、ロードバランサーの向き先をブルーに戻すだけで一瞬でロールバックできるんだ。従来のデプロイだと、バグが見つかったら古いバージョンを再デプロイしなきゃいけなくて時間がかかるけど、ブルーグリーンなら数秒で元に戻せるよ。

ひよこ ひよこ

カナリアリリースローリングアップデートっていうのも聞くけど、何が違うの?

ペンギン先生 ペンギン先生

カナリアリリースは新バージョンにトラフィックの一部(たとえば5%)だけを流して、問題がなければ徐々に比率を上げていく方法だよ。ローリングアップデートサーバーを1台ずつ順番に更新していく方法。ブルーグリーンは全トラフィックを一気に切り替えるから、シンプルで分かりやすい反面、中間状態がないんだ。

ひよこ ひよこ

AWSとかKubernetesだと具体的にどうやって実現するの?

ペンギン先生 ペンギン先生

AWSならALB(Application Load Balancer)のターゲットグループを2つ用意して、リスナールールで切り替えるのが定番だよ。Kubernetesの場合は、ServiceのselectorラベルをBlueからGreenに書き換えるだけでトラフィックが切り替わる。どちらもインフラの設定変更だけで済むから、アプリのコードを一切触らなくていいんだ。

ひよこ ひよこ

でもデータベースはどうするの?ブルーとグリーンでDBも2つ用意するの?

ペンギン先生 ペンギン先生

いい質問だね。実はそこがブルーグリーンデプロイの一番の難所なんだ。多くの場合、DBは共有にする。でもそうすると、新バージョンのマイグレーションテーブル変更など)が旧バージョンと互換性を保つ必要がある。カラム追加は大丈夫だけど、カラム削除やリネームは旧バージョンが壊れるから、段階的にやるのがセオリーだよ。

ひよこ ひよこ

環境を2つ維持するってことは、コストも2倍になるんじゃない?

ペンギン先生 ペンギン先生

その通り。常時2セットの環境を動かすと単純にインフラ費用が倍になるんだ。だから最近はデプロイ時だけグリーン環境を立ち上げて、切り替え後にブルーを落とすパターンも増えているよ。クラウドの従量課金と相性がよくて、コンテナサーバーレスなら待機中のコストを最小限にできるんだ。

ひよこ ひよこ

切り替えの瞬間にユーザーのセッションが切れたりしないの?

ペンギン先生 ペンギン先生

鋭いね。ステートフルなセッションサーバー側にログイン状態を保持するタイプ)を使っていると、切り替え先にセッション情報がなくてログアウトされることがあるんだ。対策としては、セッションRedisなど外部ストアに保存するか、JWTトークンのようなステートレス認証にしておくのが定石だよ。

ひよこ ひよこ

フィーチャーフラグっていうのもデプロイと関係あるって聞いたけど、どう使い分けるの?

ペンギン先生 ペンギン先生

フィーチャーフラグはコードの中で機能のON/OFFを切り替えるスイッチだよ。ブルーグリーンと組み合わせると最強なんだ。新機能をフラグOFFのままグリーンにデプロイして切り替え、問題なければフラグをONにする。万が一バグがあってもフラグをOFFにするだけで済む。環境のロールバックすら不要になるケースもあるよ。

ひよこ ひよこ

ブルーグリーンデプロイって大企業だけの話じゃなくて、小さいチームでも使えるの?

ペンギン先生 ペンギン先生

もちろん使えるよ。むしろクラウドマネージドサービスが充実した今こそ小規模チームに向いているんだ。AWS App RunnerやGoogle Cloud Runは内部的にブルーグリーン方式でデプロイしてくれるから、開発者が意識しなくてもゼロダウンタイムが実現できる。大切なのはDB移行の互換性セッション管理を設計段階で考慮しておくことだね。