ECSタスクが起動後にすぐ停止してしまった時の話
はじめに
こんにちは!DWSのティガです!
私は、自己学習でAmazon ECS(AWS Fargate)を使用したアプリケーションを開発しています!
今回のブログでは、その開発中にプライベートサブネットに作成したAmazon ECSのタスクがすぐに停止したことがあり、その時の対応を整理しつつ書きました!
私の場合、VPCエンドポイントの設定ミスが原因で、Amazon ECSのタスクがAmazon ECRからDockerレジストリを取得できないという問題が発生しました。この設定ミスに気づくまでにはいくつかの原因を切り分けて確認しました。同じような問題でお困りの方がいらっしゃいましたら、ぜひこちらのブログを参考にしていただければと思います。
初期調査
初期調査でCloudWatch LogsとECSタスクのイベントログ確認を確認したところ、CloudWatch Logsには何も出力されておらず、ECSタスクのイベントログには以下のログが出力されていました。
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-1.amazonaws.com/": dial tcp XX.XX.XX.XX:443: i/o timeout. Please check your task network configuration.
このログから、プライベートサブネットに作成したECSタスクがVPCエンドポイントを経由してECRからイメージをプルできていないことがわかりました。これを踏まえて、どこで設定ミスが発生しているのかを詳しく原因を切り分けて確認していきます。
原因切り分け
VPCエンドポイント経由ではなく、NAT GateWay経由でECRにアクセスできるか試してみる
まず、VPCエンドポイントではなく、NAT Gatewayを経由してECRにアクセスできるかを試してみました。このテストを行うことで、問題の原因がVPCエンドポイントの設定にあるのか、それ以外の設定にあるのかを切り分けることができます。
→試した結果、NAT Gateway経由ではECRに正常にアクセスできたため、VPCエンドポイントの設定ミスが原因でECRにアクセスできなかったことが判明しました。
Reachability AnalyzerでどのVPCエンドポイントが原因なのかを確認する
次は、ECSタスクのENIから各VPCエンドポイントまで通信が届いているのかをReachability Analyzerを使用して調べていきます。
Reachability Analyzerとは、Amazon VPC の接続に関する問題をトラブルシューティングする時に役立つサービスで、今回DWS メンバーのkameに教えてもらい、初めて使ってみました!!
以下の画像のように送信元と送信先を選択するだけで通信が届いているのかをすごくお手軽に確認できます!
Reachability Analyzer を使用して、以下のリソース間の到達可能性を分析できます。
Reachability Analyzer を使用した到達可能性に関する問題のトラブルシューティング
- インスタンス
- インターネットゲートウェイ
- ネットワークインターフェイス
- Transit Gateway
- Transit Gateway アタッチメント
- VPC エンドポイントサービス
- VPC エンドポイント
- VPC ピアリング接続
- VPN ゲートウェイ
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/reachability-analyzer.html)
ECSタスクのENI(Elastic Network Interface)からVPCエンドポイント(ecr.api)の到達可能性を分析
→ここは問題なく接続できているそうです!
ECSタスクのENI(Elastic Network Interface)からVPCエンドポイント(ecr.dkr)の到達可能性を分析
→ここも問題なく接続できているそうです!
ECSタスクのENI(Elastic Network Interface)からVPCエンドポイント(ecr.s3)の到達可能性を分析
→ECSとVPCエンドポイント(ecr.s3)間のルートテーブル設定に問題がありそうです!
Reachability Analyzerによる調査結果と対応
Reachability Analyzerによる調査結果から、ECSタスクとVPCエンドポイント(ecr.s3)間のルートテーブルの設定に問題がある可能性があることが判明しました。
VPCエンドポイント(ecr.s3)のルートテーブルの設定がされているかを確認した結果、ルートテーブルの設定がされていないことがわかりました。そのため、VPCエンドポイント(ecr.s3)の設定画面にて、ECS用ルートテーブルの紐付けを行いました!
その後、Reachability Analyzerを使用して接続の可達性を確認したところ、無事接続可能な状態にすることができました!
まとめ
プライベートサブネットに作成したAmazon ECSタスクがすぐに停止した原因は、ECSタスクとVPCエンドポイント(ecr.s3)間のルートテーブルの設定に問題があり、結果としてAmazon ECSタスクがAmazon ECRからDockerレジストリを取得できなかったことでした。
また、プライベートサブネットに作成したAmazon ECSのタスクがすぐに停止することなく、VPCエンドポイントを経由してECRからイメージをプルできるようになりました!!
この問題を通じて学んだことは、エラーが発生した際に設定ミスがすぐには分からない場合、まずは原因切り分けを行うことの重要性です。AWS公式ドキュメントに従って設定を確認しても問題が解決しない場合には、別のアプローチを試したり、Reachability Analyzerなどのツールを利用して原因切り分けを行ってみてください!