AWS ECSでタスク実行されていない?確認手順を紹介する

02/10/2021

A8バナー広告

この記事で書くこと

AWS ECSでスケジューリングタスクが実行できない???どうして?ログも出てない。。
そんな時の解決策。調査までの経緯。どこを?どのように修正したらいいのか?を紹介します。

解決策

だいたいのケースで原因はECR(イメージリポジトリ)からPullできないこと。

ECR -> ECSへのデータ経路はインターネット上で通信される。

だから、実行したいタスクへの通信経路を確認する。タスクがインターネットにつながっているのか?という確認をする。

通信経路がインターネットにつながっていない時は、経路を設置する。

今回はルートテーブルの不備だった。

調査と解決

ECSでタスク実行できない問題については、AWSの公式ドキュメントが存在している。

このドキュメントの中でリンクがあって、このリンクは別のドキュメントにつながってる。

このドキュメントでは、次の手順で確認するように説明してる。

  1. ECSコンソールを開く
  2. タスクタブを開く
  3. Desired task statusをStoppedを選択する

タイミングにもよるけれど、実行済みタスクの結果が表示されるはず。

表示されない時は、タスクを手動で実行して、意図的に失敗した状況を作り出せばいい。

2つのタスク結果が表示されてる。上のタスクは正常実行。下のタスクは失敗。

下のタスクがTask failed to startになっている。このタスクがコンテナ実行失敗している。

失敗したTaskのリンクを開き、下の画面に飛ぶ。

Detailsの欄にエラー内容が表示されている

エラー文は次の通りだった。

このエラー文はこのAWSドキュメントとほぼ同じと言える。

ネットワークエラー原因の追求

問題はサービスがイメージを取得できないこと。
その原因がなぜかというと、インターネットに接続できなかったこと。
なぜ、そうなるかというと、ネットワーク経路が間違っていること・・・?かもしれない。

調べてみる。

比較しながら原因をさぐるため、実行成功したタスクと実行失敗したタスクを比較してみる。

成功したタスク

成功したタスク結果ページにはsubnet情報が表示されている。このsubnet IDをもとに通信経路を調べる。

AWSトップ -> VPC -> Subnetの順番でSubnet一覧のページに行く。

黒塗りばかりだけど、AWSで運用しているSubnet一覧が表示されている。

該当するsubnet IDから、通信経路で使われたsubnet情報を開く。
Route Tableタブを開くと、宛先一覧のテーブルを見ることができる。

ここでは、宛先に0.0.0.0/0があって、Targetにはインターネットゲートウェイが指定されている。

つまり、インターネット宛にすべての通信が許可されている。だから、このタスクは実行成功している。

失敗したタスク

次に失敗したタスクで使われたsubnetの情報を見てみる。

Route Tableにインターネットゲートウェイの宛先がない

画像にもある通り、インターネットゲートウェイへの経路がない。つまり、インターネットに繋がっていない。

と、いうわけで、ECRからPullできずに、タスクの実行失敗した、、、、というのが結論のようだ。

つまり、まとめると。そして解決策

  • タスクはインターネットにつながっていないsubnetの元で実行された。
  • インターネットにつながっていないので、イメージデータがPullできない。
  • Cloudwatchに記録が残ることもなく、タスク実行されなかった。

図にすると、こういう状態だった。

黒線が修正前の状態。赤線が修正後の状態。

と、いうわけで、修正のために次の操作をする。

  1. 失敗するsubnetで利用するRoute Tableを修正する。Edit Route Table Associationを押す。
  2. 別のRoute Tableを選択できるようになっているので、正しいRoute Table(インターネットにつながってるテーブル)を選択

最後に、失敗したタスクを手動で再実行する。

おしまい!