ECSタスクを安全に終了させるためにSIGTERMをハンドリングする周りの情報

SIGTERMハンドリング

タスクが停止すると、各コンテナのエントリプロセス (通常は PID 1) に SIGTERM シグナルを送信します。タイムアウトが経過すると、今度は SIGKILL シグナルをプロセスに送信します。デフォルトでは、SIGTERM シグナルの送信後 30 秒のタイムアウトで SIGKILL シグナルを送信します。この値は、ECS タスクのパラメータの stopTimeout を更新することによってタスクのコンテナ単位で調整するか、ECS エージェントの環境変数 ECS_CONTAINER_STOP_TIMEOUT を設定して EC2 コンテナインスタンス単位で調整できます。この最初の SIGTERM シグナルを適切に処理して、正常にコンテナのプロセスを終了させる必要があります。SIGTERM シグナルを処理することを意識しておらずタイムアウトまでに終了しなかったプロセスは、SIGKILL シグナルが送信され、コンテナが強制的に停止されます。

ECS のアプリケーションを正常にシャットダウンする方法 | Amazon Web Services ブログ

基本的には、上記の通りSIGTERMをハンドリングすればいいので、その内容に応じてECSタスクのstopTimeout(MAX120秒)を決めればよい。

ECSがALB/NLB配下にある場合のSIGTERM送信遅延

ECSはタスク停止時にターゲットグループのヘルスチェックでタスクをdraining状態にするが、この時点からSIGTERMがコンテナに送られるまでにデフォルトで300秒(5分)の遅延がある。

これは変更可能でターゲットグループのderegistration_delay.timeout_secondsの値を変更すれば変更できる

まとめ

  1. タスク停止
  2. ターゲットグループ:deregistration_delay.timeout_seconds(デフォルト300秒)
  3. drain完了後SIGTERM送信
  4. ECSタスク定義:stopTimeout(デフォルト30秒)
  5. SIGKILL送信

デフォルトの状態だとタスク停止実行してから実際に停止までは合計5分半くらい猶予がある