如何对与 Amazon ECS 中计划的任务相关的问题进行故障排除?

2 分钟阅读
0

我将我的 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 指标 InvocationsFailedInvocations,请完成以下步骤:

  1. 打开 CloudWatch 控制台
  2. 在导航窗格中,选择指标,然后选择所有指标
  3. 选择活动
  4. 选择 By Rule Name(按规则名称)。
  5. 为运行 Amazon ECS 任务的 EventBridge 规则选择 TriggerRulesInvocationsFailedInvocations
  6. 选择 Graphed metrics(绘成图表的指标)选项卡。
  7. 对于 Statistic(统计数据),为每个指标选择 SUM

要检查 EventBridge 调度器的性能,请查看 CloudWatch 指标 InvocationAttemptCount、TargetErrorCount 和 InvocationDroppedCount

如果看到 FailedInvocationsInvocationDroppedCount 数据,请验证 EventBridge AWS Identity and Access Management (IAM) 角色是否具有调用您的任务的权限。

如果看到 TargetErrorCount 数据,则表示目标调用存在问题。检查您的任务是已启动、启动后立即失败还是未完成。

检查 RunTask 操作是否失败

完成以下步骤:

  1. 打开 AWS CloudTrail 控制台
  2. 在导航窗格中,选择 Event history(事件历史记录)。
  3. Lookup attributes(查询属性)中,选择 Event name(事件名称)。
  4. Enter an event name(输入事件名称)中,输入“run task”。
  5. 在时间范围筛选器中,选择您期望计划的 Amazon ECS 任务运行的时间段。
  6. 在表中,选择要查看的事件。
  7. 在 JSON 事件记录中,检查 errorMessageresponseElements.failures.reason,以确认 API 是否未调用计划任务。
    **注意:**您可以在 responseElements.tasks.taskARN 字段中找到失败任务的任务 ID。
  8. 对 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 地址或主机名正确无误且可以访问。

要从容器实例测试网络连接,请完成以下步骤:

  1. 使用 SSH 连接到 Amazon EC2 实例
  2. 要在容器上远程运行命令,请运行以下 execute-command 命令:
    aws ecs execute-command --cluster cluster-name --task task-id --container container-name --command "/bin/bash" --interactive
    **注意:**请将 cluster-name 替换为您的集群名称,将 task-id 替换为您的任务 ID,将 container-name 替换为您的容器实例名称。
  3. 要测试连接,请运行以下命令之一:
    curl -v http://example.com
    -或-
    nslookup example.com
    -或-
    nc -zv example.com 80
    **注意:**请将 example.com 替换为您的域。
  4. 检查 DNS 解析和路由以识别网络问题。

为了简化连接,请在 Fargate(而不是 Amazon EC2)上运行任务。使用 Fargate,您无需管理底层基础设施。或者,使用 VPC 端点连接到服务,无需使用互联网网关、NAT 设备、VPN 连接或 AWS Direct Connect 连接。

AWS 官方
AWS 官方已更新 4 个月前