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

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

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 别名或版本,请添加--qualifier中的参数aws lambda get-policyaws lambda add-permission如以下命令所示:

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测试规则的事件模式的操作与测试事件匹配。有关更多信息,请参阅 。TestEventPattern中的Amazon EventBridge API 引用.

我的规则没有在我在ScheduleExpression

确保您已设置规则在 UTC+0 时区。如果ScheduleExpression正确的,然后按照下的步骤操作我刚创建或修改了一条规则,但它与测试事件不匹配.

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

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

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

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

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

例如,要创建名为的规则TestRule每 4 小时运行一次使用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 和目标服务被分布式,因此计划规则运行时间与目标服务对目标资源执行操作的时间之间可能有几秒钟的延迟。

我的规则匹配 IAM API 调用但未运行

IAM 服务仅在美国东部(弗吉尼亚北部)区域内可用,因此从Amazon来自 IAM 的 API 调用仅在该区域可用。有关更多信息,请参阅 来自 的事件Amazon服务

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

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

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

我的规则具有应与资源匹配的事件模式,但不会匹配任何事件

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

一些活动,例如Amazon来自 CloudTrail 的 API 调用事件,资源领域中没有任何东西。

我的事件发送到目标的时间延迟

EventBridge 试图提供事件转到目标除非您的目标资源受限的情况除外。事件一旦到达事件流,立即会进行第一次尝试。如果目标服务遇到问题,EventBridge 会自动重新计划另一次传输。如果从事件到达时算起过去了 24 小时,EventBridge 会停止尝试传输活动并发布FailedInvocationsCloudWatch 中的指标。我们建议您为 FailedInvocations 指标创建 CloudWatch 警报。

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

如果目标EventBridge规则EventBridge 可能无法重试传输。例如,如果目标没有配置来处理传入事件流量且目标服务当前限制 EventBridge 代表您发出的请求,则 EventBridge 不会重试传输。

我的规则运行不止一次以上的事件

在极少数情况下,同样规则可以对单个运行多次事件或计划的时间,或者相同目标可以针对给定的触发规则多次调用。

防止无限循环

在 EventBridge 中,可以创建规则这导致了无限循环,规则反复运行。如果你有一条导致无限循环的规则,请重写它,以便规则采取的操作与同一规则不匹配。

例如,如果检测到 Amazon S3 存储桶上的 ACL 已更改,然后运行软件以将 ACL 更改为新状态的规则会导致无限循环。解决这个问题的一种方法是重写规则,以便它只匹配处于坏状态的 ACL。

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

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

如果您的 Amazon SQS 队列已加密,则必须在 KMS 密钥策略中包含以下部分。

{ "Sid": "Allow CWE 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:Receive\", \"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.comPublish请首先复制当前策略并将以下语句添加到语句列表中。

{\"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 CWE 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命令。有关用于发送事件的基于资源权限的信息,请参阅将基于资源的策略用于 AmazonEventBridge.

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

EventBridge 支持Amazon范围的条件键(请参阅可用键中的IAM 用户指南),加上以下特定于服务的条件键。有关更多信息,请参阅 使用 IAM 策略条件进行精细访问控制

我如何在违反 EventBridge 规则发出通知?

您可以使用以下警报来在 EventBridge 时发出通知规则被破坏了。

创建警报以在违反规则时发出通知

  1. 访问 https://console.aws.amazon.com/cloudwatch/,打开 CloudWatch 控制台。

  2. 选择 Create Alarm(创建告警)。在 CloudWatch Metrics by Category 窗格中,选择 Events Metrics

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

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

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

  6. Alarm Threshold 下的 Name 中,为警报键入一个唯一的名称,例如:myFailedRules。适用于说明例如,键入警报的描述规则没有向目标发送活动.

  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. 选择 Create Alarm(创建告警)