如何排查与 EventBridge 规则有关的问题?
我的 Amazon EventBridge 规则未发送到目标。
解决方法
**注意:**以下故障排除步骤适用于所有 EventBridge 目标类型。如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
检查您的配置
为确保您已正确配置 EventBridge 规则,请验证以下设置。
- 规则设置为“启用”,而非“禁用”。
- 事件模式使用有效的 JSON 语法。
- 目标的 EventBridge 角色具有所需的 AWS Identity and Access Management (IAM) 权限。
- 目标存在且与 EventBridge 规则位于同一 AWS 区域中。
**注意:**要配置跨区域事件,请参阅在 Amazon EventBridge 中的 AWS 区域之间发送和接收事件。 - 基于资源的策略允许 EventBridge 调用目标。
- 事件源将事件发布到正确的区域。
确认事件已发生
注意:AWS 全局服务仅在 us-east-1 区域可用。如果您在其他区域为这些服务创建了规则,则这些服务不会将事件转发到 EventBridge。因此,EventBridge 不会运行该规则。
查看 CloudWatch 指标
要确定问题的原因,请在 AWS/Events(AWS/事件)命名空间中查看 Amazon CloudWatch 控制台,检查以下 EventBridge 指标:
- 检查 TriggeredRules 以查看 EventBridge 是否运行了规则。如果该值为 0,则检查您的 API 调用以验证事件是否发生。您可以使用此指标的时间戳来检查事件发生的时间。
- 检查 Invocations 以查看 EventBridge 是否调用了目标。如果 TriggeredRules 有值但 Invocations 没有值,则说明规则未调用目标。要解决此问题,请检查规则的目标配置。
- 检查 FailedInvocations 以查看目标调用是否失败。如果 Invocations 和 FailedInvocations 均有值,则说明目标出现问题。
检查配置的 API 调用
查看 AWS CloudTrail 事件历史记录,验证事件 API 调用是否在预期的时间发生。此外,请确保该事件与事件模式中的所有字段相匹配。
确认事件与规则事件模式匹配
要使 EventBridge 运行规则,事件模式中的所有字段都必须与该规则的事件相匹配。使用 EventBridge 沙盒工具来测试事件是否与特定事件模式字段相匹配。最佳做法是从使用少量字段的事件模式开始测试。
事件模式示例:
{ "source": ["aws.s3"]}
如果您成功匹配了该事件模式,则会增加事件模式的复杂性。每一个新增字段都会缩小事件模式测试的焦点。
如果您不知道自己的事件架构,请临时附加一个 Amazon CloudWatch Logs 组目标或 Amazon Simple Notification Service (Amazon SNS) 主题。查看 EventBridge 传送到 CloudWatch Logs 组目标或 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/" } ] } } }
**注意:**上述模式适用于一系列 Amazon Simple Storage Service (Amazon S3) API 调用。它与针对以 feature1 或 feature2 开头的对象的特定 Amazon S3 存储桶的 API 调用相匹配。
您还可以使用 TestEventPattern API 来检查事件是否与事件模式相匹配。
根据产生事件的 AWS 服务,使用以下常见事件模式。
Amazon Elastic Compute Cloud (Amazon EC2) 实例状态更改:
{ "source": ["aws.ec2"], "detail-type": ["EC2 Instance State-change Notification"], "detail": { "state": ["running", "stopped"] } }
Amazon Relational Database Service (Amazon RDS) 失效转移或故障:
{ "source": ["aws.rds"], "detail-type": ["RDS DB Instance Event"], "detail": { "EventCategories": ["failover", "failure"] } }
AWS Step Functions 执行失败、超时或被取消:
{ "source": ["aws.states"], "detail-type": ["Step Functions Execution Status Change"], "detail": { "status": ["FAILED", "TIMED_OUT", "ABORTED"], "stateMachineArn": ["arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine"] } }
检查事件模式语法
确保您的事件模式遵循以下语法:
- 在所有字段名称或值前后使用引号。
- 使用数组表示法,而不是等号。例如,使用 "state": ["running"] 而非 "state": "running"。
- 验证您的详细信息对象中的嵌套级别是否适合您的配置。
- 确保所有字段都匹配。事件模式使用 AND 逻辑,而非 OR。
- 确保根据事件架构正确使用通配符。
确认目标已成功处理该事件
对失败调用进行故障排除
如果 CloudWatch 控制台中的 FailedInvocations 存在数据点,请检查您的目标配置和权限是否存在问题。
EventBridge 必须具有调用目标的权限。当您使用 EventBridge 创建规则时,控制台会自动为相关资源添加所需的权限。但是,如果您使用 AWS SDK、AWS CLI 或 AWS CloudFormation 来部署规则,则必须配置权限。您可以使用已附加所需 EventBridge 策略的 IAM 角色或基于资源的策略。
配置死信队列
如果调用失败,EventBridge 会使用指数回退自动重试。
要确定 FailedInvocations 的原因,请完成以下步骤,将 Amazon Simple Queue Service (Amazon SQS) 死信队列与目标进行关联:
- 打开 EventBridge 控制台。
- 选择 Rules(规则),然后选择您的规则。
- 在 Targets(目标)下,选择目标,然后选择 Edit(编辑)。
- 展开 Additional settings(其他设置),然后配置 Maximum age of event(事件的最长保留时间)和 Retry attempts(重试次数)值。
**注意:**只有在事件超过最长保留时间和最大重试次数后,EventBridge 才会将其发送到死信队列。默认情况下,这些值分别设置为最长 24 小时和 185 次重试次数。 - 在 Dead-letter queue(死信队列)下,选择同一或不同 AWS 账户中的 Amazon SQS 队列。然后,选择用于在 EventBridge 完成重试后捕获失败事件的 SQS 队列。
**注意:**如果没有现有队列,请创建一个 SQS 队列。 - 选择 Next(下一步)或 Update rule(更新规则)以保存您的更改。
**注意:**如果没有任何 FailedInvocations 数据点,则说明 EventBridge 已成功将事件传送到目标,而问题出在目标本身。例如,AWS Lambda 目标在运行时可能会遇到错误或被节流。要对这些问题进行故障排除,请检查目标的 CloudWatch 指标和日志。
使用死信队列对失败调用进行故障排除
如果规则调用失败,则死信队列会记录错误消息。
要查看此错误,请完成以下步骤:
- 打开 Amazon SQS 控制台。
- 选择 Queues(队列),然后选择您的死信队列。
- 选择 Send and receive messages(发送和接收消息)。
- 选择 Poll for messages(轮询消息)。
- 从列表中选择一条错误消息。
- 在 Attributes(属性)下,检查错误详情。
以下示例消息显示 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" },
相关信息
为什么我的 EventBridge 规则未调用我的 Lambda 函数?
- 语言
- 中文 (简体)
