跳至内容

如何对断开连接的 Amazon ECS 代理进行故障排除?

3 分钟阅读
0

我的 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 权限:

  1. 使用 SSH会话管理器连接到实例。

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

    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"
    }
  3. 验证 IAM 角色是否包含容器实例的正确权限

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

    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 和内存限制。

相关信息

Amazon ECS 故障排除

Amazon ECS 容器实例 IAM 角色

查看 Amazon ECS 容器代理日志

AWS 官方已更新 6 个月前