Dev Study
AWSサービスの内部原理 コース

84. デプロイは健康なタスクの入れ替え算である — 最小/最大ヘルス率、そしてBlue/Greenのポインタ切り替え

新しいリビジョンへの移行を「制約付きの入れ替えアルゴリズム」として、2つのつまみ・丸めの落とし穴・失敗検知・そして環境ごと差し替えるBlue/Greenまで、図で追っていきます。

① 「健康なタスクの在庫」を保った入れ替え

desiredCount = 4維持したいタスク数
下限/上限と現状との差が動かせる余地になる
最小ヘルス率minimumHealthyPercent
desiredの%を切り上げ
最大率maximumPercent
desiredの%を切り下げ
2制約の隙間が
健康な下限下限を割らずに旧を止められるか?
存在の上限上限を超えずに新を起こせるか?
バッチ幅一度に動かせるタスク数
  • 公式定義: minimumHealthyPercent はデプロイ中に RUNNING 状態を維持しなければならないタスク数の下限。desiredCount に対する%で、切り上げ(rounded up)。
  • 公式定義: maximumPercent は RUNNING・STOPPING・PENDING 状態で許容されるタスク数の上限。desiredCount に対する%で、切り下げ(rounded down)。

デプロイは「健康な在庫の下限」と「総数の上限」に挟まれた隙間の中でしか進めない。min/maxはこの隙間の広さを決めるつまみで、隙間がバッチ幅そのものになる。

② 「先に止める」か「先に起こす」か

節約型min 50% / max 100%
desired=4 → 下限 4×50% ↑= 2
安全型min 100% / max 200%
desired=4 → 上限 4×200% ↓= 8
次のステップ
旧を2つ停止残り2=下限ちょうど
追加キャパシティ不要
新を4つ起動合計8=上限ちょうど
一時的にタスクが2倍
新を2つ起動残りも同様に繰り返す
旧を4つ停止一斉に世代交代
  • 公式例: desired=4・min50%・max100% では「先に既存タスクを2つ止めてクラスタ容量を空けてから、新タスクを2つ起動」。
  • 公式例: max200% では「先に新タスクを4つ起動してから旧4つを停止」(クラスタに必要なリソースがあることが前提)。
  • デフォルト: REPLICA は min 100% / max 200%(=安全型)。DAEMON は max 100%、min は CLI/SDK/API で 0%・マネジメントコンソールで 50%。

minを下げれば追加容量ゼロで回せ、maxを上げれば一瞬2倍の容量と引き換えに素早く安全に切り替わる。同じ「入れ替え」でも、どちらのつまみを緩めたかで挙動が正反対になる。

③ 丸めの向きが生む「詰み」設定

min 75%desired=2
max 125%desired=3
どちらも現状(desired)と同じ値になる
下限 = 22×75% = 1.5 ↑= 2
上限 = 33×125% = 3.75 ↓= 3
デプロイが1歩も進めない
1つも止められない「2つ維持」=現状と同じ
1つも起こせない「3つまで」=現状と同じ
デプロイがスタックservice event messageで通知
  • 公式警告: 「you should ensure that the scheduler can stop or start at least one task when a deployment is initiated」— デプロイ開始時に少なくとも1タスクを止める/起こせる設定にせよ。
  • スタック時の service event message: 「Update the minimumHealthyPercent or maximumPercent value and try again.」

丸めの向き(min=切り上げ・max=切り下げ)を頭に入れないと、「少なくとも1つは動かせる」という前提が崩れてデプロイが停止する。設定後は必ず、下限<現状 または 上限>現状 のどちらかが成り立つか検算する。

④ 失敗検知 — サーキットブレーカーとCloudWatchアラーム

デプロイ進行中新リビジョンへ入れ替え中
いずれかが失敗条件を満たした時点で失敗確定(併用なら早い方)
サーキットブレーカー新タスクが起動できない事実で失敗と判定
CloudWatchアラーム連動エラー率・レイテンシ等のメトリクスがアラーム状態に入ったら失敗
自動ロールバック前のサービスリビジョンへ
  • 公式ガイドライン: サーキットブレーカーは「タスクが起動できないときにデプロイを止めたい」場合、CloudWatchアラームは「アプリケーションのメトリクスに基づいて止めたい」場合に使う。
  • 併用時: 「the deployment is set to failed as soon as the failure criteria for either failure method is met」— どちらかの失敗条件が成立した時点で即失敗。
  • 両方式とも、前のサービスリビジョンへのロールバックに対応。

サーキットブレーカーは「起動できたか」という配置レベルの事実で、CloudWatchアラームは「アプリが正常に振る舞えているか」というメトリクスで失敗を判定する。可観測性編で見たアラームのFSM(OK/ALARM/INSUFFICIENT_DATA)が、そのままデプロイを止める制御入力になる統合の実例。

⑤ デプロイ中もイメージは混ざらない(version consistency)

repo/app:latestタグ=可変の名札
以後の全タスク・将来のサービス更新にも同じダイジェストを使用
ダイジェスト確定repo/app@sha256:abc…
最初のタスクが確定=指紋
デプロイ中に latest が別の中身を指しても
task@sha256:abc…
task@sha256:abc…
task@sha256:abc…
task@sha256:abc…
世代に混入しないversion consistency(デフォルトで有効)
  • 公式記述: デプロイ中に最初に起動したタスクがイメージダイジェストを確定し、ECS は以後の全タスクの起動と将来のサービス更新にそのダイジェストを使用 → 1サービスの全タスクが常に同一イメージ(version consistency)。デフォルトで有効。
  • 挙動はコンテナ定義の versionConsistency パラメータで制御可能。
  • 例外: ダイジェストの確定に3回以上失敗すると、デプロイはダイジェスト解決なしで続行される(サーキットブレーカー有効時は、さらにデプロイ失敗+ロールバック扱いになる)。

「タグは動くが指紋は動かない」を運用側で徹底するのがversion consistency。デプロイという一番危ない瞬間でも、1つのサービスの全タスクが物理的に同一のイメージを走らせることが保証される。

⑥ Blue/Green — 2部作って「参照だけ」差し替える

Listener / Ruleトラフィックの参照ポインタ
① ライフサイクルフック(各段階でLambda検証/一時停止)
blueTarget Group=現行リビジョン
本番トラフィック
greenTarget Group=新リビジョン
テストトラフィックで事前検証可
② 切替後も blue を生かしておく
traffic shiftポインタをgreenへ一斉切替
③ 問題の有無で分岐
bake timeblue/greenが並走する観察期間
問題なしbake経過で完了・blue停止
問題ありポインタをblueへ即戻す=高速ロールバック
  • 公式定義: bake time =「本番トラフィックのシフト後、blueとgreenの両サービスリビジョンが同時に走っている期間」。「the blue revision is kept running until the bake time expires」。
  • Lifecycle hook = 特定のライフサイクル段階でのLambda関数または一時停止ポイント。Pauseフックは ContinueServiceDeployment を呼ぶまで停止。
  • 代償: 「may double your resource usage during deployments」— デプロイ中は資源使用量が2倍になり得る。
  • 2系統ある: ECSデプロイコントローラ自体が rolling / blue/green / linear / canary をサポート。別系統として CODE_DEPLOY コントローラ(CodeDeploy製のBlue/Greenモデル)もある。linear=等しい割合ずつ段階的にシフト、canary=まず少量、次に残り全部。

Blue/Greenは「環境を2つ用意し、トラフィックというポインタを1回で差し替える」アトミック更新。bake timeの間は旧環境という「元のデータ」を捨てずに持ち続けるので、ロールバックはポインタを戻すだけの定数時間操作になる。資源が一瞬2倍になるのが、この安全性の代償。

⑦ 全体を貫く軸(基礎概念との接続)

min/maxの入れ替え在庫制約付きスケジューリング問題
丸めの詰み切り上げ/切り下げという離散化が生む境界バグ
version consistencyレッスン3「タグは名札・ダイジェストは指紋」の実践
サーキットブレーカー分散システムの定番パターンが名前ごと採用された例
アラーム連動可観測性編のアラームFSMがデプロイの制御入力になる統合
Blue/Greenイミュータブルデプロイ=アトミックなポインタ差し替えの集大成

デプロイ編の各機構は、これまで学んだ基礎概念の実装例として読み直せる。個別の設定項目ではなく「制約・離散化・不変性・ポインタ」という軸で覚えると応用が利く。

公式ドキュメントで詳しく ↗