如何解决与 EventBridge 规则有关的问题?
我想解决无法触发目标的 Amazon EventBridge 规则。
简短描述
要解决无法触发目标的 EventBridge 规则,请完成以下步骤:
- 确认相关事件已发生。
- 确认该事件与规则事件模式匹配。
- 确认目标成功处理了该事件。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
确认相关事件已发生
执行以下操作:
- 如果 AWS CloudTrail 捕获了事件,请分析 CloudTrail 日志。验证是否在预期的时间发生 API 调用,并且匹配事件模式中的所有字段。
**注意:**某些 AWS 服务仅在 us-east-1 区域可用。例如,AWS Identity and Access Management (IAM) API 调用仅在 us-east-1 AWS 区域发布。如果您在其他区域创建了规则,则这些事件不会转发到 EventBridge,也不会触发规则。 - EventBridge 控制台提供了沙盒工具,其中包含示例 AWS 与合作伙伴事件。使用该工具将事件模式与 AWS、合作伙伴和自定义事件进行匹配。还可以使用 TestEventPattern API 来确认事件模式和事件之间的匹配。
- EventBridge 提供 TriggeredRules 指标,用于报告成功匹配的事件的规则。使用 TriggeredRules 指标的时间戳来查看事件发生的时间。
查看 CloudWatch 指标
要查看 EventBridge 规则的 Amazon CloudWatch 指标,请完成以下步骤:
- 打开 CloudWatch 控制台。
- 选择所有指标。
- 选择 AWS/Events 命名空间。
- 为该规则选择 TriggeredRules、Invocations 和 FailedInvocations 指标。
**注意:**您可以通过 SUM 统计数据查看这些指标。
确认该事件与规则事件模式匹配
要匹配事件,事件模式中的所有字段都必须匹配。使用沙盒工具根据包含几个字段的事件模式测试事件。使用如下所示的简单事件模式:
{ "source": ["aws.s3"] }
如果成功匹配,则会增加事件模式的复杂性。您添加到事件模式的每个字段都会筛选与之匹配的事件并缩小其焦点。要获取确切的模式,用户可以临时附加 CloudWatch Logs 组目标或 Amazon Simple Notification Service (Amazon SNS) 主题。此操作会捕获转发给目标的事件或隔离目标的错误配置。它还会确认事件是否已传送到目标,并且输入转换器是否配置正确。
根据传送给目标的事件,重写模式以满足用户要求。以下是事件模式示例:
{ "source": [ "aws.s3" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventName": [ "PutObject", "DeleteObject", "DeleteObjects" ], "requestParameters": { "bucketName": [ "123456789012-prod-app1" ], "key": [ { "prefix": "feature1/" }, { "prefix": "feature2/" } ] } } }
**注意:**该模式与针对以 feature1 或 feature2 开头的对象的特定存储桶的 Amazon Simple Storage Service (Amazon S3) API 调用列表相匹配。
您可以逐步添加字段以隔离与事件不匹配的字段。
确认目标成功处理了该事件
当规则将事件转发到显示成功和失败调用的目标时,Invocations 指标会发布一个数据点。EventBridge 无法永久调用目标时,它会发布一个 FailedInvocations 数据点。此数据点表示目标配置的问题或权限不足的问题。
EventBridge 必须具有调用目标所需的权限。IAM 角色或资源策略可以为目标授予权限。当您使用 EventBridge 创建规则时,控制台会自动为相关资源添加所需的权限。
**注意:**如果您使用 AWS SDK、AWS 命令行界面 (AWS CLI) 或 AWS CloudFormation 部署规则,请配置权限。
如果没有任何 FailedInvocations 数据点,则 EventBridge 成功将事件传送给了目标。但是,目标可能无法正常运行。例如,AWS Lambda 目标在运行或限制时可能会遇到错误。有关详细信息,请查看目标的 CloudWatch 指标和所有相关日志。
要确定 FailedInvocations 的原因,请将Amazon Simple Queue Service (Amazon SQS) 死信队列 (DLQ) 与目标关联。
要在目标上配置 DLQ,请完成以下步骤:
- 创建 SQS 队列。
- 选择事件规则,然后选择 Edit(编辑)。
- 选择 Targets(目标)选项卡,然后选择 Edit(编辑)。
- 展开要为其设置重试策略的目标的 Additional settings(其他设置)选项卡。
- 在 Dead-letter queue(死信队列)部分中,根据您的 SQS DLQ 位于同一账户还是不同的账户中选择一个选项。
- 选择 Select an Amazon SQS queue in the current AWS account to use as the dead-letter queue(在当前 AWS 账户中选择一个 Amazon SQS 队列用作死信队列),然后选择 SQS 队列的名称。
- 选择 Update(更新)。
如果规则调用失败,则 DLQ 会记录错误消息。要查看此错误,请完成以下步骤:
- 从 SQS 队列中选择 Send and receive(发送和接收)消息。
- 选择 Poll for messages(轮询消息)。
- 选择一条错误消息,然后转到 Attributes(属性)部分。
以下是来自 DLQ 的消息示例,该消息显示 EventBridge 没有调用 Lambda 目标所需的权限:
"MessageAttributes": { "ERROR_CODE": { "StringValue": "NO_PERMISSIONS", "DataType": "String" }, "ERROR_MESSAGE": { "StringValue": "User: events.amazonaws.com is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123456789012:function:Hello_World because no resource-based policy allows the lambda:InvokeFunction action (Service: AWSLambdaInternal; Status Code: 403; Error Code: AccessDeniedException; Request ID: 6635c4c4-9c54-416e-bc40-ef25bad0aca5; Proxy: null)", "DataType": "String" },
相关信息
为什么我的 Lambda 函数不是由我的 EventBridge 规则触发的?
- 语言
- 中文 (简体)
