ECS Blue/Greenデプロイの2つの方式 ─ CodeDeployとECSネイティブをどう選ぶか

 更新 2026-09-14

Amazon ECSのBlue/Greenデプロイには、CodeDeployに切替を任せる方式と、ECS自身が切替を行うネイティブ方式がある。承認の止め方、構成要素、インフラ管理とデプロイの責務分離の違いを整理し、選び方の判断軸を示す。

Amazon ECS(Fargate)上のWebサービスを、利用者に影響を与えずに更新し、問題があれば旧バージョンへ戻したい。 Blue/Greenデプロイはそのための代表的な方式である。

ECSのBlue/Greenには現在、CodeDeployに切替を任せる方式と、ECS自身が切替を行うネイティブ方式の2つがある。 どちらもALBのターゲットグループを2つ持ち、新バージョンを確認してから本番を切り替えるという骨格は同じだが、承認でデプロイを止める仕組みと、必要な構成要素が大きく異なる。

本稿では2つの方式を並べ、インフラ管理とデプロイの責務をどう分けるかという観点から、選び方の判断軸を整理する。

1. Blue/Greenデプロイの共通の骨格

現行バージョンが稼働する環境(Blue)とは別に、新バージョン用の環境(Green)を用意し、ALBの振り分けを切り替えることで無停止の更新を実現する。

  1. 新バージョンの配置: Green側のターゲットグループへ新しいタスクを起動する
  2. テストトラフィックでの確認: 本番トラフィックはBlueに残したまま、確認用の経路でGreenへ到達して動作を確かめる
  3. 本番トラフィックの切替: 本番の振り分けをBlueからGreenへ移す
  4. 旧バージョンの扱い: 一定時間Blueを残し、問題があれば戻せるようにしてから停止する
利用者の本番リクエストをALBがBlue(v1)へ転送している状態から、Green(v2)を配置してテストトラフィックだけをGreenへ転送して確認し、本番リクエストの転送先をGreenへ切り替え、Blueは一定時間保持した後に停止する流れを示すシーケンス図

ここまでは2つの方式で共通である。違いは、この流れを誰が制御するかにある。

2. 2つの方式

観点
CodeDeploy方式
ECSネイティブ方式
切替を制御する主体
CodeDeploy
ECS
必要な構成要素
CodeDeployのアプリケーションとデプロイグループ
ECSサービスのデプロイ設定のみ
テストトラフィックの経路
テスト用のリスナー
本番と同じリスナーのルール
本番の切り替え方
一括・線形・カナリアの事前定義設定から選ぶ
Blue/Green戦略は一括。線形・カナリアは別の戦略として用意されている
途中で止める仕組み
READY時の挙動(自動続行か停止か)
ライフサイクルフック(Lambdaフック、一時停止フック)
旧環境の保持
終了までの待機時間
bake time(切替後に監視しながら保持する時間)

ECSのデプロイ戦略には、ローリング更新、Blue/Green、線形、カナリアの4つがある。 本稿で比較するのはBlue/Green戦略である。

3. 承認でデプロイを止める仕組みの違い

リリースには、通常の更新として自動で本番へ進めたいものと、重要なリリースとして担当者の確認を挟みたいものがある。 デプロイのたびに「自動で進めるか、確認で止めるか」を選べるかが、2つの方式でいちばん違う点である。

CodeDeploy方式: 止め方はデプロイグループに固定される

CodeDeployのBlue/Greenでは、新バージョンが確認可能な状態(READY)になったときの挙動を指定する。

設定
挙動
自動続行
そのまま本番の切替へ進む
停止
ContinueDeployment が呼ばれるまで待つ。待機時間を過ぎるとデプロイは停止する

この挙動はデプロイグループの設定である。デプロイを作成するAPIには、この挙動を上書きする項目がない。 つまり、デプロイごとに自動と手動を切り替えたい場合は、CodeDeployの外側に判断の仕組みを置く必要がある。

当社の構成では、デプロイグループを常に「停止」に固定し、Step FunctionsでCodeDeployを包んでいる

Step FunctionsがCodeDeployのデプロイを作成してREADYまで待ち、実行時の入力が自動承認ならContinueDeploymentを呼んで本番を切り替え、手動なら担当者へ通知して承認を待ってから切り替える流れ図。待機時間を超えるとデプロイは停止する

インフラ側の設定(デプロイグループ)は変えずに、運用担当が実行時の入力で承認方式を選べる。 その代わり、Step Functionsのステートマシンという構成要素が1つ増える。

ECSネイティブ方式: 一時停止フックで止める

ECSのネイティブ方式では、デプロイの進行をライフサイクルの段階として扱い、段階ごとにフックを置ける。

フックの種類
動作
Lambdaフック
指定した段階でLambda関数を呼び、その結果で進め方を決める
一時停止フック
指定した段階でデプロイを止め、ContinueServiceDeployment で続行(CONTINUE)またはロールバック(ROLLBACK)を指示されるまで待つ

一時停止フックの主な仕様は次のとおりである。

  • テストトラフィックの切替後(POST_TEST_TRAFFIC_SHIFT)などの段階に置ける。テストトラフィックの切替中(TEST_TRAFFIC_SHIFT)と本番トラフィックの切替中(PRODUCTION_TRAFFIC_SHIFT)の段階には置けない
  • 止まった時点で、EventBridgeへ待機中を示すイベント(HOOK_AWAITING_ACTION)が送られる。通知の起点に使える
  • タイムアウトは既定で24時間、最大14日。タイムアウト時の既定動作はロールバックで、続行にも変更できる
  • 線形・カナリア戦略で本番トラフィック切替の直前(PRE_PRODUCTION_TRAFFIC_SHIFT)に置くと、切替の段階ごとに毎回止まる

確認のために止める仕組みそのものがECSに備わっているため、承認のためだけのオーケストレーションを別途持つ必要がない。

当社の構成では、CD処理がデプロイのたびにデプロイ設定(戦略、bake time、一時停止フック)を指定する。 重要なリリースでは一時停止フックを付け、通常の更新では付けない、という選択をデプロイ単位で行える。

4. 責務分離の比較

どちらの方式でも、インフラ管理とデプロイを分ける考え方は共通である。 インフラ管理は初期構成を作り、その後の更新はCI/CDが担う。違いは、デプロイの判断をどこに置くかに現れる。

責任主体
CodeDeploy方式
ECSネイティブ方式
インフラ管理(Terraform)
ECS、ALB、デプロイグループ、Step Functionsを作る。デプロイグループのREADY時挙動を「停止」に固定する
ECS、ALB、初期のデプロイ設定を作る。作成後のデプロイ設定は追わない
CI/CD
タスク定義を組み立て、Step Functionsを起動する
タスク定義を組み立て、デプロイ設定を指定してサービスを更新する
承認の判断
Step Functionsが実行時の入力で分岐する
CD処理が一時停止フックの有無を決め、担当者が続行かロールバックを指示する
切替の実行
CodeDeploy
ECS
運用担当
デプロイの起動と、手動承認時の承認
デプロイの起動と、一時停止時の続行・ロールバックの指示

ネイティブ方式で「作成後のデプロイ設定をTerraformが追わない」のは、デプロイ設定がデプロイのたびに変わる運用上の値になるためである。 Terraformは既定で、実際の設定と構成の差を検出して構成に合わせようとする。追い続けると、CDが指定した値を次のapplyで元に戻そうとし、インフラ管理とデプロイの責務がぶつかる。

環境変数とシークレットの値をインフラ管理から切り離す考え方は、ECSの設定値を3系統に分けるで独立して解説している。

5. どちらを選ぶか

判断の軸
CodeDeploy方式が合う場合
ECSネイティブ方式が合う場合
承認の制御
承認をデプロイグループ単位で固定してよい、または外側のオーケストレーションを既に持っている
デプロイごとに確認で止めるかを選びたい
構成要素の数
CodeDeployの運用に慣れている
構成要素を減らしたい
段階的な切替
CodeDeployの事前定義設定で線形・カナリアを使いたい
一括切替で足りる。段階的に切り替える場合は線形・カナリア戦略を検討する
既存の構成
既にCodeDeploy方式で運用しており、移行の必要が生じていない
新しく構築する

新しく構築する場合、承認で止める仕組みがECSに備わっていることは大きい。 承認のためだけにStep Functionsを置く理由がなくなり、デプロイの経路が短くなる。

一方、CodeDeploy方式で安定して運用している環境を、方式が新しくなったことだけを理由に移行する必要はない。 移行には、デプロイ経路とCI/CDの作り直しを伴うためである。

当社の構成は両方の方式を用意しており、既存の運用と承認の要件から選べるようにしている。

6. まとめ

論点
CodeDeploy方式
ECSネイティブ方式
切替の主体
CodeDeploy
ECS
確認で止める仕組み
READY時の挙動。デプロイグループに固定
一時停止フック。デプロイ設定で指定
デプロイごとの承認切替
外側のオーケストレーション(当社はStep Functions)で実現
CD処理がフックの有無を指定して実現
インフラ管理の範囲
デプロイグループの安全設定を固定する
初期構成だけを作り、デプロイ設定はCDに委ねる

Blue/Greenデプロイの設計で問われるのは、切替の技術そのものよりも、「誰が、どの時点で、本番へ進めてよいと判断するか」をどこに置くかである。 2つの方式は、その判断をデプロイグループの設定と外側の仕組みに置くか、デプロイ設定とECSのフックに置くかという違いとして整理できる。