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

上次更新时间:2019 年 7 月 24 日

我的 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 1 AMI。有关适用于经 Amazon ECS 优化的 Amazon Linux 2 AMI 的分辨率,请参阅为什么具有 Amazon Linux 2 AMI 的 Amazon ECS 容器实例已断开连接?

解决方法

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

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

sudo service docker status

该命令的输出应与以下内容类似:

docker (pid 23013) is running...

如果 Docker 服务未运行,或者如果您需要重新启动该服务,请运行以下命令:

sudo service docker restart

该命令的输出内容应包含以下行:

Stopping docker: [  OK  ]
Starting docker: [  OK  ]

注意:要验证 Docker 服务在重启命令之后运行,请运行 sudo service docker status 命令。

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

sudo start ecs

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

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

sudo status ecs

如果容器代理不在您的容器实例上运行,则运行以下命令来启动代理:

sudo start ecs

该命令的输出应与以下内容类似:

ecs start/running, process 23403

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

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

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

 sudo cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-**
 sudo cat /var/log/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