我的 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 ECS 代理进行故障排除?
验证 Docker 服务在容器实例上运行
1. 要验证 Docker 服务在受影响的容器实例上运行,请运行以下命令:
sudo service docker status
该命令输出类似于以下内容:
docker (pid 23013) is running...
如果 Docker 服务未运行,或者如果您需要重新启动该服务,请运行以下命令:
sudo service docker restart
注意:当服务正在运行时,请勿输入此命令。首先,请确保将容器实例设置为耗尽 状态。然后,重新启动 Docker 服务,以便在另一个容器实例上安排现有任务。
该命令的输出内容必须包含以下行:
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
其他帮助
如果您无法通过此解决方案确定 ECS 容器实例中存在的问题,请联系高级支持,以寻求帮助。首先,使用 Amazon ECS 日志收集器创建实例日志的存档。然后,将日志附加到支持工单上,以帮助支持工程师对问题进行故障排除。
相关信息
Amazon ECS 问题排查
Amazon ECS 容器代理
Amazon ECS 容器实例 IAM 角色
Amazon ECS 日志文件位置