本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对 Amazon EventBridge 计划程序进行故障排除
您可以使用本节中的主题来解决常见的 Amazon EventBridge 日程安排程序问题。
主题
我的调度因目标错误而失败
目标调用失败是 EventBridge 调度器最常见的问题之一。这些失败可能是由于以下几个原因引起的:
常见原因:
目标参数缺失或不正确。
网络连接问题。
API 节流。
目标配置不正确。
故障排除步骤
-
设置死信队列(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": "*" } -
验证 API 参数
确保目标 API 调用的所有必需参数均存在且格式正确。
检查参数值是否在允许的范围内。
如果使用 VPC 端点,请验证 API 端点是否可从您的 VPC 访问。
-
查看网络配置
如果由于临时网络问题导致调用失败,请实现重试逻辑。
重试策略示例:
{ "RetryPolicy": { "MaximumRetryAttempts": 3, "MaximumEventAgeInSeconds": 3600 } } -
检查特定于目标的配置
对于模板化目标(如 ECS 任务),请确保通过调度创建 API 的
Target.Input参数提供覆盖值。确认您的目标服务受支持且配置正确。
调度执行角色权限问题
IAM 角色权限问题是调度执行失败的常见原因。以下是排查和解决这些问题的方法:
常见原因
缺少目标服务所需的权限
调度中的角色配置不正确
与 EventBridge 日程安排器服务缺少信任关系
访问加密资源的权限不足
症状
增加了
TargetErrorCount指标 CloudWatch调度无法执行,调度配置中没有明显问题
故障排除步骤
-
监控 CloudWatch 指标
在中查看
TargetErrorCount指标 CloudWatch。
-
使用死信队列(DLQ)确认权限问题
为您的调度配置 DLQ。
如果您的目标存在权限问题,并且 DLQ 配置正确,您将在 DLQ 中看到包含权限相关错误消息的失败调用记录。
如果尽管 CloudWatch 指标中显示执行失败,但 DLQ 仍为空,则这可能表示存在权限问题,导致 EventBridge 调度程序无法写入 DLQ 本身。
注意
请确保 DLQ 本身具有正确的权限。如果已加密,请确保 EventBridge 调度程序有权使用 KMS 密钥。
-
验证信任关系
确保您的 IAM 角色与 EventBridge 调度程序有正确的信任关系:
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" }] } -
检查调度执行角色权限
调度的执行角色需要特定的权限才能调用不同的目标类型。
调度执行角色策略中应包含的权限示例:
// 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" }] } -
检查是否有加密的资源访问权限
如果您的目标使用加密资源(例如 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" } ] } -
验证角色 ARN 配置
确保您的调度配置中的角色 ARN 正确。
验证该角色是否 AWS 账户 与您的日程安排位于相同的地区。
了解和管理服务配额
如果您在创建计划或看到受限制的调用时遇到问题,则可能已达到服务配额限制。 EventBridge 调度器有计划数量、计划组和调用速率的配额,这些配额可能因地区而异。
确定配额问题
要确定您是否达到配额限制,请执行以下操作:
-
监控 CloudWatch 指标
检查
InvocationThrottleCount指标。该指标的增长表明您的调用频率已超出限制。查看
InvocationAttemptCount指标以了解您当前的使用情况。
-
留意具体的错误消息
创建或修改调度时,
LimitExceededException表示您已达到调度或调度组的最大数量。返回节流错误的 API 调用表明您已超出 API 请求配额。
解决配额问题
如果您确定自己已达到配额限制:
查看并优化您当前的调度。考虑整合相似的调度或删除未使用的调度。
对于 API 节流,请在 API 调用中使用回退实现重试。
如果需要更高的配额,可以通过服务配额控制台请求增加配额。选择 EventBridge Scheduler,选择需要增加的配额,然后提交包含您的业务理由的申请。
调度模式和触发时机问题
用户有时会遇到调度无法在预期时间触发的问题。这通常是由于对调度模式的理解偏差、夏令时变更或灵活时间窗口导致的。
常见原因
对 cron 表达式的误解。
夏令时切换期间出现意外行为。
对灵活时间窗口存在理解混淆。
对 rate 表达式的误解。
故障排除步骤
-
验证 cron 表达式
确保您的 cron 表达式格式正确。
请注意,不能在 cron 表达式中同时指定两个 day-of-month和 day-of-week字段。
-
时区注意事项
选择创建调度时的首选时区。
了解夏令时如何影响您的调度,因为此调整基于 UTC。
夏令时影响示例:如果您将调度配置为在格林威治标准时间 (GMT) 上午 7:00 运行:
冬季:调度在格林威治标准时间 (GMT) 时间上午 7:00 运行(因为 GMT 时间 = UTC 时间)
夏季:调度仍然在 UTC 时间上午 7:00 运行,该时间现在是格林威治标准时间/英国夏令时间上午 6:00
如果您需要调度全年按相同本地时间运行,请在创建调度时选择合适的时区,并留意夏令时对该时区的影响。
-
了解灵活时间窗口
灵活的时间窗口允许 EventBridge 调度器优化调用。
调度可能不会在窗口的起始时刻准时触发。
监控实际调用时间以了解相关行为。
-
查看 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 等时间运行。
-
监控 CloudWatch 指标
使用
InvocationAttemptCount指标来验证您的调度是否正在触发。如果调用失败,则检查
TargetErrorCount。如果您配置了死信队列,请监视
InvocationsSentToDeadLetterCount以跟踪失败的调用。
创建调度模式和 cron 表达式
用户在创建调度模式时经常遇到问题,尤其是在使用 cron 表达式时。以下是一些常见问题及其解决方法:
常见问题
cron 语法不正确
正在尝试使用不支持的 cron 功能
对哪些字段可同时使用感到困惑
故障排除步骤
-
查看 cron 表达式语法
确保您的 cron 表达式遵循正确的格式:
Minutes Hours Day-of-month Month Day-of-week Year。请记住, EventBridge 调度器使用带有额外年份字段的 cron 标准。
-
了解局限性
您不能像此处所讨论的那样同时指定 day-of-month和 day-of-week字段。
不支持产生的速率快于 1 分钟的 Cron 表达式。
-
使用调度预览功能
创建或编辑计划时,计划 EventBridge 程序会预览接下来的 10 个执行时间。
使用此预览来验证您的调度是否会在预期时间运行。
如果预览不符合您的预期,请查看并调整您的 cron 表达式。
我的目标是否被触发?
要确认您的目标是否被触发,请执行以下操作:
-
检查 CloudWatch 指标:
InvocationAttemptCount显示尝试调用的次数TargetErrorCount表示是否有任何调用失败TargetErrorThrottledCount显示您的目标是否受到限制InvocationDroppedCount表示是否丢弃了任何调用
配置死信队列(DLQ)以捕获和分析任何失败的调用。
模板化目标与通用目标
如果您收到诸如“Invalid request provided: [service] is not a supported service for a target”之类的错误,则您可能正在尝试使用不支持的服务作为模板化目标。
要解决这一问题,请执行以下操作:
调度更新触发意外调用
当您对调度进行更改时,调用可能不会立即反映更新的调度。请稍等片刻,以便更改生效。例如,如果您更新接近其原始触发时间的调度,则可能会看到基于原始调度配置的调用。
禁用或启用一次性调度
当一次性调度的原始预定时间已过时,若重新启用该调度,其可能会立即调用目标对象。即使调度在最初的执行时间之前被禁用,也可能发生这种情况。
例如:
当前时间:13:15 UTC
已为以下时间创建一次性调度:UTC 时间 13:30
调度已于 UTC 时间 13:30 之前被禁用
调度已于 UTC 时间 14:00 重新启用
结果:目标可以在重新启用后立即被调用