はじめに
最近、AWS ECS (Elastic Container Service) でEC2タイプのコンテナがなかなか起動しない事象発生。最終的に原因はEC2インスタンスのリソース不足だったのですが、そこに至るまで様々な確認を行ったので、今後のためにも、同じような問題に遭遇した方の助けになればと思い、解決までの道のりをまとめました。
発生した問題
ECSクラスタにコンテナインスタンスを登録しようとしたところ、いつまで経っても登録されず、タスクをデプロイできませんでした。
調査の開始 - まずはログから
EC2インスタンスにSSH接続し、ECSエージェントのログ (/var/log/ecs/ecs-agent.log
) を確認しました。
level=error time=... msg="Error getting ECS instance credentials from default chain: NoCredentialProviders: no valid providers in chain. Deprecated."
このエラーから、当初はIAMロールの設定に問題があると考えました。
確認したこと
1. IAMロールの設定
-
IAMロールのアタッチ: EC2インスタンスに正しいIAMロール (
AmazonEC2ContainerServiceforEC2Role
など) がアタッチされているか確認。 - 信頼関係の設定: IAMロールの信頼関係で、EC2インスタンスがロールを引き受けることが許可されているか確認。
-
必要なポリシーのアタッチ: IAMロールに
AmazonEC2ContainerServiceforEC2Role
、AmazonSSMManagedInstanceCore
(SSMエージェント利用時) などの必要なポリシーがアタッチされているか確認。
2. ネットワーク設定
-
セキュリティグループ: EC2インスタンスのセキュリティグループのアウトバウンドルールで、HTTPS (443) が許可されているか確認。特に、以下のエンドポイントへのアクセスを許可しているか確認。
- ECS エンドポイント
- STS エンドポイント
- ECR エンドポイント (コンテナイメージをプルする場合)
- S3 エンドポイント (SSMエージェントなどをダウンロードする場合)
- NAT Gateway: プライベートサブネットにEC2インスタンスを配置している場合、NAT Gateway が正しく設定され、ルートテーブルも適切に設定されているか確認。
- VPCエンドポイント: ECS関連のVPCエンドポイント (存在する場合) の設定とセキュリティグループを確認。
3. ECSエージェントの状態
sudo systemctl status ecs
でECSエージェントの状態を確認。inactive (dead)
になっている場合は、以下のコマンドで再起動を試みる。
sudo systemctl restart ecs
ログ (/var/log/ecs/ecs-agent.log
) を確認し、エラーがないか確認。
4. ECS設定ファイル
/etc/ecs/ecs.config
を確認し、ECS_CLUSTER
の設定が正しいか確認。
5. cloud-initのログ
/var/log/cloud-init-output.log
を確認し、EC2インスタンス起動時の初期化処理でエラーが発生していないか確認。user_data
スクリプトの実行結果などをチェック。
意外な落とし穴 - EC2インスタンスのリソース不足
上記の設定を何度も見直しましたが、問題は見つかりませんでした。ふと、EC2インスタンスのCPU使用率やメモリ使用率を確認したところ、ほぼ100%で張り付いている状態でした。
今回利用していたインスタンスタイプは t2.small
でしたが、ECSエージェントやその他必要なプロセスを起動するにはリソースが不足していたようです。
解決策
EC2インスタンスのインスタンスタイプを、よりリソースの大きいもの (t3.large
など) に変更したところ、ECSエージェントは正常に起動し、コンテナインスタンスとしてクラスタに登録されました。
まとめと教訓
ECSコンテナインスタンスが起動しない場合、IAMロールやネットワーク設定に目が行きがちですが、EC2インスタンス自体のリソースも重要な要素であることを痛感しました。
今回の経験から、以下の点を意識することが重要だと学びました。
- ログは詳細に確認する: エラーメッセージだけでなく、その前後のログも確認することで、問題の切り分けにつながることがある。
- 基本的な設定の確認は怠らない: IAMロール、ネットワーク設定、ECSエージェントの状態など、基本的な設定に誤りがないか丁寧に確認する。
- リソース状況も考慮する: 特に初期構築時や、インスタンスタイプを変更した際には、EC2インスタンスのリソース状況も確認する。
今回の問題解決には時間がかかってしまいましたが、得られた知識は今後の運用に必ず役立つはずです。同じような問題で困っている方の参考になれば幸いです。