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字段,那么你需要删除它。ASourceAccount设置会导致 EventBridge 无法调用该函数。

注意

如果策略不正确,您可以编辑规则,方式是删除 EventBridge 略并将策略重新添加到规则中。EventBridge 控制台将设置target

如果您使用特定的 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

我刚刚创建或修改了一个规则,但它与测试事件不匹配

当您对规则或其targets, 传入事件可能不会立即开始或停止与新规则或更新后的规则的匹配。请稍等片刻,以便更改生效。

如果事件在短时间内仍未匹配,请检查 CloudWatch 指标TriggeredRulesInvocations, 和FailedInvocations为您的规则。有关这些指标的更多信息,请参阅Amazon CloudWatch Events 指标和维度中的Amazon CloudWatch 用户指南

如果规则旨在匹配Amazon服务,请使用TestEventPattern操作来测试规则的事件模式与测试事件匹配。有关更多信息,请参阅 。TestEventPattern中的Amazon CloudWatch Events API 参考

我的规则没有在我在ScheduleExpression

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

我的规则在我期望的时间没有运行

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

您可以使用 cron 表达式调用targets指定时间。若要创建在第 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 Expressio。

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 角色时可以使用它们。有关更多信息,请参阅 。激活和停用Amazon STS在Amazon区域中的IAM 用户指南

我的规则有一个应与资源匹配的事件模式,但没有事件匹配

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

某些事件,如AmazonAPI 调用事 CloudTrail,资源字段中没有任何内容。

我的事件传输到目标的时间延迟

EventBridge 试图提供一个event设置为target长达 24 小时,但目标资源受限的情况除外。事件一旦到达事件流,立即会进行第一次尝试。如果目标服务遇到问题,EventBridge 会自动重新计划另一次传输。如果从事件到达时算起过去了 24 小时,EventBridge 会停止尝试传输事件并发布FailedInvocations指 CloudWatch。我们建 CloudWatch 在FailedInvocations指标。

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

如果targetEventBridge规则时间长时间受限,EventBridge 可能不会重试传输。例如,如果未设置目标来处理传入的event流量和目标服务正在限制 EventBridge 代表您发出的请求,则 EventBridge 可能不会重试传输。

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

在极少数情况下,同样规则可以运行多次event或计划时间,或者相同的target可以为给定的触发规则多次调用。

防止无限循环

在 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.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 将设置target

方案 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 作为target,EventBridge 会代表您向您的 Amazon SNS 主题添加权限。如果您在创建规则后不久删除规则,EventBridge 可能不会从您的 Amazon SNS 主题删除权限。这种情况下,您可以从该主题删除权限,方式是使用aws sns set-topic-attributes命令。有关用于发送事件的基于资源权限的信息,请参阅使用 Amazon EventBridge 的基于资源的策略

我可以将哪种 IAM 条件键用于 EventBridge?

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

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

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

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

  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/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. 操作下面,为每当此警报选择状态为“警报”

  9. 适用于Send notification to (发送通知到)中,选择一个现有 Amazon SNS 主题或创建一个新的主题。要创建新主题,请选择新建列表。为 Amazon SNS 新主题键入名称,例如:myFailedRules

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

  11. 选择 Create Alarm (创建警报)