对 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 调用您的服务。

通用目标输入配置无效

当您使用通用目标创建计划时, EventBridge 调度器会验证目标 ARN 格式,但不会根据下游服务的 API 验证该Input字段的内容。这意味着,即使调度Input包含目标服务将在调用时拒绝的值,也可以成功创建计划。

目标输入配置无效的计划将在其配置的表达式上触发,但在每次调用时都会失败。在调用计划之前,您可能不会发现配置错误,这可能是创建后的几小时或几天。

症状

  • 计划创建时没有出现错误,但是TargetErrorCount CloudWatch 指标在每次调用时都会增加。

  • DLQ 消息包含来自目标服务的错误代码(例如,InvalidParameterValueExceptionValidationException),不是AWS.Scheduler.InternalServerError

  • DLQ 消息ERROR_MESSAGE中的引用了特定的输入参数验证失败。

示例

以下示例显示了 AWS Lambda 通用目标 (arn:aws:scheduler:::aws-sdk:lambda:invoke) 的常见无效输入配置。

预选赛不匹配

具有以下输入的计划在Qualifier字段2中指定版本FunctionName和版本1

{ "FunctionName": "MyFunction:2", "Qualifier": "1" }

此计划已成功创建,但每次调用都失败。DLQ 消息包含:

  • ERROR_CODE: InvalidParameterValueException

  • ERROR_MESSAGE: The derived qualifier from the function name does not match the specified qualifier.

函数名称无效

包含以下输入的计划为以下项指定一个仅限空格的值:FunctionName

{ "FunctionName": " " }

DLQ 消息包含:

  • ERROR_CODE: ValidationException

  • ERROR_MESSAGE: 验证错误,表明函数名称与所需的模式不匹配。

如何解决

  1. 配置 DLQ。请务必为使用通用目标的计划配置死信队列。DLQ 消息属性(ERROR_CODEERROR_MESSAGE)包含目标服务返回的特定错误,该错误标识了无效的输入参数。

  2. 根据目标服务 API 验证输入参数。在创建计划之前,请直接调用目标 API 来验证Input字段中的 JSON 是否包含有效值。例如,使用 AWS Lambda Invoke API 调用具有相同参数的 AWS Lambda 函数以确认请求成功。

  3. 使用一次性计划进行测试。在配置定期计划之前,创建一次性计划以验证目标调用是否成功。

  4. 查看目标服务 API 参考。查看您要定位的服务的 API 参考以确认所需的参数、有效值范围和约束条件。有关信息 AWS Lambda Invoke,请参阅《AWS Lambda 开发人员指南》中的 “调用”。

调度更新触发意外调用

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

禁用或启用一次性调度

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

例如:

  • 当前时间:13:15 UTC

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

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

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

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