本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对亚马逊进行故障排除 EventBridge
您可以使用本节中的主题来解决 Amazon EventBridge 问题。
主题
- 我的规则已运行,但 Lambda 函数没有被调用
- 我刚刚创建或修改了规则,但它未能匹配测试事件
- 我在 ScheduleExpression 中指定了时间,但我的规则没有运行
- 我的规则未在我期望的时间运行
- 我的规则与 AWS 全球服务API呼叫相匹配,但它没有运行
- 规则运行时,与我的规则关联的IAM角色被忽略
- 我的规则的事件模式应该与某资源匹配,但未匹配事件
- 向目标传送我的事件时存在延迟
- 某些事件从未传送到我的目标
- 我的规则在回应一个事件时多次运行
- 防止无限循环
- 我的活动未发送到目标 Amazon SQS 队列
- 我的规则已运行,但我没有看到任何消息发布到我的 Amazon SNS 话题中
- EventBridge即使我删除了与亚马逊SNS主题相关的规则,我的亚马逊SNS主题仍然具有访问权限
- 我可以与哪些IAM条件键一起使用 EventBridge?
- 我怎么知道什么时候 EventBridge 违反了规则?
我的规则已运行,但 Lambda 函数没有被调用
您的 Lambda 函数无法运行的原因之一是您没有适当的权限。
检查您对 Lambda 函数的权限
-
使用 AWS CLI,对您的函数和 AWS 区域运行以下命令:
aws lambda get-policy --function-name
MyFunction
--regionus-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\"}" }
-
如果您看到以下消息:
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-idMyId
\ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012
:rule/MyRule
-
如果输出包含
SourceAccount
字段,则需要删除该字段。SourceAccount
设置会 EventBridge 阻止调用该函数。
注意
如果策略不正确,则可以在 EventBridge 控制台中编辑该规则,方法是将其删除,然后将其重新添加到规则中。然后, EventBridge 控制台会为目标设置正确的权限。
如果您使用特定的 Lambda 别名或版本,则必须在 aws lambda get-policy
和 aws lambda add-permission
命令中添加 --qualifier
参数,如以下命令所示
aws lambda add-permission \ --function-name
MyFunction
\ --statement-idMyId
\ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012
:rule/MyRule
--qualifieralias or version
我刚刚创建或修改了规则,但它未能匹配测试事件
在更改规则或其目标后,传入事件可能无法立即开始或停止与新的或更新后的规则的匹配。请稍等片刻,以便更改生效。
如果事件在短时间后仍然不匹配,请检查 CloudWatch 指标TriggeredRules
Invocations
、和FailedInvocations
是否符合您的规则。有关这些指标的更多信息,请参阅监控 Amazon EventBridge。
如果该规则旨在匹配来自 AWS 服务的事件,请执行以下操作之一:
使用
TestEventPattern
操作来测试您的规则的事件模式是否与测试事件匹配。有关更多信息,请参阅 Amazon EventBridge API 参考TestEventPattern中的。在EventBridge 主机
上使用沙盒。
我在 ScheduleExpression
中指定了时间,但我的规则没有运行
确保您已在 UTC +0 时区为该规则设置了时间表。如果 ScheduleExpression
正确,则按照我刚刚创建或修改了规则,但它未能匹配测试事件中的步骤操作。
我的规则未在我期望的时间运行
EventBridge 在您设置的开始时间后的一分钟内运行规则。规则一旦创建,倒计时立即开始。
注意
计划规则的传送类型为 guaranteed
,这意味着事件将在每个预期时间至少触发一次。
您可以使用 cron 表达式在指定时间调用目标。要创建每四小时的第 0 分钟运行一次的规则,请执行以下操作之一:
-
在 EventBridge 控制台中,您可以使用 cron 表达式
0 0/4 * * ? *
。 -
使用 AWS CLI,您可以使用表达式
cron(0 0/4 * * ? *)
。
例如,要使用创建每隔 4 小时运行一次的名为TestRule
的规则 AWS 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 目标服务是分布式的,因此从计划规则运行到目标服务对目标资源执行操作之间可能会有几秒钟的延迟。
我的规则与 AWS 全球服务API呼叫相匹配,但它没有运行
AWS 全球服务(例如IAM和 Amazon Route 53)仅在美国东部(弗吉尼亚北部)地区可用,因此来自全球服务 AWS API呼叫的事件仅在该地区可用。有关更多信息,请参阅 来自亚马逊 AWS 服务的事件 EventBridge。
规则运行时,与我的规则关联的IAM角色被忽略
EventBridge 仅将IAM角色用于向 Kinesis 直播发送事件的规则。对于调用 Lambda 函数或 Amazon SNS 主题的规则,您需要提供基于资源的权限。
确保您的区域 AWS STS 终端节点已启用,以便在担任您提供的IAM角色时 EventBridge 可以使用这些终端节点。有关更多信息,请参阅《IAM用户指南》 AWS STS 中的在某个 AWS 地区激活和停用。
我的规则的事件模式应该与某资源匹配,但未匹配事件
中的大多数服务都 AWS 将冒号 (:) 或斜杠 (/) 视为亚马逊资源名称 (ARNs) 中的相同字符。,但在事件模式和规则中 EventBridge 使用完全匹配的字符。创建事件模式时,请务必使用正确的ARN字符,以便它们与事件中的ARN语法相匹配。
有些事件(例如来自 CloudTrail的 AWS 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钥策略中包含以下权限部分。有关更多信息,请参阅配置 AWS 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 主题中。使用以下命令 AWS 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\"}
然后使用设置主题属性 AWS CLI,使用以下命令。
aws sns set-topic-attributes --region
us-east-1
--topic-arn "arn:aws:sns:us-east-1:123456789012
:MyTopic" --attribute-name Policy --attribute-valueNEW_POLICY_STRING
方案 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 支持 AWS-wide 条件键(参见IAM《IAM用户指南》中的AWS STS 条件上下文密钥),以及中列出的密钥。在 Amazon 中使用IAM政策条件 EventBridge
我怎么知道什么时候 EventBridge 违反了规则?
当您的 EventBridge 规则被违反时,您可以使用以下警报来通知您。
创建警报以在违反规则时发出通知
-
打开 CloudWatch 控制台,网址为https://console.aws.amazon.com/cloudwatch/
。 -
选择创建警报。在 “按类别划分的CloudWatch 指标” 窗格中,选择事件指标。
-
在指标列表中,选择FailedInvocations。
-
在图形上方,依次选择 Statistic 和 Sum。
-
对于 Period,选择一个值,例如 5 minutes。选择下一步。
-
例如,在 “警报阈值” 下的 “名称” 中,键入警报的唯一名称myFailedRules。对于描述,键入警报的描述,例如 Rules aren't delivering events to targets。
-
对于 is,依次选择 >= 和 1。对于 for,输入 10。
-
在 “操作” 下的 “每当此警报出现时”,选择 “状态为” ALARM。
-
在 “发送通知至” 中,选择现有的 Amazon SNS 主题或创建一个新主题。要创建新主题,请选择新建列表。输入新 Amazon SNS 主题的名称,例如:myFailedRules。
-
在电子邮件列表中,键入以逗号分隔的电子邮件地址列表,以便在警报变为状态时收到通知。ALARM
-
选择创建警报。