为什么具有 Amazon Linux 2 AMI 的 Amazon ECS 容器实例已断开连接?

上次更新时间:2020 年 9 月 30 日

我的 Amazon Elastic Container Service (Amazon ECS) 容器实例已断开连接。

简短描述

您的 Amazon ECS 容器代理一小时可能会连接和重新连接多次。这些变更事件很正常,不需要担心。

但是,如果您的容器代理仍处于断开状态,则容器实例将不能作为 ECS 集群的一部分运行。当 agentConnected 返回 false 时,您的代理已断开连接。该问题可能是由于下列原因造成的:

  • 联网问题阻止实例与 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 容器实例已断开连接?

验证 Docker 服务在容器实例上运行

1.    要验证 Docker 服务在受影响的容器实例上运行,请运行以下命令:

sudo systemctl status docker

该命令输出类似于以下内容:

docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-06-28 03:23:52 UTC; 1 day 12h ago
     Docs: https://docs.docker.com
  Process: 5519 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 5509 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 5531 (dockerd)
    Tasks: 60
   Memory: 55.4M
   CGroup: /system.slice/docker.service
           ├─5531 /usr/bin/dockerd --default-ulimit nofile=1024:4096
           ├─5570 docker-containerd --config /var/run/docker/containerd/containerd.toml
           ├─5782 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/...
           ├─6006 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/...
           └─6284 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/...

如果 Docker 服务处于非活动状态,则运行以下命令以重新启动 Docker 服务:

sudo systemctl restart docker

注意:该命令不应返回任何输出。您可以运行 sudo systemctl status docker 命令来验证 Docker 服务是否已启动。

2.    要启动容器代理,请运行以下命令:

sudo systemctl start ecs

验证容器代理在容器实例上运行

要验证容器代理在受影响的容器实例上运行,请运行以下命令:

sudo systemctl status ecs

该命令输出类似于以下内容:

ecs.service - Amazon Elastic Container Service - container agent
   Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-06-29 15:45:57 UTC; 4min 5s ago
     Docs: https://aws.amazon.com/documentation/ecs/
  Process: 18896 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS)
  Process: 18818 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS)
  Process: 19422 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS)
 Main PID: 19455 (amazon-ecs-init)
    Tasks: 7
   Memory: 2.7M
   CGroup: /system.slice/ecs.service
           └─19455 /usr/libexec/amazon-ecs-init start

如果命令输出没有将服务显示为活动状态,请运行以下命令重新启动服务:

sudo systemctl restart ecs

注意:该命令不应返回任何输出。您可以运行 sudo systemctl status ecs 命令来验证容器代理是否已启动。

查看容器代理和 Docker 的日志文件

如果您的容器实例仍然断开连接,请查看容器代理和 Docker 的容器主机上的日志文件。

要为容器代理和 Docker 输出日志文件,请运行以下命令:

sudo journalctl -u ecs
sudo journalctl -u docker

注意:要从容器实例中收集日志信息,请运行 Amazon ECS 日志收集器

验证 IAM 实例配置文件拥有必要的权限

如果容器代理仍然断开连接,请验证与容器实例关联的 IAM 实例配置文件拥有必要的 IAM 权限。

1.    使用 SSH 连接到实例

2.    要查看与实例相关的实例配置文件上的实例元数据,请运行以下命令:

curl http://169.254.169.254/latest/meta-data/iam/info

该命令输出类似于以下内容:

{
  "Code" : "Success",
  "LastUpdated" : "2019-06-29T15:47:03Z",
  "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
  "InstanceProfileId" : "AIPAJ5WF3LZVY7PLUHV72"
}

3.    验证 IAM 角色包含容器实例的正确权限

4.    要验证容器代理的特定凭证错误,请运行以下命令检查容器代理日志以获取 ECS 日志列表:

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

注意:容器代理日志每小时轮换一次。后缀会自动更改以反映当前日期和时间。更新命令,以包含发生问题时的日期范围和日志 ID。

如果容器代理没有必要的凭证,您会在日志中会看到与以下内容相似的错误:

2019-06-29T16:10:09Z [ERROR] Unable to register as a container instance with ECS: AccessDeniedException: User: arn:aws:sts::1122334455:assumed-role/ecsInstanceRole/i-0052b2e858b1891ef is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-east-1:1122334455:cluster/exampleCluster
    status code: 400, request id: 0b73e260-5088-4688-a425-6f35f1ef440f
2019-06-29T16:10:09Z [ERROR] Error re-registering: AccessDeniedException: User: arn:aws:sts::1122334455:assumed-role/ecsInstanceRole/i-0052b2e858b1891ef is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-east-1:1122334455:cluster/exampleCluster
    status code: 400, request id: 0b73e260-5088-4688-a425-6f35f1ef440f

这篇文章对您有帮助吗?


您是否需要账单或技术支持?