切断された Amazon ECS エージェントをトラブルシューティングするにはどうすればよいですか?
Amazon Elastic Container Service (Amazon ECS) のコンテナインスタンスが切断されました。
簡単な説明
Amazon ECS コンテナエージェントは、正常なオペレーションの一環として切断と再接続を 1 時間に数回繰り返す場合があります。これらの変更イベントは正常なものであり、心配する必要はありません。接続イベントが数分以内で終わる場合、コンテナエージェントやコンテナインスタンスに問題はない可能性があります。ただし、コンテナエージェントの切断状態が長時間続く場合、コンテナインスタンスは Amazon ECS クラスターの一部として動作できなくなります。この問題は、次の理由により発生する可能性があります。
- ネットワークの問題により、インスタンスと Amazon ECS 間の通信が妨げられている。
- コンテナエージェントに、Amazon ECS エンドポイントと通信するために必要な AWS Identity and Access Management (IAM) アクセス許可がない。
- コンテナインスタンス内のホストまたは Docker デーモンに問題がある。
- 基盤となるホストでリソースの競合が発生している。
注: 可能な場合には、最新バージョンの Amazon ECS コンテナエージェントを使用するのがベストプラクティスです。詳細については、「コンテナインスタンスのライフサイクル」を参照してください。
解決方法
注意: 以下の解決策は、Amazon ECS に最適化された Amazon Linux 2 AMI に適用されます。Amazon ECS に最適化された Amazon Linux 1 AMI に適用される解決方法については、「Amazon Linux 1 AMI の Amazon ECS コンテナインスタンスが切断されるのはなぜですか?」を参照してください。
SSH キーを使用して Amazon EC2 インスタンスに接続できます。SSH キーを生成していない場合は、Session Manager を使用してインスタンスに接続できます。デフォルトでは、AWS Systems Manager Agent は Amazon Linux 2 AMI および Amazon Linux 2 ECS に最適化されたベース AMI にインストールされます。
コンテナエージェントがコンテナインスタンスで実行されていることを確認する
Amazon ECS コンテナエージェントのステータスと接続を検証するには、コンテナインスタンスで次のいずれかのコマンドを実行します。
$ sudo systemctl status ecs $ sudo docker ps -f name=ecs-agent
出力で active (running) が指定され、次のようになります。
ecs.service - Amazon Elastic Container Service - container agent Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2022-02-15 15:51:09 UTC; 37min ago Docs: https://aws.amazon.com/documentation/ecs/ Process: 30039 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS) Process: 29987 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS) Process: 30077 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS) Main PID: 30123 (amazon-ecs-init) Tasks: 5 Memory: 3.7M CGroup: /system.slice/ecs.service └─30123 /usr/libexec/amazon-ecs-init start
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb1dc8d4ab3b amazon/amazon-ecs-agent:latest "/agent" 3 days ago Up 3 days (healthy) ecs-agent
エージェントが切断されたことが原因で問題が発生した場合は、次のコマンドを実行して ECS エージェントを再起動します。
$ sudo systemctl restart ecs
注: これらのコマンドを実行しても、出力は表示されません。
エージェントが実行中であることを確認するには、次のコマンドを実行します。
sudo systemctl status ecs
Docker サービスがコンテナインスタンスで実行されていることを確認する
影響を受けるコンテナインスタンスで Docker サービスが実行されていることを確認するには、次のコマンドを実行します。
sudo systemctl status docker
出力で active (running) が指定され、次のようになります。
docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2022-02-11 17:42:32 UTC; 3 days ago Docs: https://docs.docker.com Process: 4307 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS) Process: 4296 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS) Main PID: 4315 (dockerd) Tasks: 24 Memory: 360.5M CGroup: /system.slice/docker.service ├─4315 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536 ├─6010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80 └─6016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80
Docker サービスが非アクティブの場合は、次のコマンドを実行して Docker サービスを再起動します。
sudo systemctl restart docker
注: このコマンドでは出力は返されません。
Docker サービスが再起動したことを確認するには、次のコマンドを実行します。
sudo systemctl status docker
コンテナエージェントと Docker のログファイルを確認する
それでもコンテナインスタンスの切断状態が続く場合は、コンテナホストのログファイルでコンテナエージェントと Docker を確認します。
次のログファイルで、「error」、「warn」、「agent transition state」などのキーワードを確認します。
- /var/log/ecs/ecs-agent.log にある Amazon ECS コンテナエージェントの最新のログを表示します。注: /var/log/ecs/ecs-agent-log.timestamp にフィルタリングすることで、ローテーションされたログを表示できます
- /var/log/ecs/ecs-init.log にある Amazon ECS init ログを表示します
- /var/log/cloud-init.log にあるユーザーデータ実行ログを表示します
- sudo journalctl -u docker コマンドを使用して Docker デーモンログを表示する
Linux を使用している場合は、終了コードで、停止したエージェントコンテナの詳細を確認することもできます。終了コードを取得するには、次のコマンドを実行します。
docker inspect <your container ID>
<your container ID> を停止したコンテナの ID に置き換えます。
注: Amazon ECS ログコレクターを使用して、一般的なオペレーティングシステムのログ、Docker ログ、および Amazon ECS のコンテナエージェントのログを収集することもできます。
IAM インスタンスプロファイルに必要なアクセス許可があることを確認する
それでもコンテナエージェントが切断されている場合は、コンテナインスタンスに関連付けられている IAM インスタンスプロファイルに必要な IAM アクセス許可があることを確認します。
1. SSH または Session Manager を使用してインスタンスに接続します。
2. インスタンスに関連付けられたインスタンスプロファイルのインスタンスメタデータを表示するには、次のコマンドを実行します。
curl http://169.254.169.254/latest/meta-data/iam/info
出力は次のようになります。
{ "Code" : "Success", "LastUpdated" : "2022-02-16T22:42:17Z", "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole", "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN" }
3. IAM ロールに、コンテナインスタンスに対する正しい権限が含まれていることを確認します。
4. コンテナエージェントで特定の認証情報エラーを確認するには、次のようなコマンドを実行してコンテナエージェントログで ECS ログのリストを確認します。
YYYY-MM-DD-** は、該当するタイムスタンプに置き換えてください。
cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-**
注意: コンテナエージェントのログは 1 時間ごとにローテーションされます。サフィックスは、現在の日付と時刻を反映して自動的に変更されます。問題が発生したときの日付範囲とログ ID が含まれるように、コマンドを更新します。
コンテナインスタンスに ECS エージェントを実行するのに十分なリソースがあることを確認する
タスクのメモリ/CPU 使用率が高い場合は、コンテナインスタンスに ECS エージェントを実行するのに十分なリソースがない可能性があります。
Amazon ECS コンテナエージェントは Docker ReadMemInfo() 関数を使用して、オペレーティングシステムで使用可能なメモリ量をクエリします。
コンテナインスタンスで次のコマンドを実行して、オペレーティングシステムが認識している合計メモリを表示します。
free -b
Amazon ECS に最適化された Amazon Linux AMI を実行している t2.large インスタンスの出力例:
total used free shared buff/cache available Mem: 8361193472 298577920 7325388800 405504 737226752 7844274176 Swap: 0 0 0
Amazon ECS コンテナエージェントと、コンテナインスタンス上の他の重要なシステムプロセス用にある程度のメモリを予約して、タスクのコンテナが同じメモリで競合しないようにすることもできます。詳細については、「Container instance memory management (コンテナインスタンスのメモリ管理)」を参照してください。
環境変数 ECS_CLUSTER のクラスター名が正しいことを確認する
Amazon ECS コンテナエージェント設定パラメータ ECS_CLUSTER のクラスター名が正しくない場合、コンテナインスタンスはクラスターに参加できません。/etc/ecs/ecs.config ファイルの内容を調べて、このパラメータを確認してください。
cat /etc/ecs/ecs.config
ECS エージェントが ECS エンドポイントと通信できることを確認する
コンテナインスタンスが使用するネットワークアクセスコントロールリストとセキュリティグループで、ポート 443 (HTTPS) でのアウトバウンド接続が ECS エンドポイントと接続できることを確認します。
コンテナインスタンスで以下のいずれかのコマンドを実行して、ECS エンドポイント (ACS/TCS) へのアウトバウンド接続を確認します。
sudo yum install telnet -y $ telnet ecs.region.amazonaws.com 443
- または -
$ curl https://ecs.region.amazonaws.com
以下に、留意すべきベストプラクティスをいくつか示します。
- ECS ワークロードを実行するためにアプリケーションで特定のオペレーティングシステム、またはその AMI でまだ利用できない Docker バージョンが必要である場合を除いて、コンテナインスタンスに Amazon ECS 最適化 AMI を使用します。
- 可能であれば、最新バージョンの Amazon ECS コンテナエージェントを使用してください。最新バージョンでは機能が強化され、以前のバージョンからのバグ修正が提供されています。
- CPU とメモリの制限を使用してタスクを設定します。
関連情報
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 6ヶ月前
- AWS公式更新しました 2年前
- AWS公式更新しました 3年前
- AWS公式更新しました 2年前