Blue/Green デプロイ

2 つの同一環境を用意し、トラフィックを切り替えることでゼロダウンタイムデプロイを実現する手法

デプロイ可用性

Blue/Green デプロイとは

Blue/Green デプロイは、本番環境 (Blue) と同一の新環境 (Green) を用意し、新バージョンを Green にデプロイ後、トラフィックを Blue から Green に切り替える手法である。問題があれば Blue に即座にロールバックできる。

流れ

流れを図で示す。

Step 1: Blue (v1) がトラフィックを受けている
  [ALB][Blue: v1] ← 本番

Step 2: Green (v2) をデプロイ・テスト
  [ALB][Blue: v1] ← 本番
          [Green: v2] ← テスト中

Step 3: トラフィックを Green に切り替え
  [ALB][Green: v2] ← 本番
          [Blue: v1]  ← スタンバイ

Step 4: 問題があれば Blue にロールバック (即座)
  [ALB][Blue: v1] ← 本番に戻す

ローリングアップデートとの比較

ローリングアップデートとの主な違いを以下に比較する。

観点Blue/Greenローリングアップデート
ロールバック速度即座 (切り替えるだけ)遅い (再デプロイ)
リソースコスト2 倍 (2 環境)追加コスト小
新旧の混在なし (一括切り替え)あり (段階的)
テストGreen を事前にテスト可能本番トラフィックでテスト

AWS での実装

ALB + ターゲットグループ

ALB では Blue と Green の 2 つのターゲットグループを用意し、リスナールールの転送先を Green に付け替えることで一括切り替えを実現する。切り替え単位はリスナー (ルール) で、加重ターゲットグループを使えば重みを段階的にずらして途中経過も表現できる。切り替え時は Blue 側の登録解除の遅延 (deregistration delay) を確保し、処理中のリクエストを取りこぼさないようにする。

CodeDeploy

CodeDeploy は Amazon ECS・AWS Lambda・EC2/オンプレミスの各プラットフォームで Blue/Green デプロイを管理する。ECS では新しいタスクセット (Green) を起動して検証フックを実行し、ALB のリスナーを付け替えてトラフィックを移す。移行方式は一括・カナリア・線形から選べ、CloudWatch アラームと連動して異常時に自動ロールバックできる。

Lambda エイリアス

Lambda のエイリアスは 1 つのエイリアスから最大 2 つのバージョンへトラフィックを分割でき (加重エイリアス)、Blue = 現行バージョン・Green = 新バージョンとして重みを段階的に Green 側へ移して切り替える。関数コードやエイリアス ARN を変えずに向き先だけを移すため、呼び出し側は同じエイリアスを参照し続けられる。CodeDeploy と組み合わせれば、この重み移行と CloudWatch アラーム連動のロールバックを自動化できる。

S3 + CloudFront での Blue/Green

静的サイトの場合、S3 のプレフィックスまたはバケットを切り替える。

CloudFront → S3 /blue/  (v1)
           → S3 /green/ (v2) ← オリジンパスを切り替え

注意点

注意点を以下にまとめる。

注意点対策
DB スキーマの互換性Expand-Contract パターン
セッションの引き継ぎ外部ストア (DynamoDB) で管理
DNS キャッシュTTL を短くしてから切り替え

全体像を把握するには関連書籍も有用。

この記事は役に立ちましたか?

関連用語

関連する記事