跳至内容

如何排查与 EventBridge 规则有关的问题?

3 分钟阅读
0

我的 Amazon EventBridge 规则未发送到目标。

解决方法

**注意:**以下故障排除步骤适用于所有 EventBridge 目标类型。如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

检查您的配置

为确保您已正确配置 EventBridge 规则,请验证以下设置。

确认事件已发生

注意:AWS 全局服务仅在 us-east-1 区域可用。如果您在其他区域为这些服务创建了规则,则这些服务不会将事件转发到 EventBridge。因此,EventBridge 不会运行该规则。

查看 CloudWatch 指标

要确定问题的原因,请在 AWS/Events(AWS/事件)命名空间中查看 Amazon CloudWatch 控制台,检查以下 EventBridge 指标

  • 检查 TriggeredRules 以查看 EventBridge 是否运行了规则。如果该值为 0,则检查您的 API 调用以验证事件是否发生。您可以使用此指标的时间戳来检查事件发生的时间。
  • 检查 Invocations 以查看 EventBridge 是否调用了目标。如果 TriggeredRules 有值但 Invocations 没有值,则说明规则未调用目标。要解决此问题,请检查规则的目标配置
  • 检查 FailedInvocations 以查看目标调用是否失败。如果 InvocationsFailedInvocations 均有值,则说明目标出现问题。

检查配置的 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 调用。它与针对以 feature1feature2 开头的对象的特定 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) 死信队列与目标进行关联:

  1. 打开 EventBridge 控制台
  2. 选择 Rules(规则),然后选择您的规则。
  3. Targets(目标)下,选择目标,然后选择 Edit(编辑)。
  4. 展开 Additional settings(其他设置),然后配置 Maximum age of event(事件的最长保留时间)和 Retry attempts(重试次数)值。
    **注意:**只有在事件超过最长保留时间和最大重试次数后,EventBridge 才会将其发送到死信队列。默认情况下,这些值分别设置为最长 24 小时185 次重试次数。
  5. Dead-letter queue(死信队列)下,选择同一或不同 AWS 账户中的 Amazon SQS 队列。然后,选择用于在 EventBridge 完成重试后捕获失败事件的 SQS 队列。
    **注意:**如果没有现有队列,请创建一个 SQS 队列
  6. 选择 Next(下一步)或 Update rule(更新规则)以保存您的更改。

**注意:**如果没有任何 FailedInvocations 数据点,则说明 EventBridge 已成功将事件传送到目标,而问题出在目标本身。例如,AWS Lambda 目标在运行时可能会遇到错误或被节流。要对这些问题进行故障排除,请检查目标的 CloudWatch 指标和日志。

使用死信队列对失败调用进行故障排除

如果规则调用失败,则死信队列会记录错误消息。

要查看此错误,请完成以下步骤:

  1. 打开 Amazon SQS 控制台
  2. 选择 Queues(队列),然后选择您的死信队列。
  3. 选择 Send and receive messages(发送和接收消息)。
  4. 选择 Poll for messages(轮询消息)。
  5. 从列表中选择一条错误消息。
  6. 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"
                    },

相关信息

对 Amazon EventBridge 进行故障排除

为什么我的 EventBridge 规则未调用我的 Lambda 函数?

如何对 EventBridge 调度器中的错误进行故障排除?

在 EventBridge 中使用死信队列处理未传送的事件

AWS 官方已更新 7 个月前