0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon ECS がサービスデプロイの一時停止と継続の制御を導入

0
Posted at

はじめに

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 フックが設定されたライフサイクルステージにデプロイが到達すると、以下の順序で処理が進みます。

  1. Amazon ECS がその一時停止に対して固有の hookId を生成する
  2. detail-type ECS Hook State Change、イベント名 HOOK_AWAITING_ACTION の EventBridge イベントが発行される
  3. ContinueServiceDeployment API に hookId とアクション(CONTINUE または ROLLBACK)を渡すか、タイムアウトに達するまでデプロイが停止した状態を維持する

hookIdDescribeServiceDeployments を呼び出すことで取得できます。レスポンスの 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_SHIFTPRODUCTION_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 イベントの例です。hookIdlifecycleStageexpiresAt などが含まれており、承認ワークフローや自動化システムのトリガーとして活用できます。

{
    "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-deploymentshookId を取得します。

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 フックを設定した場合、トラフィックシフトの各ステップごとにフックが発火します。ステップ数分の承認操作が必要になるため、運用フローを事前に設計した上で導入してください。


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?