「ECSタスクが起動できません」を解決するAWS公式診断ツール！

# 最初に

ECSの実装をしていると、「ECSタスクの起動に失敗しました！」という趣旨の、いわゆるDockerイメージのPullに失敗するエラーがありますよね。エラー自体はありふれているのですが、厄介なのは「何が悪いのかまったく教えてくれないこと」です！
問題範囲が広範囲に及ぶため、筆者もこのエラーには何度も苦しめられてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618997/3994ac25-36df-4b17-8165-025bca5b5736.png)

だったのですが、半年ほど前でしょうか。
なんとAWS公式からこのエラーを自動で診断してくれるツールが登場しています！！

今回はそのツールについて紹介していきます。

# ツールについて
`AWSSupport-TroubleshootECSTaskFailedToStart`という名前です。
ドキュメントは[こちら](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-aws-troubleshootecstaskfailedtostart.html)にあり、これ読めばだいたい解決しますが、本記事でも要約、解説、実践をしていきます。

## 要約
* 以下の原因を検証し、切り分けることができる
    * コンテナレジストリへのネットワーク接続
    * タスク実行ロールの IAM権限
    * VPCエンドポイント接続
    * セキュリティグループ
    * AWS Secrets Manager
    * ログ記録の構成
* ツールが診断するLambdaおよびIAM権限を自動で作成する 
    * 診断完了後にこのリソースは削除される
    * つまり、LambdaおやIamなどの作成/削除権限が必要になる
* 機能としては、`Systems Manager Automation`の一部


## 実際に使ってみる
ドキュメントページからも遷移できますが、診断ページは[こちら](https://ap-northeast-1.console.aws.amazon.com/systems-manager/automation/execute/AWSSupport-TroubleshootECSTaskFailedToStart?region=ap-northeast-1)にあります。

ひとまず「Single Execution」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618997/2e8b3067-16ba-4d33-b61c-a1232870b8d2.png)

次に調査対象のタスクIDと権限の設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618997/a0a35200-8f6f-4edd-a780-24b5727a1f9e.png)

* `AutomationAssumeRole`
    * 調査を実行するRoleを指定します。私の場合はすでに管理者権限でAWSアカウントにログインしていたので、特に設定する必要はありませんでした。もし実行ユーザーに必要な権限がない場合は、別途IAMRoleを作成する必要がありそうです
* `TaskId`
    * 失敗したタスクページにある番号がタスクIDです
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618997/fdf14f4b-25a7-4a3e-8fca-d4bee424233c.png)

* `ClusterName`
    * タスクを実行したクラスタ名を記述します

* `CloudwatchRetentionPeriod`
    * ログの保存期間のようです

これだけの設定でOKです！！

## 実行結果
画像の感じで結果が出力されます。
スクショはまだ実行中ですが、重要なのは5,7番なので結果を確認していきます。（1~4, 8~10 は検証準備と後片付け処理のようです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618997/39e097f4-cd80-43d1-a017-2e5a6ca2d22b.png)

`5 CoreFailureReasonEvaluation`や`7 ExecutionResults`を見てみるとエラー原因が書いてありました、

以下、結果詳細を載せておきます。
IDやIPはマスクしております。

### `5 CoreFailureReasonEvaluation`
REGISTRY CHECKS =============== The registry domain [***********.dkr.ecr.ap-northeast-1.amazonaws.com] encountered socket connection failure for DNS Resolved IP(s) ['***********'] with same network settings used by ECS / Fargate Agent. For more information check the following Knowledge Center articles: - https://aws.amazon.com/premiumsupport/knowledge-center/ecs-pull-container-api-error-ecr/ - https://aws.amazon.com/premiumsupport/knowledge-center/ecs-pull-container-error/ You have enabled ECR related private endpoints ['s3'], However missing endpoint/s {'ecr.api', 'ecr.dkr'} See https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html The route table rtb-************ associated with Task Subnet subnet-*********** does not have network access either via Internet Gateway or Nat Gateway. If you are leveraging custom networking path via peered network or via Transit Gateway please ensure the subnet where the task is placed have network connectivity to pull all required resources The route table rtb-************* associated with Task Subnet subnet-************* does not have network access either via Internet Gateway or Nat Gateway. If you are leveraging custom networking path via peered network or via Transit Gateway please ensure the subnet where the task is placed have network connectivity to pull all required resources Log Configuration Checks ======================== The registry domain [logs.ap-northeast-1.amazonaws.com] encountered socket connection failure for DNS Resolved IP(s) ['*********'] with same network settings used by ECS / Fargate Agent. 

### `7 ExecutionResults`
REGISTRY CHECKS
The registry domain [***********.dkr.ecr.ap-northeast-1.amazonaws.com] encountered socket connection failure for DNS Resolved IP(s) ['***********'] with same network settings used by ECS / Fargate Agent. For more information check the following Knowledge Center articles:
- https://aws.amazon.com/premiumsupport/knowledge-center/ecs-pull-container-api-error-ecr/ 
- https://aws.amazon.com/premiumsupport/knowledge-center/ecs-pull-container-error/ 

You have enabled ECR related private endpoints ['s3'], However missing endpoint/s {'ecr.api', 'ecr.dkr'} 
See https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html 

The route table rtb-*********** associated with Task Subnet subnet-*********** does not have network access either via Internet Gateway or Nat Gateway.
If you are leveraging custom networking path via peered network or via Transit Gateway please ensure the subnet where the task is placed have network connectivity to pull all required resources

The route table rtb-*********** associated with Task Subnet subnet-*********** does not have network access either via Internet Gateway or Nat Gateway.
If you are leveraging custom networking path via peered network or via Transit Gateway please ensure the subnet where the task is placed have network connectivity to pull all required resources


## 結論
今回は、`The route table rtb-*********** associated with Task Subnet subnet-*********** does not have network access either via Internet Gateway or Nat Gateway.`ということで、`IGW`も`NATGW`もないぞということを言われている訳ですね。
よくよく見てみたら、NatGWのないPrivateサブネットを指定してタスクを実行していたので、外部に通信できなかったというわけでしょう。
ネットワークをPublicサブネットに切り替えたところ、タスクが完了しました。

# 終わりに
今までは勘と経験と総当たりでエラーに対処していたのが、診断ツールを走らせて放置するだけでよくなったのはとてもよさそうですね。今後はストレスフリーにECS開発ができそうで、心が晴れやかです。
エラー原因が英語でよくわからなくても、GPTに投げれば正確に答えてくれそうなので、そこも含めてとてもよいツールだと思います。皆さんもぜひ触ってみてください！