AWS ECSのタスクが停止理由『Essential container in task exited』で停止したので、その際の対応についてメモ書きします。
ログも出力されないので、原因の特定に時間がかかりました。
結論
ECSのタスク定義に設定したECRのイメージが本来使用しようとしていたものと違っていた(※)ので、当エラーが発生していました。
※ 本来はAPIを受け付けるイメージをタスクに設定する予定だったのですが、誤ってCMD定義のない別のイメージをプッシュしていました。
基本的に、Essential container in task exited が発生しても、exitCode 0 (終了コード 0) なら特にエラーは発生していないようです。(終了コードの詳細と確認方法については下記に記載しています)
今回の事象ではexitCode 0となっていましたので、ECSの設定に間違いはなく、アプリ側の誤りかと思い調査したところ今回のミスを発見しました。
一般的な終了コード
下記はマニュアルの一般的な終了コード
の抜粋です。
0 – Entrypoint、success、または CMD が実行を完了しているため、コンテナが停止しています。
1 – アプリケーションエラーを表します。詳細については、アプリケーションログを確認してください。
137 – タスクがコンテナの強制終了 (SIGKILL) であった場合に発生します。
SIGKILL が送信された後、デフォルトの 30 秒以内に SIGTERM に応答できない場合、コンテナは強制停止します。デフォルトの 30 秒の期間は、ECS_CONTAINER_STOP_TIMEOUT パラメータを使用して ECS コンテナエージェントで設定できます。
これはメモリ不足 (OOM) の状況でも発生する可能性があります。CloudWatch メトリクスを確認して、OOM が発生したかどうかを確認します。
139 – セグメンテーション違反が発生した場合に発生します。使用できないメモリ領域にアプリケーションがアクセスしようとしたか、未設定または無効な環境変数がある可能性があります。
255 – コンテナ内の ENTRYPOINT CMD コマンドがエラーにより失敗した場合に発生します。CloudWatch ログを確認してください
調査に便利なコマンド
tracerコマンドを使うとECSタスクの実行状態を簡単に確認できて便利です。
上記の終了コードの確認もこちらのツールで行えます。
macの場合は下記コマンドでインストールできます。
$ brew install fujiwara/tap/tracer
コマンドは tracer "クラスターID" "タスクID"
のように指定して実行します。
タスクIDはコマンドtracer "クラスターID"
で確認できます。
クラスターIDはマネージメントコンソールでAmazon Elastic Container Service
にアクセスし、クラスター
に移動した先のクラスター
欄のものが対象となります。
当コマンド実行には環境変数AWS_REGION
に確認対象のリージョンを指定する必要があります。
$ export AWS_REGION=ap-northeast-1
$ tracer test-Cluster 1234567890abcde
2023-01-26T17:10:01.439+01:00 TASK Created
2023-01-26T17:10:01.470+01:00 SERVICE (service test-Service) has started 1 tasks: (task 1234567890abcde).
2023-01-26T17:10:04.472+01:00 TASK Connected
2023-01-26T17:10:14.191+01:00 TASK Pull started
2023-01-26T17:10:28.955+01:00 TASK Pull stopped
2023-01-26T17:10:33.143+01:00 TASK Execution stopped
2023-01-26T17:10:43.172+01:00 TASK Stopping
2023-01-26T17:10:43.172+01:00 TASK StoppedReason:Essential container in task exited
2023-01-26T17:10:43.172+01:00 TASK StoppedCode:EssentialContainerExited
2023-01-26T17:10:43.286+01:00 SERVICE (service test-Service) deregistered 1 targets in (target-group arn:aws:elasticloadbalancing:...)
2023-01-26T17:10:43.295+01:00 SERVICE (service test-Service) has begun draining connections on 1 tasks.
2023-01-26T18:05:06.763+01:00 TASK Stopped
2023-01-26T18:05:06.763+01:00 CONTAINER:xx-xxx STOPPED (exit code: 1)