对亚马逊进行故障排除 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 * * ? *)

例如,要使用 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 服务的事件

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

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

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

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

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

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

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

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

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

如果 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": "*" }

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

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

我可以将哪些 IAM 条件键与之搭配使用 EventBridge?

EventBridge 支持Amazon范围内的条件键(请参阅 IAM 用户指南中的 IAM 和Amazon STS条件上下文密钥)以及中列出的密钥。使用 IAM 策略条件进行精细访问控制

我怎么知道什么时候 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. Actions(操作)下,为 Whenever this alarm(每当此告警)选择 State is ALARM(状态为“告警”)

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

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

  11. 选择创建警报