Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何对与 Amazon ECS 中计划的任务相关的问题进行故障排除?
我将我的 Amazon Elastic Container Service (Amazon ECS) 任务计划为定期运行。但是,我的 Amazon ECS 任务未激活,并且我没有获得集群中任务的运行日志或历史记录。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
当您使用计划任务时,Amazon EventBridge 会调用 Amazon ECS 的 RunTask API 以代表您运行任务。由于以下原因,您计划的 Amazon ECS 任务可能无法调用:
- 您错误地配置了 EventBridge 时间或 cron 表达式。
- EventBridge 规则或计划不会调用目标。
- RunTask API 无法运行。
- 容器实例由于应用程序问题或资源限制而退出。
- 计划任务由于容量限制而失败。
- 计划任务由于网络连接问题而失败。
确认 EventBridge cron 表达式配置正确
要获取 EventBridge cron 表达式,请运行以下 AWS CLI 命令之一。
如果您使用 EventBridge 规则,请运行 describe-rule 命令:
aws events describe-rule --name example-rule --region example-region
如果您使用 EventBridge 调度器,请运行 get-schedule 命令:
aws scheduler get-schedule --name example-schedule --region example-region
**注意:**请将 example-rule 替换为您的规则名称,将 example-schedule 替换为您的计划名称,将 example-region 替换为您的 AWS 区域。
在命令的输出中,检查 ScheduleExpression 参数中的 EventBridge cron 表达式。确保将规则计划设置为 UTC+0 时区。
检查规则或计划是否未调用目标
要查看 EventBridge 规则的 Amazon CloudWatch 指标 Invocations 和 FailedInvocations,请完成以下步骤:
- 打开 CloudWatch 控制台。
- 在导航窗格中,选择指标,然后选择所有指标。
- 选择活动。
- 选择 By Rule Name(按规则名称)。
- 为运行 Amazon ECS 任务的 EventBridge 规则选择 TriggerRules、Invocations 和 FailedInvocations。
- 选择 Graphed metrics(绘成图表的指标)选项卡。
- 对于 Statistic(统计数据),为每个指标选择 SUM。
要检查 EventBridge 调度器的性能,请查看 CloudWatch 指标 InvocationAttemptCount、TargetErrorCount 和 InvocationDroppedCount。
如果看到 FailedInvocations 或 InvocationDroppedCount 数据,请验证 EventBridge AWS Identity and Access Management (IAM) 角色是否具有调用您的任务的权限。
如果看到 TargetErrorCount 数据,则表示目标调用存在问题。检查您的任务是已启动、启动后立即失败还是未完成。
检查 RunTask 操作是否失败
完成以下步骤:
- 打开 AWS CloudTrail 控制台。
- 在导航窗格中,选择 Event history(事件历史记录)。
- 在 Lookup attributes(查询属性)中,选择 Event name(事件名称)。
- 在 Enter an event name(输入事件名称)中,输入“run task”。
- 在时间范围筛选器中,选择您期望计划的 Amazon ECS 任务运行的时间段。
- 在表中,选择要查看的事件。
- 在 JSON 事件记录中,检查 errorMessage 或 responseElements.failures.reason,以确认 API 是否未调用计划任务。
**注意:**您可以在 responseElements.tasks.taskARN 字段中找到失败任务的任务 ID。 - 对 API 失败进行故障排除。
检查任务运行后容器是否退出
即使任务成功运行,Amazon ECS 任务仍可能会因应用程序问题或资源限制而停止。要解决此问题,请参阅如何解决 Amazon ECS 任务在容器退出时停止或无法启动的问题?
检查是否存在容量限制问题
当您的集群没有足够的计算资源(如 CPU 和内存)时,将会出现容量限制问题,进而导致任务失败。或者,当在同一集群上运行的其他工作负载导致高资源使用率时,将会出现此问题。严格的任务放置约束或策略也可能会减少您的可用资源。
要监控资源使用情况,请在您的 Amazon ECS 集群上设置 Container Insights。您还可以设置 CloudWatch 警报,以便在达到资源使用阈值时通知您。要确保资源在需要时可用,请为任务设置 CPU 和内存预留。您可能需要增加 Amazon ECS 服务的所需数量来横向扩展集群,或者使用集群自动扩缩。
查看现有的任务放置约束,并对其进行调整,以减少限制。最佳做法是优先处理关键工作负载,重新计划非必要的工作负载,并测试不同的放置策略(例如 spread(分散)、binpack(装箱)或 random(随机))。
使用 Amazon ECS 容量提供商为重要工作负载预留容量。对于需要隔离硬件的工作负载,最佳做法是使用 Amazon Elastic Compute Cloud (Amazon EC2) 专用实例。对于需要可用资源的任务使用 AWS Fargate。
检查是否存在网络连接问题
要对计划任务的网络连接问题进行故障排除,请执行以下操作:
- 确保安全组和网络访问控制列表(网络 ACL)规则允许任务所需的入站和出站流量。
- 检查您是否为虚拟私有云 (VPC) 正确配置了互联网网关或 NAT 网关。
- 检查您的网关路由表。
- 查看任务定义中具有硬编码 IP 地址或主机名的环境变量。确保现有 IP 地址或主机名正确无误且可以访问。
要从容器实例测试网络连接,请完成以下步骤:
- 使用 SSH 连接到 Amazon EC2 实例。
- 要在容器上远程运行命令,请运行以下 execute-command 命令:
**注意:**请将 cluster-name 替换为您的集群名称,将 task-id 替换为您的任务 ID,将 container-name 替换为您的容器实例名称。aws ecs execute-command --cluster cluster-name --task task-id --container container-name --command "/bin/bash" --interactive
- 要测试连接,请运行以下命令之一:
-或-curl -v http://example.com
-或-nslookup example.com
**注意:**请将 example.com 替换为您的域。nc -zv example.com 80
- 检查 DNS 解析和路由以识别网络问题。
为了简化连接,请在 Fargate(而不是 Amazon EC2)上运行任务。使用 Fargate,您无需管理底层基础设施。或者,使用 VPC 端点连接到服务,无需使用互联网网关、NAT 设备、VPN 连接或 AWS Direct Connect 连接。
