AWS ECSでタスク実行されていない?確認手順を紹介する
目次
この記事で書くこと
aws ECSでスケジューリングタスクが実行できない???どうして?ログも出てない。。
そんな時の解決策。調査までの経緯。どこを?どのように修正したらいいのか?を紹介します。
解決策
だいたいのケースで原因はECR(イメージリポジトリ)からPullできないこと。
ECR -> ECSへのデータ経路はインターネット上で通信される。
だから、実行したいタスクへの通信経路を確認する。タスクがインターネットにつながっているのか?という確認をする。
通信経路がインターネットにつながっていない時は、経路を設置する。
今回はルートテーブルの不備だった。
調査と解決
ECSでタスク実行できない問題については、AWSの公式ドキュメントが存在している。
このドキュメントの中でリンクがあって、このリンクは別のドキュメントにつながってる。
このドキュメントでは、次の手順で確認するように説明してる。
- ECSコンソールを開く
- タスクタブを開く
- Desired task statusをStoppedを選択する
タイミングにもよるけれど、実行済みタスクの結果が表示されるはず。
表示されない時は、タスクを手動で実行して、意図的に失敗した状況を作り出せばいい。

下のタスクがTask failed to startになっている。このタスクがコンテナ実行失敗している。
失敗したTaskのリンクを開き、下の画面に飛ぶ。

エラー文は次の通りだった。
1 |
Status: CannotPullContainerErrorreason: Error response from daemon: Get https://173129773480.dkr.ecr.eu-central-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) |
このエラー文はこのAWSドキュメントとほぼ同じと言える。
ネットワークエラー原因の追求
問題はサービスがイメージを取得できないこと。
その原因がなぜかというと、インターネットに接続できなかったこと。
なぜ、そうなるかというと、ネットワーク経路が間違っていること・・・?かもしれない。
調べてみる。
比較しながら原因をさぐるため、実行成功したタスクと実行失敗したタスクを比較してみる。
成功したタスク
成功したタスク結果ページにはsubnet情報が表示されている。このsubnet IDをもとに通信経路を調べる。
AWSトップ -> vpc -> Subnetの順番でSubnet一覧のページに行く。
黒塗りばかりだけど、AWSで運用しているSubnet一覧が表示されている。

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

ここでは、宛先に0.0.0.0/0があって、Targetにはインターネットゲートウェイが指定されている。
つまり、インターネット宛にすべての通信が許可されている。だから、このタスクは実行成功している。
失敗したタスク
次に失敗したタスクで使われたsubnetの情報を見てみる。

画像にもある通り、インターネットゲートウェイへの経路がない。つまり、インターネットに繋がっていない。
と、いうわけで、ECRからPullできずに、タスクの実行失敗した、、、、というのが結論のようだ。
つまり、まとめると。そして解決策
- タスクはインターネットにつながっていないsubnetの元で実行された。
- インターネットにつながっていないので、イメージデータがPullできない。
- Cloudwatchに記録が残ることもなく、タスク実行されなかった。
図にすると、こういう状態だった。

と、いうわけで、修正のために次の操作をする。
- 失敗するsubnetで利用するRoute Tableを修正する。Edit Route Table Associationを押す。
- 別のRoute Tableを選択できるようになっているので、正しいRoute Table(インターネットにつながってるテーブル)を選択
最後に、失敗したタスクを手動で再実行する。
おしまい!
ディスカッション
コメント一覧
まだ、コメントがありません