View a markdown version of this page

亚马逊排 EventBridge 程器疑难解答 - EventBridge 调度器

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

亚马逊排 EventBridge 程器疑难解答

您可以使用本节中的主题来解决常见的 Amazon EventBridge Scheduler 问题。

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

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

常见原因:

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

  • 网络连接问题。

  • API 节流。

  • 目标配置不正确。

故障排除步骤

  1. 设置 Dead-Letter 队列 (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 Scheduler 服务的信任关系

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

症状

  • 增加了TargetErrorCount指标 CloudWatch

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

故障排除步骤

  1. 监控 CloudWatch 指标

    • 检查TargetErrorCount指标 CloudWatch。

  2. 使用 Dead-Letter 队列 (DLQ) 确认权限问题

    • 为您的调度配置 DLQ。

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

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

    注意

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

  3. 验证信任关系

    • 确保您的 IAM 角色与 EventBridge Scheduler 有正确的信任关系:

    { "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-encrypted 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 表达式中,不能同时指定日期和星期几字段。

  2. 时区注意事项

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

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

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

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

    • 夏季:时间表仍在世界标准时间上午 7:00 运行,现在是上午 6:00 GMT/BST

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

  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。

    • 如果您已配置 Dead-Letter 队列,请监控InvocationsSentToDeadLetterCount以跟踪失败的调用。

创建调度模式和 cron 表达式

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

常见问题

  • cron 语法不正确

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

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

故障排除步骤

  1. 查看 cron 表达式语法

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

    • 请记住, EventBridge 调度器使用 cron 标准以及额外的 “年份” 字段。

  2. 了解局限性

    • 您不能同时指定日期和星期几字段,详见此处。

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

  3. 使用调度预览功能

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

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

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

我的目标是否被触发?

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

  1. 检查 CloudWatch 指标:

    • InvocationAttemptCount 显示尝试调用的次数

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

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

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

  2. 配置 Dead-Letter 队列 (DLQ) 以捕获和分析所有失败的调用。

模板化目标与通用目标

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

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

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

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

通用目标输入配置无效

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

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

症状

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

  • DLQ 消息包含来自目标服务的错误代码(例如,InvalidParameterValueException或ValidationException),而不是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_CODE和ERROR_MESSAGE)包含目标服务返回的特定错误,用于标识无效的输入参数。

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

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

  4. 查看目标服务 API 参考。查看您的目标服务的 API 参考资料,以确认所需的参数、有效值范围和限制。有关信息 AWS Lambda Invoke,请参阅《AWS Lambda 开发者指南》中的 “调用” 。

调度更新触发意外调用

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

禁用或启用一次性调度

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

例如:

  • 当前时间:13:15 UTC

  • One-time 时间表创建时间:13:30 UTC

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

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

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