スキップしてコンテンツを表示

Amazon ECS エージェントが接続解除される場合のトラブルシューティング方法を教えてください。

所要時間3分
0

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 EC2 インスタンスへの接続には SSH キーを使用できます。SSH キーを生成していない場合は、AWS Systems Manager の機能である Session Manager を使用するとインスタンスに接続できます。Amazon Linux 2 AMI と Amazon Linux 2 ECS 最適化ベース AMI には、Systems Manager はデフォルトでインストールされます。

コンテナエージェントがコンテナインスタンスで実行されていることを確認する

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 Daemon ログを確認します。

Linux を使用している場合は、終了コードを参照すると、エージェントコンテナの停止に関する詳細を確認できます。詳細については、GitHub のウェブサイトで「exitcodes」を参照してください。

終了コードを取得するには、次のコマンドを実行します。

docker inspect your container ID

your container ID を停止したコンテナの ID に置き換えてください。

注: Amazon ECS ログコレクターを使用すると、Amazon ECS の一般的なオペレーティングシステムログ、Docker ログ、およびコンテナエージェントログを収集できます。

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 ログのリストを確認します。

    cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-##

    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 コンテナエージェントおよび、コンテナインスタンス上のその他の重要なシステムプロセス用に、メモリを予約することもできます。このメモリを予約しておくと、タスクのコンテナによる同じメモリに対する競合を防ぐことができます。詳細については、「Amazon ECS Linux コンテナインスタンスのメモリを予約する」を参照してください。

環境変数 ECS_CLUSTER に正しいクラスター名が含まれることを確認する

Amazon ECS コンテナエージェントの構成パラメータ ECS_CLUSTER に正しいクラスター名が含まれていない場合、コンテナインスタンスはクラスターに参加できません。/etc/ecs/ecs.config ファイルの内容を参照し、このパラメータを検証するには、次のコマンドを実行します。

cat /etc/ecs/ecs.config

ECS エージェントが ECS エンドポイントと通信できることを確認する

ECS エンドポイントに接続するには、ネットワークアクセスコントロールリストとコンテナインスタンスセキュリティグループは、ポート 443 (HTTPS) でのアウトバウンド接続を許可している必要があります。

ECS エンドポイント (ACS/TCS) へのアウトバウンド接続を確認するには、コンテナインスタンスで次のいずれかのコマンドを実行します。

sudo yum install telnet -y$ telnet ecs.region.amazonaws.com 443

または、

$ curl https://ecs.region.amazonaws.com

次の推奨事項を確認します。

関連情報

Amazon ECS のトラブルシューティング

コンテナインスタンスロールを作成する

Amazon ECS コンテナエージェントログを確認する

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ