はじめに
2026 年 5 月 19 日、AWS は Amazon ECS のサービスデプロイメントに対して一時停止・再開コントロール機能を発表しました。
ECS 上でサービスをデプロイしている方は、これまで手動の承認ステップや外部バリデーションをどのように組み込んでいたでしょうか。ECS のデプロイは一度開始すると自動的に進行するため、人間の判断を挟むには CodePipeline などの外部ツールを別途用意する必要がありました。今回のアップデートはこの課題に直接応えるものです。
なお、本機能は追加コストなしで利用できます。
本記事では「何が変わったのか」「どんな仕組みで動くのか」「どう設定するのか」「どんな場面で使えるのか」を中心に解説します。ECS 上でサービスのデプロイを担当しているエンジニアはぜひ読んでみてください。
何が変わったのか
| 項目 | Before | After |
|---|---|---|
| デプロイ中の一時停止 | ネイティブ機能では不可 | 任意のステージで一時停止可能 |
| 手動承認ゲートの組み込み | CodePipeline 等の外部ツールが必要 | ECS ネイティブで完結 |
| 一時停止中の通知・自動化 | 外部ツール側で実装 | EventBridge イベントをトリガーに利用可能 |
| タイムアウト・フォールバック制御 | 外部ツール依存 | 最大 14 日間・タイムアウト時のアクションも設定可能 |
| 既存 ECS 機能との併用 | 複雑な統合が必要 | CloudWatch アラーム・サーキットブレーカー等はそのまま継続動作 |
従来の課題
ECS のデプロイは一度開始すると自動的に進行する仕組みになっています。そのため「ステージング環境での確認が取れてから本番に進みたい」「カナリアで一部トラフィックを流した後、エラーレートを目視確認してから残りを切り替えたい」「本番リリースにはリリースマネージャーの承認を必須にしたい」といった場面では、AWS CodePipeline などの外部オーケストレーションツールを別途用意する必要がありました。
外部ツールを経由すること自体は実現できても、ECS が持つマネージドトラフィックシフトやベイクタイム、高速ロールバックといったネイティブ機能と組み合わせると設定が複雑になりがちで、構築・維持のコストも無視できませんでした。「承認フローだけ組みたいのに、パイプライン全体を作る羽目になった」という経験をお持ちの方も多いのではないでしょうか。
PAUSE フックによる解決
ECS サービスのデプロイ設定に新しい PAUSE ライフサイクルフックを追加することで、外部ツールへの依存なしに手動承認ゲートや外部バリデーションをデプロイパイプラインに組み込めるようになりました。デプロイが一時停止すると Amazon EventBridge にイベントが発行されるため、Slack 通知や承認ワークフローなど既存の仕組みとの連携も容易です。
rolling・blue/green・linear・canary の全デプロイ戦略に対応しており、CloudWatch アラームやデプロイサーキットブレーカーといった ECS ネイティブ機能は一時停止中も引き続き動作します。仕組みの詳細は次章で解説します。
機能の仕組み
PAUSE フックがどのように動作するのかを、デプロイの流れに沿って解説します。
デプロイが一時停止するまでの流れ
PAUSE フックが設定されたライフサイクルステージにデプロイが到達すると、以下の順序で処理が進みます。
- Amazon ECS がその一時停止に対して固有の
hookIdを生成する - detail-type
ECS Hook State Change、イベント名HOOK_AWAITING_ACTIONの EventBridge イベントが発行される -
ContinueServiceDeploymentAPI にhookIdとアクション(CONTINUEまたはROLLBACK)を渡すか、タイムアウトに達するまでデプロイが停止した状態を維持する
hookId は DescribeServiceDeployments を呼び出すことで取得できます。レスポンスの lifecycleHookDetails 配列に、フックのステータスや有効期限が含まれています。
{
"serviceDeployments": [
{
"lifecycleHookDetails": [
{
"hookId": "ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw",
"targetType": "PAUSE",
"status": "AWAITING_ACTION",
"expiresAt": "2024-01-15T12:00:00Z",
"timeoutAction": "ROLLBACK"
}
]
}
]
}
設定できるライフサイクルステージ
PAUSE フックは以下のステージに設定できます。なお TEST_TRAFFIC_SHIFT と PRODUCTION_TRAFFIC_SHIFT には設定できないため注意が必要です。
| ライフサイクルステージ | タイミング |
|---|---|
RECONCILE_SERVICE |
サービスの調整処理の前後 |
PRE_SCALE_UP |
新バージョンのタスクをスケールアップする前 |
POST_SCALE_UP |
新バージョンのタスクのスケールアップ完了後 |
POST_TEST_TRAFFIC_SHIFT |
テストトラフィックのシフト完了後 |
PRE_PRODUCTION_TRAFFIC_SHIFT |
本番トラフィックをシフトする前 |
POST_PRODUCTION_TRAFFIC_SHIFT |
本番トラフィックのシフト完了後 |
EventBridge イベント
一時停止の状態遷移に応じて、detail-type ECS Hook State Change の EventBridge イベントが発行されます。このイベントを起点に Lambda や Step Functions、SNS など任意のターゲットへルーティングできます。
| イベント名 | 内容 |
|---|---|
HOOK_IN_PROGRESS |
フックの処理が開始された |
HOOK_AWAITING_ACTION |
ContinueServiceDeployment の呼び出しを待機中 |
HOOK_SUCCEEDED |
CONTINUE で続行された |
HOOK_FAILED |
ROLLBACK でロールバックされた |
HOOK_TIMED_OUT |
タイムアウトまでに呼び出しがなかった |
以下は HOOK_AWAITING_ACTION イベントの例です。hookId や lifecycleStage、expiresAt などが含まれており、承認ワークフローや自動化システムのトリガーとして活用できます。
{
"detail-type": "ECS Hook State Change",
"source": "aws.ecs",
"detail": {
"eventName": "HOOK_AWAITING_ACTION",
"hookId": "ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw",
"hookType": "PAUSE",
"expiresAt": "2024-01-15T12:00:00Z",
"lifecycleStage": "POST_TEST_TRAFFIC_SHIFT",
"clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/my-cluster",
"serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
"serviceDeploymentArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28"
}
}
linear・canary デプロイでの挙動
linear・canary デプロイにおいて PRE_PRODUCTION_TRAFFIC_SHIFT に PAUSE フックを設定している場合、トラフィックシフトの各ステップごとにフックが発火し、それぞれ固有の hookId が生成されます。ステップ数分だけ ContinueServiceDeployment の呼び出しが必要になる点に注意してください。
たとえばトラフィックシフトを 5 ステップに分けた linear デプロイでは、デプロイ中に合計 5 回の一時停止が発生します。各ステップで承認操作が必要になるため、運用フローを事前に設計しておくことが重要です。
タイムアウトの動作
ContinueServiceDeployment が呼び出されないままタイムアウトに達した場合、設定したアクションが自動的に実行されます。
-
ROLLBACK(デフォルト)— 直前のサービスリビジョンにロールバックする -
CONTINUE— 次のライフサイクルステージへ進む
タイムアウト時間のデフォルトは 24 時間、最大は 14 日間です。タイムアウトまでの残り時間は、DescribeServiceDeployments レスポンスの expiresAt フィールドで確認できます。
設定手順
PAUSE フックの設定
PAUSE フックはサービスのデプロイ設定(deploymentConfiguration)の lifecycleHooks に追加します。以下は blue/green デプロイでテストトラフィックのシフト完了後に一時停止する設定例です。
{
"deploymentConfiguration": {
"strategy": "BLUE_GREEN",
"lifecycleHooks": [
{
"targetType": "PAUSE",
"lifecycleStages": [
"POST_TEST_TRAFFIC_SHIFT"
],
"timeoutConfiguration": {
"timeoutInMinutes": 10,
"action": "ROLLBACK"
}
}
]
}
}
設定フィールドの詳細は以下のとおりです。
| フィールド | 説明 | 設定可能な値 | 必須 |
|---|---|---|---|
targetType |
フックの種別。PAUSE フックでは PAUSE を指定する |
PAUSE |
✓ |
lifecycleStages |
一時停止するライフサイクルステージ(複数指定可) |
RECONCILE_SERVICE PRE_SCALE_UP POST_SCALE_UP POST_TEST_TRAFFIC_SHIFT PRE_PRODUCTION_TRAFFIC_SHIFT POST_PRODUCTION_TRAFFIC_SHIFT
|
✓ |
timeoutConfiguration.timeoutInMinutes |
タイムアウトまでの時間(分)。デフォルトは 1,440 分(24 時間) | 1 〜 20,160(最大 14 日間) | — |
timeoutConfiguration.action |
タイムアウト時に実行されるアクション。デフォルトは ROLLBACK
|
ROLLBACK CONTINUE
|
— |
設定は ECS コンソール・AWS CLI・SDK のほか、CloudFormation・CDK・Terraform といった IaC ツールからも行えます。
デプロイの続行・ロールバック
デプロイが一時停止(AWAITING_ACTION)した状態になったら、ContinueServiceDeployment を呼び出してアクションを指定します。
まず describe-service-deployments で hookId を取得します。
aws ecs describe-service-deployments \
--service-deployment-arn arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28
取得した hookId を使ってデプロイを続行する場合は以下のコマンドを実行します。
aws ecs continue-service-deployment \
--hook-id ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw \
--action CONTINUE
ロールバックする場合は --action ROLLBACK を指定します。
aws ecs continue-service-deployment \
--hook-id ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw \
--action ROLLBACK
ECS コンソールから操作する場合は、対象サービスの Deployments タブを開き、フックのステータスが Awaiting action になっていることを確認した上で Take Action から Continue または Roll back を選択します。
設定時のポイント
- タイムアウトアクションはデフォルトが
ROLLBACKですが、本番環境では明示的に指定しておくと設定の意図がコードに残ります -
ContinueServiceDeploymentの呼び出し権限は IAM で承認担当者に限定してください。意図しない続行操作を防ぐためです - API 呼び出しは CloudTrail に記録されます。誰がいつ操作したかの証跡として活用してください
- PAUSE フックの設定は IaC で管理することで、設定のドリフトを防止できます
- 1 サービスあたりの PAUSE フック上限は 10 個です。複数のステージに設定する場合は上限に注意してください
活用シナリオ
PAUSE フックは「デプロイの途中で何かを確認・実行したい」という幅広いニーズに対応できます。代表的な 3 つのシナリオを紹介します。
シナリオ① 手動承認ワークフロー
本番環境へのデプロイ前にシニアエンジニアやリリースマネージャーの承認を必須にしたいケースです。PRE_PRODUCTION_TRAFFIC_SHIFT に PAUSE フックを設定することで、本番トラフィックの切り替え直前にデプロイを止めて承認ゲートを設けられます。
{
"deploymentConfiguration": {
"strategy": "BLUE_GREEN",
"lifecycleHooks": [
{
"targetType": "PAUSE",
"lifecycleStages": ["PRE_PRODUCTION_TRAFFIC_SHIFT"],
"timeoutConfiguration": {
"timeoutInMinutes": 480,
"action": "ROLLBACK"
}
}
]
}
}
デプロイが一時停止すると EventBridge イベントが発行されます。このイベントを Lambda でハンドリングし、hookId を含む承認依頼を Slack や JIRA に通知することで、承認者が CLI またはコンソールからアクションを実行するだけの運用フローを組めます。タイムアウトは承認の運用時間を考慮して設定してください。上記の例では 8 時間(480 分)に設定しています。
シナリオ② 統合テストの自動実行
blue/green デプロイで Green スタックを立ち上げた後、本番トラフィックを切り替える前に自動統合テストを実行したいケースです。POST_TEST_TRAFFIC_SHIFT に PAUSE フックを設定し、テストの結果に応じて続行・ロールバックを自動判定します。
{
"deploymentConfiguration": {
"strategy": "BLUE_GREEN",
"lifecycleHooks": [
{
"targetType": "PAUSE",
"lifecycleStages": ["POST_TEST_TRAFFIC_SHIFT"],
"timeoutConfiguration": {
"timeoutInMinutes": 30,
"action": "ROLLBACK"
}
}
]
}
}
EventBridge イベントを受け取った Lambda がテストスイートを実行し、結果に応じて ContinueServiceDeployment を呼び出します。テスト成功時は --action CONTINUE、失敗時は --action ROLLBACK を指定することで、人手を介さない検証ステップをデプロイパイプラインに組み込めます。タイムアウトはテスト実行時間に余裕を持たせた値を設定してください。
シナリオ③ カナリアリリースの段階的な確認
canary デプロイで段階的にトラフィックを新バージョンへ移行する際、各ステップでオペレーターがメトリクスを確認してから次のステップに進みたいケースです。PRE_PRODUCTION_TRAFFIC_SHIFT に PAUSE フックを設定します。
{
"deploymentConfiguration": {
"strategy": "CANARY",
"lifecycleHooks": [
{
"targetType": "PAUSE",
"lifecycleStages": ["PRE_PRODUCTION_TRAFFIC_SHIFT"],
"timeoutConfiguration": {
"timeoutInMinutes": 60,
"action": "ROLLBACK"
}
}
]
}
}
3 章で触れたとおり、canary デプロイでは各トラフィックシフトのステップごとにフックが発火し、固有の hookId が生成されます。たとえば 10% → 50% → 100% の 3 ステップ構成であれば、デプロイ中に合計 3 回の一時停止が発生します。各停止のタイミングで CloudWatch ダッシュボードやエラーレートを確認し、問題があればその場でロールバックを実行できます。
まとめ
PAUSE フックにより、これまで外部ツールに委ねていた承認・バリデーションのステップを ECS の設定内で管理できるようになりました。既存のデプロイ機能はそのままに、制御の粒度だけを上げられるのが実際の利点です。
設定は IaC ツールから行えるため、現在の運用フローへの影響は最小限に抑えられます。追加コストも発生しません。
linear・canary デプロイでの利用について
PRE_PRODUCTION_TRAFFIC_SHIFTに PAUSE フックを設定した場合、トラフィックシフトの各ステップごとにフックが発火します。ステップ数分の承認操作が必要になるため、運用フローを事前に設計した上で導入してください。