如何对断开连接的 Amazon ECS 代理进行故障排除?
我的 Amazon Elastic Container Service (Amazon ECS) 的容器实例已断开连接。
简短描述
作为预期操作的一部分,您的 Amazon ECS 容器代理在一小时内多次断开连接并重新连接是正常的。仅持续几分钟的变更事件完全在预期内,可能并不表示容器代理或您的容器实例存在问题。
但是,如果容器代理处于断开连接状态的时间更长,则容器实例将无法作为 Amazon ECS 集群的一部分运行。此问题可能是由以下原因之一引起的:
- 网络问题阻碍了实例与 Amazon ECS 之间的通信。
- 容器代理没有与 Amazon ECS 端点通信所需的 AWS Identity and Access Management (IAM) 权限。
- 容器实例内的主机或 Docker 进程守护程序存在问题。
- 底层主机存在资源争用。
最佳实践是使用最新版本的 Amazon ECS 容器代理。
解决方法
注意: 以下解决方案适用于 Amazon ECS 优化的 Amazon Linux 2023 AMI。
您可以使用 SSH 密钥连接到您的 Amazon EC2 实例。如果您没有生成 SSH 密钥,则可以使用会话管理器(AWS Systems Manager 的一项功能)连接到您的实例。默认情况下,Systems Manager Agent 安装在 Amazon Linux 2023 AMI 和 Amazon Linux 2023 ECS 优化的基础 AMI 上。
验证容器代理是否正在容器实例上运行
要验证 Amazon ECS 容器代理的状态和连接,请在容器实例上运行以下命令之一:
sudo systemctl status ecs
sudo docker ps -f name=ecs-agent
输出指定处于活动状态,如下所示:
ecs.service - Amazon Elastic Container Service - container agent Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; preset: disabled) Active: active (running) since Thu 2026-02-19 08:42:39 UTC; 1min 17s ago Docs: https://aws.amazon.com/documentation/ecs/ Main PID: 2578 (amazon-ecs-init) Tasks: 5 (limit: 9497) Memory: 136.5M CPU: 214ms CGroup: /system.slice/ecs.service └─2578 /usr/libexec/amazon-ecs-init start CONTAINER ID IMAGE COMMAND CREATED STATUS 8ab4e7c372d7 amazon/amazon-ecs-agent:latest "/agent" 2 minutes ago Up 2 minutes (healthy)
如果问题是由代理断开连接引起的,请运行以下命令以重启 ECS 代理:
sudo systemctl restart ecs
注意: 运行前面的命令后,未返回任何输出。
要验证代理是否正在运行,请运行以下命令:
sudo systemctl status ecs
验证 Docker 服务是否正在容器实例上运行
要验证 Docker 服务是否正在受影响的容器实例上运行,请运行以下命令:
sudo systemctl status docker
输出指定处于活动状态,如下所示:
docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; preset: disabled) Active: active (running) since Thu 2026-02-19 08:42:37 UTC; 3min 46s ago TriggeredBy: docker.socket Docs: https://docs.docker.com Main PID: 2314 (dockerd) Tasks: 13 Memory: 485.3M CPU: 4.846s CGroup: /system.slice/docker.service └─2314 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
如果 Docker 服务处于非活动状态,请运行以下命令以重启 Docker 服务:
sudo systemctl restart docker
注意: 运行前面的命令后,未返回任何输出。
要验证 Docker 服务是否已重启,请运行以下命令:
sudo systemctl status docker
查看容器代理和 Docker 的日志文件
如果您的容器实例仍处于断开连接状态,请查看容器主机上容器代理和 Docker 的日志文件。
检查以下日志文件中的关键字,例如“错误”、“警告”或“代理过渡状态”:
- 在 /var/log/ecs/ecs-agent.log 中查看 Amazon ECS 容器代理的最新日志。您可以通过筛选到 /var/log/ecs/ecs-agent-log.timestamp 来查看轮换的日志
- 在 /var/log/ecs/ecs-init.log 中查看 Amazon ECS 初始化日志
- 在 /var/log/cloud-init.log 中查看用户数据执行日志
- 使用 sudo journalctl -u docker 命令查看 Docker 进程守护程序日志
如果您使用的是 Linux,还可以查看退出代码以获取有关已停止的代理容器的详细信息。
要获取退出代码,请运行以下命令:
docker inspect <your container ID>
注意: 将您的容器 ID 替换为已停止的容器的 ID。
您可以使用 Amazon ECS 日志收集器收集 Amazon ECS 的常规操作系统日志、Docker 日志和容器代理日志。
验证 IAM 实例配置文件是否具有必要的权限
如果容器代理仍处于断开连接状态,请验证与容器实例关联的 IAM 实例配置文件是否具有必要的 IAM 权限:
-
要查看与实例关联的实例配置文件中的实例元数据,请运行以下命令:
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/info输出类似于以下内容:
{ "Code" : "Success", "LastUpdated" : "2026-02-19T08:42:14Z", "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole", "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN" } -
要验证特定的凭证错误,请运行以下命令来检查容器代理日志:
cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-##注意: 将 YYYY-MM-DD-## 替换为相关的时间戳。
容器代理日志每小时轮换一次。后缀会自动更改以反映当前的日期和时间。更新命令以包括问题发生时的日期范围和日志 ID。
验证您的容器实例是否有足够的资源来运行 ECS 代理
如果您的任务的内存或 CPU 利用率很高,则您的容器实例可能没有足够的资源来运行 ECS 代理。
Amazon ECS 容器代理使用 Docker ReadMemInfo() 函数来查询可供操作系统使用的内存量。
在容器实例上运行以下命令以查看操作系统识别的总内存:
free -b
运行 Amazon ECS 优化的 Amazon Linux 2023 AMI 的 t2.large 实例的输出示例:
total used free shared buff/cache available Mem: 8327938048 337494016 6402355200 557056 1588088832 7745118208 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) 上的出站连接。
如果您的容器实例位于公有子网中,请验证该实例是否具有公有 IP 地址,并且子网的路由表是否有指向互联网网关的路由。
如果您的容器实例位于私有子网中,请验证该子网的路由表是否有指向 NAT 网关的路由,或者您是否为 Amazon ECS 配置了 VPC 端点。
要检查与 ECS 端点 (ACS/TCS) 的出站连接,请在容器实例上运行以下命令之一:
sudo yum install telnet -y telnet ecs.REGION.amazonaws.com 443
或
curl https://ecs.REGION.amazonaws.com
注意: 将 REGION 替换为您的 AWS 区域。
查看以下最佳实践:
- 除非您的应用程序需要特定的操作系统或 Amazon ECS 优化的 AMI 中不可用的 Docker 版本,否则请使用 Amazon ECS 优化的 Linux AMI 来运行您的 ECS 工作负载。
- 使用最新版本的 Amazon ECS 容器代理。最新版本包括增强功能并提供重要更新。
- 为任务配置 CPU 和内存限制。
相关信息
- 语言
- 中文 (简体)

This article was reviewed and updated on 2026-03-05.