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

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

对亚马逊进行故障排除 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 指标TriggeredRulesInvocations、和FailedInvocations是否符合您的规则。有关这些指标的更多信息,请参阅监控 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 * * ? *)

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

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

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

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

确保您的区域 Amazon STS 终端节点已启用,以便在担任您提供的IAM角色时 EventBridge 可以使用这些终端节点。有关更多信息,请参阅《IAM用户指南》 Amazon STS 中的在某个 Amazon 地区激活和停用

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

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

有些事件(例如来自 CloudTrail的 Amazon API呼叫事件)在资源字段中没有任何内容。

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

EventBridge 尝试将事件传送到目标最多 24 小时,但目标资源受限的情况除外。事件一旦到达事件流,立即会进行第一次尝试。如果目标服务出现问题,则 EventBridge自动重新安排其他交付。如果自事件到达以来已过去 24 小时,则 EventBridge 停止尝试交付事件并在中发布FailedInvocations指标 CloudWatch。我们建议您设置无法成功交付DLQ到目标的存储事件。有关更多信息,请参阅使用死信队列处理中未传送的事件 EventBridge

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

如果 EventBridge 规则目标长时间受到限制,则 EventBridge 可能无法重试交付。例如,如果未配置目标来处理传入的事件流量,而目标服务正在限制代表您发 EventBridge 出的请求,则 EventBridge 可能不会重试传送。

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

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

防止无限循环

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

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

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

我的活动未发送到目标 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": "*" }

EventBridge即使我删除了与亚马逊SNS主题相关的规则,我的亚马逊SNS主题仍然具有访问权限

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

我可以与哪些IAM条件键一起使用 EventBridge?

EventBridge 支持 Amazon-wide 条件键(参见IAM《IAM用户指南》中的Amazon STS 条件上下文密钥),以及中列出的密钥。在 Amazon 中使用IAM政策条件 EventBridge

我怎么知道什么时候 EventBridge 违反了规则?

当您的 EventBridge 规则被违反时,您可以使用以下警报来通知您。

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

  2. 选择创建警报。在 “按类别划分的CloudWatch 指标” 窗格中,选择事件指标

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

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

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

  6. 例如,在 “警报阈值” 下的 “名称” 中,键入警报的唯一名称myFailedRules对于描述,键入警报的描述,例如 Rules aren't delivering events to targets

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

  8. 在 “操作” 下的 “每当此警报出现时”,选择 “状态为” ALARM。

  9. 在 “发送通知至” 中,选择现有的 Amazon SNS 主题或创建一个新主题。要创建新主题,请选择新建列表。输入新 Amazon SNS 主题的名称,例如:myFailedRules

  10. 电子邮件列表中,键入以逗号分隔的电子邮件地址列表,以便在警报变为状态时收到通知。ALARM

  11. 选择创建警报