切断された Amazon ECS エージェントをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 3 月 21 日

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 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 デーモンログを表示します

注: 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

以下に、留意すべきベストプラクティスをいくつか示します。