跳至内容

如何对我的 Amazon ECS 部署失败进行故障排除?

2 分钟阅读
0

我想对为什么 Amazon Elastic Container Service (Amazon ECS) 部署失败进行故障排除。

简短描述

当您尝试部署新应用程序时,Amazon ECS 可能会遇到部署僵局。旧任务继续部署,但新任务无法达到稳定状态。您的 Amazon ECS 部署可能会因以下问题而失败:

  • 资源限制
  • 容器映像问题
  • 网络问题
  • 任务定义问题
  • Amazon CloudWatch Logs
  • 运行状况检查配置

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

资源限制

当您部署任务时没有足够的 CPU 或内存容量时,您的 Amazon ECS 服务部署可能会失败。当您的服务事件中出现 RESOURCE:* 错误且 Amazon ECS 任务未过渡到 Running(正在运行)状态时,就会出现资源限制。

要解决此问题,请执行以下操作:

  • 使用 Amazon CloudWatch 指标监控您的 Amazon ECS 集群资源容量。
  • 设置 Container Insights 以获取详细的任务和容器级别的资源使用情况指标。
  • 确保您的自动扩缩组设置符合您的 Amazon Elastic Compute Cloud (Amazon EC2) 启动类型集群的工作负载要求。监控实例容量并根据 CPU 使用率、内存使用率或自定义指标配置扩展策略。
  • 查看您在 awsvpc 网络模式下执行 Amazon ECS 任务的弹性网络接口容量。使用具有更高弹性网络接口限制的实例类型进行密集部署。每项任务都需要自己的弹性网络接口。使用 CIDR 规划并监控您的弹性网络接口,以确保有足够的 IP 地址可用于启动 Amazon ECS 任务。

要检查容器实例上的可用资源,请运行 list-container-instances AWS CLI 命令:

aws ecs list-container-instances --cluster your-cluster-name

**注意:**将 your-cluster-name 替换为您的集群名称。

然后,运行 describe-container-instances 命令:

aws ecs describe-container-instances --cluster your-cluster-name --container-instances container-instance-id

**注意:**将 your-cluster-name 替换为您的集群名称,将 container-instance-id 替换为容器的实例 ID。

容器映像问题

当 Amazon ECS 无法从资源存储库拉取映像时,任务将失败,并在您的服务事件中出现 CannotPullContainerError 错误。您可能会在容器实例的代理日志中看到相关任务。

要解决此错误,请确认您的 Amazon ECS 任务的以下任务定义配置和服务的联网配置:

  • 配置容器映像 URI
    对于 Amazon Elastic Container Registry (Amazon ECR),请确认映像是否符合以下文件命名格式:

    account-id.dkr.ecr.region.amazonaws.com/repository-name:tag

    **注意:**将 account-id 替换为您的账户 ID,将 region 替换为您的 AWS 区域,将 repository-name 替换为您的存储库名称。

    对于 Docker Hub,请确认映像是否符合以下文件命名格式:

    repository/image:tag

    **注意:**将 repository 替换为您的存储库名称。

  • 验证 Amazon ECS 任务执行 IAM 角色是否附带 AmazonECSTaskExecutionRolePolicy 权限。

  • 确认任务定义中没有缺失或不正确的环境占位符。

  • 当您在私有子网中部署 Amazon ECS 服务时,请关联同一子网和安全组中的 VPC 端点。
    对于接口端点:
    对于 Amazon ECS,请使用 com.amazonaws.region.ecs
    对于 CloudWatch Logs,请使用 com.amazonaws.us-east-1.logs
    对于 Amazon ECR (Docker),请使用 com.amazonaws.us-east-1.ecr.dkr
    对于 Amazon ECR API,请使用 com.amazonaws.us-east-1.ecr.api
    对于网关端点:
    对于 Amazon S3,请使用 com.amazonaws.us-east-1.s3

网络问题

当容器无法与外部服务通信、服务发现失败或任务无法到达所需的端点时,就会出现网络问题。您可能会在应用程序日志中收到超时错误、DNS 解析失败或容器与其他 AWS 服务之间的连接问题。要解决此错误,请执行以下操作。

  • 验证您的 Amazon ECS 服务的入站规则是否允许流量流向您的容器。
  • 确认在服务之间是否正确配置安全组规则
  • 确认公共子网是否拥有通过互联网网关到互联网的路由。
  • 验证您的私有子网的 NAT 网关配置
  • 检查 CIDR 范围在子网中是否有足够的 IP 地址可用。
  • 对于已配置的应用程序负载均衡器,请确保应用程序负载均衡器安全组允许安全组中的入站规则。

CloudWatch Logs

要查看 CloudWatch Logs 以对失败的 Amazon ECS 任务进行故障排除,请完成以下步骤:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 选择您的集群。
  4. 选择 Tasks(任务)选项卡。
  5. 为失败的任务选择 Task ID(任务 ID)。
  6. 检查 Stopped Status(已停止状态)以确定容器失败的原因。
    **注意:**已停止任务的日志仅在 ECS 任务停止后的一小时内可用。
  7. 对容器故障进行故障排除

运行状况检查配置

查看应用程序负载均衡器或网络负载均衡器中的以下运行状况检查设置

  • 确认 HealthCheckTimeoutSeconds 设置是否足够长,使容器能够成功。如果 ECS 任务在短时间内未通过负载均衡器运行状况检查,请修改此值。
  • 确保 HealthCheckGracePeriodSeconds 设置足够长,使容器可以启动。
  • 在负载均衡器中配置的 HealthCheckPath 上检查应用程序容器是否以状态代码 200 进行响应。有关详细信息,请参阅应用程序负载均衡器目标组运行状况检查中的 HealthCheckPath 设置。

要查找失败的运行状况检查,请完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中,展开 Load Balancing(负载均衡),然后选择 Target Groups(目标组)。
  3. 选择您的 Target group name(目标组名称)。
  4. 查看目标组的 Details(详细信息),以了解运行状况良好或运行状况不佳的实例。

要对运行状况不佳的实例进行故障排除,请参阅对应用程序负载均衡器进行故障排除

相关信息

AWS::ECS::Service

AWS 官方已更新 1 年前