Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ECSの理解を深めよう!ECSタスクのライフサイクルと停止シグナルについて

 ECSの理解を深めよう!ECSタスクのライフサイクルと停止シグナルについて

Avatar for ukita hiroki

ukita hiroki

March 01, 2026
Tweet

Other Decks in Technology

Transcript

  1. 1 Copyright(C) NRI Netcom, Ltd. All rights reserved. ◼ 浮田

    博揮 (UKITA Hiroki) ⚫ NRIネットコム株式会社 NTシステム事業二部 ◼ AWSを利用したシステムのインフラ開発・運用に従事 ◼ ブログ ⚫ NLBはなぜ暖機運転が不要なのか 〜NLBの裏で動くサービスの解説〜 ⚫ Amazon ECS(Fargate)でパケットをキャプチャする ⚫ AWS Network Firewallとそのルールグループについて解説する 自己紹介 https://tech.nri-net.com/archive/author/h-ukita ↓カワイイネコチャン
  2. 2 Copyright(C) NRI Netcom, Ltd. All rights reserved. はじめに 01

    ECSタスクのライフサイクル 02 ECSタスクの停止シグナル 03 さいごに 04
  3. 4 Copyright(C) NRI Netcom, Ltd. All rights reserved. なぜECSタスクのライフサイクルを知ることが大切なのか ◼

    Amazon ECS(以下、ECS)使っていますか? ◼ ECSタスクが起動時に何をして、どのように終了するのか知っている人はいますか? ◼ ECSタスクは日々、起動 → 終了を繰り返している ⚫ アプリケーションのバージョンを新しくする ⚫ スケールイン / スケールアウト ⚫ ヘルスチェックに失敗した ⚫ AWSのメンテナンス ⚫ など… ◼ 目的 ⚫ ECSタスクのライフサイクルを理解する • 状態遷移をみるだけで原因を推測できるようにし、トラブルシューティングをしやすくする ⚫ ECSタスクが停止するときの内部動作について理解する • 安全にECSタスクを停止させることで、コネクション切断やログの欠損がないアプリケーションを構築・運用する はじめに
  4. 6 Copyright(C) NRI Netcom, Ltd. All rights reserved. ECSの構成要素 ECSタスクのライフサイクル

    コンテナ タスク定義 ECSクラスター ECSサービス ECSタスク 参照 コンテナの詳細な設定を行う ・使用するDockerイメージ ・CPUとメモリの設定 ・環境変数やログの設定 ECSサービスやECSタスクを 論理グループ化する タスクの管理を行う ・必要なタスク数 ・デプロイの設定 ・ネットワークの設定 タスク定義に基づき コンテナ群を実行する ENI 仮想ネットワーク インターフェースのこと awsvpc利用時、 ECSタスクに1つのENIが 紐付く
  5. 7 Copyright(C) NRI Netcom, Ltd. All rights reserved. 検証方法と検証環境 ◼

    検証方法 ⚫ CloudShellでECSタスクの詳細を取得するスクリプトを流す • 昔、作成したスクリプトがあったので流用 • ECSタスクの詳細を取得し、差分があればファイルに保存する • ECSタスクを起動、終了させる ⚫ 補足)王道は、EventBridgeを使うこと • EventBridgeでECSタスクの状態が変わったことを検知1) • 状態が変わるたびに ECSタスクの詳細をCloudWatch Logsに送信 ◼ 検証環境 ⚫ AWS Fargate ⚫ プラットフォームバージョンは1.4.0 ⚫ ネットワークモードはawsvpc ⚫ ALBと紐づけたECSタスクを起動する • ECSタスクだけを起動すると 「ACTIVATING」と「DEACTIVATING」に遷移しないため ECSタスクのライフサイクル 1) Amazon Elastic Container Service events, https://docs.aws.amazon.com/eventbridge/latest/ref/events-ref-ecs.html コンテナ ECSタスク ALB CloudShell aws ecs describe-tasks
  6. 8 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルの流れ ECSタスクのライフサイクル

    PROVISIONING プロビジョニング PENDING 保留中 ACTIVATING アクティブ化中 DEACTIVATING 非アクティブ化中 STOPPING 停止中 DEPROVISIONING プロビジョニング 解除中 RUNNING 実行中 STOPPED 停止済み
  7. 9 Copyright(C) NRI Netcom, Ltd. All rights reserved. PROVISIONING ◼

    ENIをプロビジョニングしている状態 ◼ ENIにもサイクルがあり、 ECSタスクのPROVISIONINGでは PRECREATED 〜 ATTACHEDが行われる ⚫ PRECREATED ⚫ CREATED ⚫ ATTACHING ⚫ ATTACHED ⚫ DETACHING ⚫ DETACHED ⚫ DELETED ◼ PRECREATED → CREATED ⚫ ECSタスクにENIをアタッチする ⚫ コンテナはENIを参照している ◼ CREATED → ATTACHING ⚫ tasks.attachments.status以外の変化はなし ◼ ATTACHING → ATTACHED ⚫ tasks.attachments.status以外の変化はなし ECSタスクのライフサイクル
  8. 10 Copyright(C) NRI Netcom, Ltd. All rights reserved. PENDING ◼

    ECSがエージェントに命令を送り、必要なリソースが揃うまで待機している状態 ◼ CPUやメモリを確保する ◼ 認証情報を準備する ⚫ コンテナイメージをプルするのに利用するため、ecsTaskExecutionRoleにAssume Roleし、一時認証情報を生成する ECSタスクのライフサイクル
  9. 11 Copyright(C) NRI Netcom, Ltd. All rights reserved. ACTIVATING ◼

    コンテナに関する設定を行う状態 ◼ コンテナイメージをプルする ⚫ プルを開始した時間 ⚫ プルが終了した時間 ◼ タスクのネットワークを設定する ◼ コンテナを起動する ◼ ロードバランサーのターゲットグループに 登録する ECSタスクのライフサイクル
  10. 12 Copyright(C) NRI Netcom, Ltd. All rights reserved. RUNNING ◼

    ECSタスクを正常に実行している状態 ◼ ECSのコントロールプレーンと エージェントを接続する ⚫ 接続した日付が記録される ◼ ECSタスクが開始した時刻が記録される ECSタスクのライフサイクル
  11. 13 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルの流れ ECSタスクのライフサイクル

    PROVISIONING プロビジョニング PENDING 保留中 ACTIVATING アクティブ化中 DEACTIVATING 非アクティブ化中 STOPPING 停止中 DEPROVISIONING プロビジョニング 解除中 RUNNING 実行中 STOPPED 停止済み ENIを作成しアタッチ CPUやメモリなどの 必要なリソースを確保 ECSタスクを正常に実行 ターゲットグループに登録を 行う コンテナイメージをプルし、 コンテナを起動する
  12. 14 Copyright(C) NRI Netcom, Ltd. All rights reserved. DEACTIVATING ◼

    ロードバランサーのターゲットグループの登録を解除している状態 ◼ ECSタスクが停止した理由が記載されている ⚫ 今回はAWSコンソールのECSサービスからECSタスクの数を0に変更した ECSタスクのライフサイクル
  13. 15 Copyright(C) NRI Netcom, Ltd. All rights reserved. STOPPING ◼

    エージェントがコンテナに対して、停止を要求している状態 ◼ tasks.lastStatus以外の変化はなし ◼ コンテナがどのように停止するかは後述します ECSタスクのライフサイクル
  14. 16 Copyright(C) NRI Netcom, Ltd. All rights reserved. DEPROVISIONING ◼

    ENIをデタッチし、削除する ◼ コンテナのステータスと終了コード、 終了時刻が記録される ECSタスクのライフサイクル
  15. 17 Copyright(C) NRI Netcom, Ltd. All rights reserved. STOPPED ◼

    ECSタスクが正常に停止した状態 ◼ ECSタスクの停止時間が記録される ECSタスクのライフサイクル
  16. 18 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルの流れ ECSタスクのライフサイクル

    PROVISIONING プロビジョニング PENDING 保留中 ACTIVATING アクティブ化中 DEACTIVATING 非アクティブ化中 STOPPING 停止中 DEPROVISIONING プロビジョニング 解除中 RUNNING 実行中 STOPPED 停止済み ENIを作成しアタッチ CPUやメモリなどの 必要なリソースを確保 ターゲットグループに登録を 行う コンテナイメージをプルし、 コンテナを起動する ECSタスクを正常に実行 ENIをデタッチし削除 コンテナに停止を要求する ターゲットグループの登録を 解除する ECSタスクを正常に停止
  17. 19 Copyright(C) NRI Netcom, Ltd. All rights reserved. ライフサイクルの流れ(ELBを紐付けずECSタスク単体で起動した場合) ECSタスクのライフサイクル

    PROVISIONING プロビジョニング PENDING 保留中 ACTIVATING アクティブ化中 DEACTIVATING 非アクティブ化中 STOPPING 停止中 DEPROVISIONING プロビジョニング 解除中 RUNNING 実行中 STOPPED 停止済み ENIを作成しアタッチ CPUやメモリなどの 必要なリソースを確保 ターゲットグループに登録を 行う コンテナイメージをプルし、 コンテナを起動する ECSタスクを正常に実行 ENIをデタッチし削除 コンテナに停止を要求する ターゲットグループの登録を 解除する ECSタスクを正常に停止
  18. 21 Copyright(C) NRI Netcom, Ltd. All rights reserved. 停止シグナルの概要 ◼

    ECSタスクのライフサイクル「STOPPING」で、コンテナに対して停止を要求する ◼ プロセスID1がSIGTERM(優雅に終了)を受け取り処理する ◼ 処理が終わるまでデフォルトで30秒待機する ◼ その後、SIGKILL(強制終了)を送信しコンテナを強制終了させる ECSタスクの停止シグナル 引用) Graceful shutdowns with ECS, https://aws.amazon.com/jp/blogs/containers/graceful-shutdowns-with-ecs/ シグナルとは… 特定のイベントを プロセスに通知すること
  19. 22 Copyright(C) NRI Netcom, Ltd. All rights reserved. PID1とは ◼

    PIDはOSが識別するための番号で、PID1はOSの最初のプロセスのこと ◼ コンテナのベストプラクティスは、1つのコンテナに1つのプロセスを起動すること ◼ 起動したメインプロセスがコンテナのPID1になります(例外あり) ◼ 例えば、DockerHubにあるNginxイメージのプロセスを調べると、 PID1は「nginx: master process nginx -g daemon off;」です ◼ このPID1にシグナルが送信されます ECSタスクの停止シグナル ← ここにシグナルが送信される
  20. 23 Copyright(C) NRI Netcom, Ltd. All rights reserved. メインプロセスを正常に終了させる ◼

    メインプロセスをGraceful Shutdown(進行中の処理を完了してから終了すること)させることが重要 ◼ メインプロセス側でシグナルを処理できるようにする ◼ メインプロセスがSIGTERMでGraceful Shutdownできる場合 ⚫ 問題なし ◼ できない場合 ① dockerfileでSTOPSIGNALを定義する(おすすめ) ② アプリケーションやラッパースクリプトでシグナルハンドリングする ECSタスクの停止シグナル Nginxコンテナ 引用)Controlling nginx, https://nginx.org/en/docs/control.html SIGQUITで Graceful Shutdownするよ 他にも StopTimeoutの時間が短いと アプリケーションの処理が終わらずに コンテナが強制終了する可能性が あるので注意が必要
  21. 24 Copyright(C) NRI Netcom, Ltd. All rights reserved. メインプロセスを正常終了させる ◼

    ① dockerfileでSTOPSIGNALを定義する ◼ dockerfileでSTOPSIGNALを定義する ◼ コンテナを停止するときに、定義したシグナルがPID1に送信される ◼ DockerHubにあるNginxコンテナイメージには、 STOPSIGNALにSIGQUITシグナルが設定されているため graceful shutdownする ◼ AWS Fargateは、2025年10月にDockerfileで定義したSTOPSIGNALをコンテナに送れるようになった ECSタスクの停止シグナル 引用) https://hub.docker.com/layers/library/nginx/latest 参考)Amazon ECS が AWS Fargate でのカスタムのコンテナ停止シグナルのサポートを開始 , https://aws.amazon.com/jp/about-aws/whats-new/2025/12/amazon-ecs-custom-container-stop-signals-fargate/
  22. 25 Copyright(C) NRI Netcom, Ltd. All rights reserved. メインプロセスを正常終了させる ◼

    ②アプリケーションやラッパースクリプトでシグナルハンドリングする ◼ アプリケーション側でシグナルハンドリングする ⚫ アプリケーション独自のクリーンアップを行える • リクエストが完了するまで待機する • DBのコネクションをクローズする • ログをflushする ◼ ラッパースクリプトでシグナルハンドリングする ⚫ PID1にbashなどのスクリプトを起動させ、スクリプトでシグナルハンドリングとメインプロセスの起動を行う ECSタスクの停止シグナル #!/bin/bash // SIGTERMを受け取ったときの処理を記載する function signal_handling(){ // hogeのプロセスにSIGQUITを送信する kill –QUIT hoge_pid } // SIGTERMを受け取るとsignal_handling関数を実行する trap signal_handling SIGTERM // hogeアプリケーションを起動する exec hoge
  23. 27 Copyright(C) NRI Netcom, Ltd. All rights reserved. まとめ ◼

    ECSタスクのライフサイクル ⚫ PROVISIONING ⚫ PENDING ⚫ ACTIVATING ⚫ RUNNING ⚫ DEACTIVATING ⚫ STOPPING ⚫ DEPROVISIONING ⚫ STOPPED ◼ ECSタスクの停止シグナル(ライフサイクルのSTOPPINGに該当) ⚫ SIGTERMを受け取りStopTimeoutの期間(30秒)待機する ⚫ その後、SIGKILLが送信され、ECSタスクが強制終了する ⚫ そのため、メインプロセスの処理がStopTimeout内に終わることが重要 ⚫ また、 Graceful Shutdownによりメインプロセスを正常終了させることが重要 • メインプロセスがSIGTERMでGraceful Shutdownする場合は問題ない • 別シグナルでGraceful Shutdownする場合は以下の対応を行う • dockerfileでSTOPSIGNALを定義する • アプリケーションやラッパースクリプトでシグナルをハンドリングする さいごに