对 Amazon EventBridge 计划程序进行故障排除 - EventBridge 调度器

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对 Amazon EventBridge 计划程序进行故障排除

您可以使用本节中的主题来解决常见的 Amazon EventBridge 日程安排程序问题。

我的调度因目标错误而失败

目标调用失败是 EventBridge 调度器最常见的问题之一。这些失败可能是由于以下几个原因引起的:

常见原因:

  • 目标参数缺失或不正确。

  • 网络连接问题。

  • API 节流。

  • 目标配置不正确。

故障排除步骤

  1. 设置死信队列(DLQ)

    • DLQ 可帮助您捕获和分析失败的调用。

    • 失败的调用将发送到 DLQ,并附有详细的错误消息。

    • 配置 DLQ,请将其添加到您的调度配置中:

    { "DeadLetterConfig": { "Arn": "arn:aws:sqs:region:account-id:MyDLQ" } }

    注意:如果您的 DLQ 使用 KMS 密钥加密,请确保密钥策略允许 EventBridge 调度程序使用它:

    { "Sid": "Allow EventBridge Scheduler to use the key", "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }
  2. 验证 API 参数

    • 确保目标 API 调用的所有必需参数均存在且格式正确。

    • 检查参数值是否在允许的范围内。

    • 如果使用 VPC 端点,请验证 API 端点是否可从您的 VPC 访问。

  3. 查看网络配置

    • 如果由于临时网络问题导致调用失败,请实现重试逻辑。

    • 重试策略示例:

    { "RetryPolicy": { "MaximumRetryAttempts": 3, "MaximumEventAgeInSeconds": 3600 } }
  4. 检查特定于目标的配置

    • 对于模板化目标(如 ECS 任务),请确保通过调度创建 API 的 Target.Input 参数提供覆盖值。

    • 确认您的目标服务受支持且配置正确。

调度执行角色权限问题

IAM 角色权限问题是调度执行失败的常见原因。以下是排查和解决这些问题的方法:

常见原因

  • 缺少目标服务所需的权限

  • 调度中的角色配置不正确

  • 与 EventBridge 日程安排器服务缺少信任关系

  • 访问加密资源的权限不足

症状

  • 增加了TargetErrorCount指标 CloudWatch

  • 调度无法执行,调度配置中没有明显问题

故障排除步骤

  1. 监控 CloudWatch 指标

    • 在中查看TargetErrorCount指标 CloudWatch。

  2. 使用死信队列(DLQ)确认权限问题

    • 为您的调度配置 DLQ。

    • 如果您的目标存在权限问题,并且 DLQ 配置正确,您将在 DLQ 中看到包含权限相关错误消息的失败调用记录。

    • 如果尽管 CloudWatch 指标中显示执行失败,但 DLQ 仍为空,则这可能表示存在权限问题,导致 EventBridge 调度程序无法写入 DLQ 本身。

    注意

    请确保 DLQ 本身具有正确的权限。如果已加密,请确保 EventBridge 调度程序有权使用 KMS 密钥。

  3. 验证信任关系

    • 确保您的 IAM 角色与 EventBridge 调度程序有正确的信任关系:

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" }] }
  4. 检查调度执行角色权限

    • 调度的执行角色需要特定的权限才能调用不同的目标类型。

    • 调度执行角色策略中应包含的权限示例:

    // For Lambda function targets - add to schedule execution role { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name" }] } // For SQS queue targets - add to schedule execution role { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "sqs:SendMessage" ], "Resource": "arn:aws:sqs:region:account-id:queue-name" }] }
  5. 检查是否有加密的资源访问权限

    • 如果您的目标使用加密资源(例如 KMS 加密的 SQS 队列),请确保您的角色有权使用 KMS 密钥:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:region:account-id:key/key-id" } ] }
  6. 验证角色 ARN 配置

    • 确保您的调度配置中的角色 ARN 正确。

    • 验证该角色是否 AWS 账户 与您的日程安排位于相同的地区。

了解和管理服务配额

如果您在创建计划或看到受限制的调用时遇到问题,则可能已达到服务配额限制。 EventBridge 调度器有计划数量、计划组和调用速率的配额,这些配额可能因地区而异。

确定配额问题

要确定您是否达到配额限制,请执行以下操作:

  1. 监控 CloudWatch 指标

    • 检查 InvocationThrottleCount 指标。该指标的增长表明您的调用频率已超出限制。

    • 查看 InvocationAttemptCount 指标以了解您当前的使用情况。

  2. 留意具体的错误消息

    • 创建或修改调度时,LimitExceededException 表示您已达到调度或调度组的最大数量。

    • 返回节流错误的 API 调用表明您已超出 API 请求配额。

解决配额问题

如果您确定自己已达到配额限制:

  1. 查看并优化您当前的调度。考虑整合相似的调度或删除未使用的调度。

  2. 对于 API 节流,请在 API 调用中使用回退实现重试

  3. 如果需要更高的配额,可以通过服务配额控制台请求增加配额。选择 EventBridge Scheduler,选择需要增加的配额,然后提交包含您的业务理由的申请。

调度模式和触发时机问题

用户有时会遇到调度无法在预期时间触发的问题。这通常是由于对调度模式的理解偏差、夏令时变更或灵活时间窗口导致的。

常见原因

  • 对 cron 表达式的误解。

  • 夏令时切换期间出现意外行为。

  • 对灵活时间窗口存在理解混淆。

  • 对 rate 表达式的误解。

故障排除步骤

  1. 验证 cron 表达式

    • 确保您的 cron 表达式格式正确。

    • 请注意,不能在 cron 表达式中同时指定两个 day-of-month和 day-of-week字段。

  2. 时区注意事项

    • 选择创建调度时的首选时区。

    • 了解夏令时如何影响您的调度,因为此调整基于 UTC。

    夏令时影响示例:如果您将调度配置为在格林威治标准时间 (GMT) 上午 7:00 运行:

    • 冬季:调度在格林威治标准时间 (GMT) 时间上午 7:00 运行(因为 GMT 时间 = UTC 时间)

    • 夏季:调度仍然在 UTC 时间上午 7:00 运行,该时间现在是格林威治标准时间/英国夏令时间上午 6:00

    如果您需要调度全年按相同本地时间运行,请在创建调度时选择合适的时区,并留意夏令时对该时区的影响。

  3. 了解灵活时间窗口

    • 灵活的时间窗口允许 EventBridge 调度器优化调用。

    • 调度可能不会在窗口的起始时刻准时触发。

    • 监控实际调用时间以了解相关行为。

  4. 查看 rate 和 cron 表达式

    • 确保 rate 表达式的格式正确(例如 rate(5 minutes)rate(1 hour))。

    • 对于 rate 和 cron 表达式,请注意,调度调用不会强制对齐到每分钟的第 0 秒。

    • 调度可以在指定的分钟内触发,但不一定在该分钟的精确起始时刻触发。

    例如:

    • rate(1 hour) 的调度可能在下午 2:00:45、下午 3:00:32、下午 4:00:18 等时间运行。

    • 设置为 0 * * * ? *(每小时)的 cron 调度可能在下午 2:00:15、下午 3:00:07、下午 4:00:52 等时间运行。

  5. 监控 CloudWatch 指标

    • 使用 InvocationAttemptCount 指标来验证您的调度是否正在触发。

    • 如果调用失败,则检查 TargetErrorCount

    • 如果您配置了死信队列,请监视 InvocationsSentToDeadLetterCount 以跟踪失败的调用。

创建调度模式和 cron 表达式

用户在创建调度模式时经常遇到问题,尤其是在使用 cron 表达式时。以下是一些常见问题及其解决方法:

常见问题

  • cron 语法不正确

  • 正在尝试使用不支持的 cron 功能

  • 对哪些字段可同时使用感到困惑

故障排除步骤

  1. 查看 cron 表达式语法

    • 确保您的 cron 表达式遵循正确的格式Minutes Hours Day-of-month Month Day-of-week Year

    • 请记住, EventBridge 调度器使用带有额外年份字段的 cron 标准。

  2. 了解局限性

    • 您不能像此处所讨论的那样同时指定 day-of-month和 day-of-week字段。

    • 不支持产生的速率快于 1 分钟的 Cron 表达式。

  3. 使用调度预览功能

    • 创建或编辑计划时,计划 EventBridge 程序会预览接下来的 10 个执行时间。

    • 使用此预览来验证您的调度是否会在预期时间运行。

    • 如果预览不符合您的预期,请查看并调整您的 cron 表达式。

我的目标是否被触发?

要确认您的目标是否被触发,请执行以下操作:

  1. 检查 CloudWatch 指标:

    • InvocationAttemptCount 显示尝试调用的次数

    • TargetErrorCount 表示是否有任何调用失败

    • TargetErrorThrottledCount 显示您的目标是否受到限制

    • InvocationDroppedCount 表示是否丢弃了任何调用

  2. 配置死信队列(DLQ)以捕获和分析任何失败的调用。

模板化目标与通用目标

如果您收到诸如“Invalid request provided: [service] is not a supported service for a target”之类的错误,则您可能正在尝试使用不支持的服务作为模板化目标。

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

  1. 检查系统是否支持将您所需的服务用作模板化目标

  2. 如果不支持,请改用通用目标并将其配置为通过适当的 API 调用您的服务。

调度更新触发意外调用

当您对调度进行更改时,调用可能不会立即反映更新的调度。请稍等片刻,以便更改生效。例如,如果您更新接近其原始触发时间的调度,则可能会看到基于原始调度配置的调用。

禁用或启用一次性调度

当一次性调度的原始预定时间已过时,若重新启用该调度,其可能会立即调用目标对象。即使调度在最初的执行时间之前被禁用,也可能发生这种情况。

例如:

  • 当前时间:13:15 UTC

  • 已为以下时间创建一次性调度:UTC 时间 13:30

  • 调度已于 UTC 时间 13:30 之前被禁用

  • 调度已于 UTC 时间 14:00 重新启用

  • 结果:目标可以在重新启用后立即被调用