FOR LEARNERS学習中向け

Jコンテナとサーバーレス基盤段2構成層運用

ECS のタスクが止まる・デプロイが進まないときの調べ方|停止理由・サービスイベント・サーキットブレーカーを順に見る運用

ECS のタスクが止まる・デプロイが進まないときの調べ方|停止理由・サービスイベント・サーキットブレーカーを順に見る運用

新しいタスク定義を反映したら、タスクが起動してはすぐ消えて、デプロイがいつまでも終わらない。ログを見ようにもコンテナがもう無い。ECS を動かし始めると、一度はこの場面に当たります。慌てて設定を触る前に、どこに原因が書いてあるかを知っておけば、調べる順番は決まります。この記事では、止まったタスクの調べ方と、デプロイの失敗を止める仕組み、そして毎回手で調べなくて済む運用を説明します。

この記事の結論

  • タスクが消えたら、まず止まったタスクの停止コードと停止理由を見ます。コンソールで見えるのは止まってから 1 時間です。
  • サービス配下のタスクなら、サービスイベントに「止めて入れ替えた理由」(コンテナの停止、ロードバランサーのヘルスチェック失敗)が出ます。
  • 起動前の失敗(イメージ取得・ロール・ネットワーク)は停止理由に、起動後の失敗はコンテナのログと終了コードに出ます。見る場所を分けます。
  • ローリング更新では、サーキットブレーカーが失敗を数えてデプロイを FAILED にし、ロールバックを有効にすれば直前の COMPLETED に戻します。
  • 失敗のたびに調べるより、デプロイ失敗のイベントを EventBridge で受けて通知する運用にします。

ECS のタスクが止まったとき、最初に何を見ればよいのか

最初に見るのは、止まったタスクそのものです。ECS は止まったタスクに、止まった理由を記録します。主に見るのは次の 2 つです。

  • 停止コード(stopCode): 何が原因で止まったかの分類です。
  • 停止理由(StoppedReason): 人が読める説明の文です。

ここで気をつけたいのは、コンソールで止まったタスクが見えるのは、止まってから 1 時間という点です。「あとで見よう」と置いておくと、手がかりごと消えます。タスクが消えたと気づいたら、先に停止理由を控えてから、設定を直しにいきます。

止まったタスクが一覧に出ないときは、タスクの絞り込みを「停止」に切り替えて探します。操作の画面は改定で変わるので、手順は公式の「止まったタスクのエラー」のページに任せます。

調べる順番を、先に全体で押さえておきます。

WHERE TO LOOK調べる順番

止まったタスクは停止理由 → イベント → ログ → ヘルスチェックの順に見る

  1. 停止コードと停止理由

    止まったタスクの記録。コンソールでは 1 時間

  2. サービスイベント

    止めて入れ替えた理由

  3. コンテナのログと終了コード

    起動後の失敗の手がかり

  4. ヘルスチェックの設定

    パス・ポート・起動の猶予

CHECK 1ここまでの確認

起動したはずのタスクが一覧から消えていたとき、原因を探す最初の場所はどこ?

答えと解説

答え: 1. 止まったタスクの停止コードと停止理由

止まったタスクには、止まった理由が記録されます。コンソールで見えるのは止まってから 1 時間なので、早めに確認します。「ECS のタスクが止まったとき、最初に何を見ればよいのか」を読み直してください。

サービスイベントは何を教えてくれるのか

タスクが単独ではなくサービスの配下にある場合、もう 1 つの手がかりがあります。サービスイベントです。サービスは「決めた数のタスクを保ち続ける」仕組みなので、タスクが止まると新しいタスクを起動して入れ替えます。そのとき、なぜ止めて入れ替えたのかがイベントとして残ります。

たとえば、次のような理由がサービスイベントに出ます。

  • コンテナが止まったので、タスクを入れ替えた
  • ロードバランサーのヘルスチェックに失敗したので、タスクを入れ替えた

つまり、停止理由が「止まったタスク 1 つの記録」なら、サービスイベントは「サービスから見た、入れ替えの経緯」です。同じ事象を別の側から見ているので、両方を並べると原因を絞りやすくなります。ヘルスチェックの失敗で入れ替わっているのに、コンテナのログでは正常に見える、といったずれも、ここから気づけます。

この動きは、サービスが「数を保つ」ことの裏返しでもあります。起動しては止まるタスクを、サービスは健気に入れ替え続けます。だから、原因を直さない限り、一覧では「タスクが増えたり減ったりしている」ように見えます。

起動前に失敗したのか、起動後に失敗したのか

次に、どの段階で失敗したかを切り分けます。ここを間違えると、ログを探しても何も無い、という状況になります。

BEFORE OR AFTER失敗した段階

起動前と起動後で、見る場所が違う

起動前の失敗

停止理由に出る

  • イメージを取り出せない
  • 実行ロールの権限が足りない
  • ネットワークに出られない

起動後の失敗

ログと終了コードに出る

  • アプリが起動直後に終了する
  • 設定の誤りで落ちる
  • ヘルスチェックに応えられない
段階 起きがちなこと 見る場所
起動前 コンテナイメージを取り出せない、実行ロールの権限が足りない、ネットワークに出られない 止まったタスクの停止理由
起動後 アプリケーションが起動直後に異常終了する、設定の誤りで落ちる コンテナのログと終了コード

起動前に失敗したタスクは、コンテナがまだ動いていないので、ログは出ません。ログを見ても空なのは当たり前で、停止理由に出ている文を読みます。イメージの取得や実行ロールは、前の記事で扱った「タスク起動の流れ」のどこで使われるかと対応しています。

起動後に失敗した場合は、コンテナの出力が手がかりです。ただし、タスク定義でログドライバー(awslogs など)を設定していないと、出力は残りません。ログの置き場所を決めるのはタスク定義です。コンテナのヘルスチェックも同じくタスク定義に書くので、原因調査の入口として、タスク定義が「設計図」だったことを思い出してください。設計の考え方は別の記事で扱います。

ヘルスチェックの失敗は、起動後の失敗に入る

コンテナは動いているのに、ロードバランサーのヘルスチェックに応答できずに入れ替わる、という失敗もあります。アプリが立ち上がる前にチェックが始まっていないか、チェック先のパスやポートが合っているか、を確認します。この場合も、サービスイベントに「ヘルスチェックの失敗」と出るので、先ほどの手がかりと合わせて読みます。

停止メッセージの全種類はここに並べません。種類が多く、更新もされるため、公式の一覧を見るのが確実です。

CHECK 2ここまでの確認

ローリング更新でロールバックを有効にしたサーキットブレーカーが、デプロイを失敗と判定したとき、サービスはどこへ戻る?

答えと解説

答え: 2. 直前に COMPLETED になったデプロイ

戻る先は直前の COMPLETED のデプロイです。COMPLETED のデプロイが無いと戻る先が無く、停滞します。「サーキットブレーカーは何をするのか」を読み直してください。

デプロイが進まないとき、サーキットブレーカーは何をするのか

ここまでは「止まったタスクを調べる」話でした。次は、デプロイそのものが進まないときです。新しいタスク定義のタスクが起動と停止を繰り返すと、ローリング更新はいつまでも終わりません。

これを自動で止めるのが、デプロイサーキットブレーカーです。ローリング更新のデプロイで、新しいタスクの失敗を数え、一定を超えたらデプロイを FAILED と判定します。ロールバックを有効にしていれば、直前に COMPLETED になったデプロイへ自動で戻します。

CIRCUIT BREAKER失敗を止める流れ

失敗を数えてFAILEDにし、直前の COMPLETED へ戻す

ローリング更新

ロールバック有効時

  1. 新タスク起動
  2. 失敗を数える
  3. FAILED と判定
  4. 直前へ戻す

押さえておく点を整理します。

  • 2 段で判定する: 公式の説明では、新しいタスクが RUNNING になれない失敗と、RUNNING になったあとのヘルスチェックの失敗の、2 段で見ています。起動前と起動後の切り分けと、ほぼ同じ発想です。
  • デプロイの状態(rolloutState)に出る: 進行中、完了、失敗が区別されます。FAILED かどうかで、デプロイが止められたことが分かります。
  • 戻る先は直前の COMPLETED: 一度も COMPLETED になったことがない最初のデプロイや、直前が COMPLETED でない場合は、戻る先がありません。そのときは停滞します。
  • 対応はローリング更新のみ: ブルー/グリーンは別の仕組みです。切り替え前に検証する設計は、デプロイ方式の記事で扱います。

失敗の判定に使う回数の目安は、タスクの数などによって決まります。暗記するより、公式の仕様で確認するのが確実です。

サーキットブレーカーは、壊れたタスクが入れ替わり続けて、サービス全体が巻き込まれるのを防ぐ安全装置です。ただし、戻したあとの原因は直っていません。FAILED になったら、ここまでの順番(停止理由、サービスイベント、ログ)で原因を調べて直します。

CHECK 3ここまでの確認

サーキットブレーカーが対応しているデプロイ方式はどれ?

答えと解説

答え: 1. ローリング更新(ECS コントローラー)

公式の説明ではローリング更新向けの機能です。ブルー/グリーンは別の仕組みで、設計の記事で扱います。

毎回手で調べないための運用

止まるたびに人が調べにいく運用は、気づくのが遅れます。仕組みで受けるようにします。

  1. デプロイ失敗を通知で受ける: ECS はデプロイの状態変化をイベントとして出します。公式はサーキットブレーカーの使用時に、失敗のイベントを受けて通知することを勧めています。EventBridge のルールで受けて、メールやチャットに流します。
  2. ログを残す: タスク定義にログドライバー(awslogs)を設定すると、コンテナの出力が CloudWatch Logs に残ります。タスクが消えても、起動後の失敗を追えます。
  3. 見る場所を一覧にする: Container Insights を有効にすると、クラスター・サービス・タスク単位の CPU やメモリ、タスクの再起動の状況などを CloudWatch で追えます。追加の開発なしで見られる点が利点です。
  4. ヘルスチェックを設計に入れる: コンテナのヘルスチェックをタスク定義に書き、ロードバランサー側のチェックと整合させます。
手段 役割 見つけるもの
EventBridge のイベント 失敗を知らせる デプロイが FAILED になったこと
awslogs 出力を残す 起動後の失敗の原因
Container Insights 状態を見る タスク単位のメトリクスと再起動の様子

通知は「気づく」ため、ログは「原因を追う」ため、Container Insights は「傾向を見る」ためで、役割が違います。1 つで全部をまかなおうとせず、組み合わせます。

CHECK 4ここまでの確認

デプロイ失敗を、人が画面を見に行かずに知るにはどうする?

答えと解説

答え: 2. デプロイのイベントを EventBridge で受けて通知につなぐ

ECS は状態変化をイベントとして出します。受け取る側のルールを作っておけば、失敗のたびに調べに行く運用から離れられます。「毎回手で調べないための運用」を読み直してください。

調べる順番のまとめ(チェックリスト)

タスクが止まる、デプロイが進まない、と感じたら、次の順に確認します。

  1. 止まったタスクの停止コードと停止理由を控える(1 時間で消える)
  2. サービスイベントで、止めて入れ替えた理由を見る
  3. 起動前の失敗なら停止理由を読む。起動後の失敗なら、ログと終了コードを見る
  4. ヘルスチェックの設定(パス・ポート・猶予)が、アプリの起動に合っているか確認する
  5. デプロイが止まっているなら、rolloutState を見て、サーキットブレーカーとロールバックの設定を確認する
  6. 次の失敗に備えて、失敗の通知とログの設定を入れる

ECS の次の判断として、EKS と比べてどちらを選ぶかはECS と EKS の選び方の記事につながります。

参照ソース

SCOREこの記事の確認テスト

0/4問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

PRACTICEこの記事の論点を練習問題で確かめる

この記事が扱うサービスの問題だけを続けて解けます。練習問題は Google でログインした人が使えます(練習問題の一覧)。

HAND IT OVER人に渡すなら

一言で説明するなら

新しい担当者に引き継いだ店が、開店のたびに閉まってしまうとき、閉まった理由の書き置き、店長の日報、中の様子を順に見る。何度も失敗したら前の担当者に戻す仕組みもある、という話です。

前提を持たない人にそのまま渡せる記事です。「後輩に説明する」「顧客に理由を伝える」の材料として。

FAQよくある質問

止まったタスクが一覧に出ないのはなぜ?

コンソールでは止まったタスクが見えるのは止まってから 1 時間ほどです。「停止」のフィルターに切り替えて、早めに確認してください。サービス配下のタスクなら、CLI の describe-tasks も使えます。

サーキットブレーカーは必ず有効にすべき?

ローリング更新で、失敗したデプロイを自動で直前の状態に戻したいなら、有効にしてロールバックも指定します。失敗を止めて自分で判断したい場合など、何を許容するかはサービスの性質で決めます。

ログが見つからないときはどうする?

タスク定義でログドライバーを設定していないと、コンテナの出力は残りません。次に起動するタスクから設定して、同じ失敗が起きたときに追えるようにします。

SAME TRACK同じ領域の記事

ECS のタスク定義を設計する|サイズ・ロール・設定の渡し方を「1つのタスクに何を持たせるか」で決める
ECS のタスク定義を設計する|サイズ・ロール・設定の渡し方を「1つのタスクに何を持たせるか」で決める 段2 構成設計
Amazon EventBridge とは何か|イベントバス・ルール・ターゲットと SNS・SQS との使い分け
Amazon EventBridge とは何か|イベントバス・ルール・ターゲットと SNS・SQS との使い分け 段2 構成とは
Amazon SQS と Amazon SNS とは|キューとトピック、疎結合とファンアウト
Amazon SQS と Amazon SNS とは|キューとトピック、疎結合とファンアウト 段2 構成とは