Amazon EventBridge 故障排除 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon EventBridge 故障排除

您可以使用此部分中的主题解决 Amazon EventBridge 问题。

我的规则已运行,但 Lambda 函数没有被调用

您的 Lambda 函数无法运行的原因之一是您没有适当的权限。

检查您对 Lambda 函数的权限
  1. 使用 Amazon CLI,对您的函数和 Amazon 区域运行以下命令:

    aws lambda get-policy --function-name MyFunction --region us-east-1

    您应当看到如下输出。

    { "Policy": "{\"Version\":\"2012-10-17\", \"Statement\":[ {\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:events:us-east-1:123456789012:rule/MyRule\"}}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:MyFunction\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Sid\":\"MyId\"} ], \"Id\":\"default\"}" }
  2. 如果您看到以下消息:

    A client error (ResourceNotFoundException) occurred when calling the GetPolicy operation: The resource you requested does not exist.

    或者,您看到输出,但无法将 events.amazonaws.com 定位为策略中的受信任实体,请运行以下命令:

    aws lambda add-permission \ --function-name MyFunction \ --statement-id MyId \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule
  3. 如果输出包含 SourceAccount 字段,则需要删除该字段。SourceAccount 设置会导致 EventBridge 无法调用该函数。

注意

如果策略不正确,您可以在 EventBridge 控制台中编辑规则,删除策略并将策略重新添加到规则中。EventBridge 控制台将设置目标的正确权限。

如果您使用特定的 Lambda 别名或版本,则必须在 aws lambda get-policyaws lambda add-permission 命令中添加 --qualifier 参数,如以下命令所示

aws lambda add-permission \ --function-name MyFunction \ --statement-id MyId \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule --qualifier alias or version

我刚刚创建或修改了规则,但它未能匹配测试事件

在更改规则或其目标后,传入事件可能无法立即开始或停止与新的或更新后的规则的匹配。请稍等片刻,以便更改生效。

如果事件在短时间后仍然不匹配,请检查您的规则的 CloudWatch 指标 TriggeredRulesInvocationsFailedInvocations。有关这些指标的更多信息,请参阅监控 Amazon EventBridge

如果该规则旨在匹配来自 Amazon 服务的事件,请执行以下操作之一:

  • 使用 TestEventPattern 操作来测试您的规则的事件模式是否与测试事件匹配。有关更多信息,请参阅《Amazon EventBridge API 参考》中的 TestEventPattern

  • 使用 EventBridge 控制台中的沙盒

我在 ScheduleExpression 中指定了时间,但我的规则没有运行

确保您在 UTC+0 时区为规则设置计划。如果 ScheduleExpression 正确,则按照我刚刚创建或修改了规则,但它未能匹配测试事件中的步骤操作。

我的规则未在我期望的时间运行

EventBridge 在您设置的开始时间之后的一分钟内运行规则。规则一旦创建,倒计时立即开始。

注意

计划规则的传送类型为 guaranteed,这意味着事件将在每个预期时间至少触发一次。

您可以使用 cron 表达式在指定时间调用目标。要创建每四小时的第 0 分钟运行一次的规则,请执行以下操作之一:

  • 在 EventBridge 控制台中,使用 cron 表达式 0 0/4 * * ? *

  • 使用 Amazon CLI,您可以使用表达式 cron(0 0/4 * * ? *)

例如,要使用 Amazon CLI 创建名为 TestRule、每 4 小时运行一次的的规则,请使用以下命令。

aws events put-rule --name TestRule --schedule-expression 'cron(0 0/4 * * ? *)'

要每五分钟运行一次规则,请使用以下 cron 表达式。

aws events put-rule --name TestRule --schedule-expression 'cron(0/5 * * * ? *)'

使用 cron 表达式的 EventBridge 规则,其最佳分辨率为一分钟。您的计划规则会在这一分钟内运行,但不会精确到第 0 秒。

由于 EventBridge 和目标服务是分布式的,因此从计划规则运行到目标服务对目标资源执行操作之间,可能会有几秒钟的延迟。

我的规则与 Amazon 全局服务 API 调用相匹配,但它没有运行

Amazon 全局服务;例如 IAM 和 Amazon Route 53 等全局服务仅在美国东部(弗吉尼亚州北部)区域内可用,因此来自全局服务 Amazon API 调用的事件仅在该区域内可用。有关更多信息,请参阅 Amazon EventBridge 中来自 Amazon 服务的事件

规则运行时,与我的规则关联的 IAM 角色被忽略

EventBridge 仅针对向 Kinesis 流发送事件规则使用 IAM 角色。对于调用 Lambda 函数或 Amazon SNS 主题的规则,您需要提供基于资源的权限

请确保已启用您的区域 Amazon STS 端点,这样 EventBridge 在采用您提供的 IAM 角色时可以使用这些端点。有关更多信息,请参阅 IAM 用户指南 中的在 Amazon 区域中激活和停用 Amazon STS

我的规则的事件模式应该与某资源匹配,但未匹配事件

Amazon 中的大多数服务将冒号 (:) 或斜杠 (/) 视为与 Amazon 资源名称 (ARN) 中的字符相同,但 EventBridge 在事件模式规则中使用完全匹配。请务必在创建事件模式时使用正确的 ARN 字符,以使其与需要匹配的事件中的 ARN 语法相匹配。

有些事件,例如来自 CloudTrail 的 Amazon API 调用事件,其资源字段中没有任何内容。

向目标传送我的事件时存在延迟

EventBridge 会在长达 24 小时内一直尝试将事件传递给目标,但目标资源受限的情况除外。事件一旦到达事件流,立即会进行第一次尝试。如果目标服务遇到问题,EventBridge 会自动重新计划另一次传送。如果从事件到达时算起已过去了 24 小时,EventBridge 会停止尝试传送此事件,并在 CloudWatch 中发布 FailedInvocations 指标。我们建议您设置 DLQ,存储无法成功传送到目标的事件。有关更多信息,请参阅 在 EventBridge 中使用死信队列处理未传送的事件

某些事件从未传送到我的目标

如果 EventBridge 规则目标长时间受限,EventBridge 可能不会重试传送。例如,如果该目标未预配置为处理传入事件流量,且目标服务当前限制 EventBridge 代表您发出的请求,则 EventBridge 不会重试传送。

我的规则在回应一个事件时多次运行

在很少的情况下,同一规则可能会因一个事件或计划时间多次运行,或同一目标可能会因特定的已触发规则而被多次调用。

防止无限循环

在 EventBridge 中,可能创建导致无限循环的规则,即重复运行此规则。如果您有导致无限循环的规则,请重写,使该规则执行的操作不会与同一规则匹配。

例如,检测到 Amazon S3 桶中的 ACL 更改后,会运行软件将其更改为新状态的规则会导致无限循环。解决该问题的一种方法是重写规则,使其仅匹配处于不良状态的 ACL。

无限循环可能快速导致费用超出预期。我们建议您使用预算功能,以便在费用超出您指定的限制时提醒您。有关更多信息,请参阅通过预算管理成本

我的事件没有传送到目标 Amazon SQS 队列

如果您的 Amazon SQS 队列已加密,必须创建由客户管理的 KMS 密钥,并在您的 KMS 密钥政策中包含以下权限部分。有关更多信息,请参阅配置 Amazon KMS 权限

{ "Sid": "Allow EventBridge to use the key", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }

我的规则可以运行,但未看到任何消息发布到我的 Amazon SNS 主题

方案 1

您需要获得许可,才能将消息发布到 Amazon SNS 主题中。使用 Amazon CLI 执行以下命令,将 us-east-1 替换为您的地区,并使用您的主题 ARN。

aws sns get-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic"

要获得正确的权限,您的策略属性应类似于以下内容。

"{\"Version\":\"2012-10-17\", \"Id\":\"__default_policy_ID\", \"Statement\":[{\"Sid\":\"__default_statement_ID\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"*\"}, \"Action\":[\"SNS:Subscribe\", \"SNS:ListSubscriptionsByTopic\", \"SNS:DeleteTopic\", \"SNS:GetTopicAttributes\", \"SNS:Publish\", \"SNS:RemovePermission\", \"SNS:AddPermission\", \"SNS:SetTopicAttributes\"], \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\", \"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"123456789012\"}}},{\"Sid\":\"Allow_Publish_Events\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"sns:Publish\", \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}]}"

如果您在策略中看不到 events.amazonaws.com 具有 Publish 权限,请先复制当前策略,然后将以下语句添加到语句列表中。

{\"Sid\":\"Allow_Publish_Events\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"sns:Publish\", \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}

然后通过 Amazon CLI 设置主题属性,请使用以下命令。

aws sns set-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic" --attribute-name Policy --attribute-value NEW_POLICY_STRING
注意

如果策略不正确,您还可以在 EventBridge 控制台中编辑规则,删除策略并将策略重新添加到规则中。EventBridge 将设置目标的正确权限。

方案 2

如果您的 SNS 主题已加密,您必须在 KMS 密钥政策中包含以下部分。

{ "Sid": "Allow EventBridge to use the key", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }

在我删除与 Amazon SNS 主题关联的规则之后,我的 Amazon SNS 主题仍然具有 EventBridge 的权限

当您以 Amazon SNS 为目标创建规则时,EventBridge 会代表您将权限添加至您的 Amazon SNS 主题。如果您在创建规则不久后删除它,EventBridge 可能不会从您的 Amazon SNS 主题删除权限。如果发生此情况,您可以使用 aws sns set-topic-attributes 命令从该主题删除权限。有关用于发送事件的基于资源权限的信息,请参阅针对 Amazon EventBridge 使用基于资源的策略

我可以对 EventBridge 使用哪种 IAM 条件密钥?

EventBridge 支持 Amazon 范围内的条件密钥(请参阅《IAM 用户指南》中的 IAM 和 Amazon STS 条件上下文密钥)以及 在 Amazon EventBridge 中使用 IAM 政策条件 中列出的密钥。

我如何知道 EventBridge 规则出现故障?

您可以使用以下警报,在 EventBridge 规则出现故障时收到通知。

创建警报以在违反规则时发出通知
  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  2. 选择创建警报。在 CloudWatch Metrics by Category 窗格中,选择 Events Metrics

  3. 在指标列表中,选择 FailedInvocations

  4. 在图形上方,依次选择 StatisticSum

  5. 对于 Period,选择一个值,例如 5 minutes。选择下一步

  6. Alarm Threshold 下的 Name 中,为警报键入一个唯一的名称,例如:myFailedRules。对于描述,键入警报的描述,例如 Rules aren't delivering events to targets

  7. 对于 is,依次选择 >=1。对于 for,输入 10

  8. Actions(操作)下,为 Whenever this alarm(每当此告警)选择 State is ALARM(状态为“告警”)

  9. 对于 Send notification to,选择一个现有 Amazon SNS 主题或创建一个新 SNS 主题。要创建新主题,请选择新建列表。为新 Amazon SNS 主题键入名称,例如 myFailedRules

  10. 对于 Email list,请键入警报变为 ALARM 状态时将通知发送到的电子邮件地址列表 (以逗号分隔)。

  11. 选择创建警报