如何解决与 Amazon EventBridge 规则有关的问题?

2 分钟阅读
0

我想解决为什么我的 Amazon EventBridge 规则没有按预期触发或调用目标。

简短描述

使用此验证工作流来隔离问题:

  1. 确认相关事件已发生(例如,AWS CloudTrail API 调用或简单存储服务(Amazon S3)对象上传)。
  2. 确认该事件与规则事件模式匹配。
  3. 确认目标成功处理了事件(例如,该事件调用了 AWS Lambda 函数)。

解决方法

使用以下步骤来解决与 Amazon EventBridge 规则相关的问题:

验证传入的事件

用以下一种或多种方式验证传入的事件:

  • 如果 AWS CloudTrail 捕获了事件,请分析 CloudTrail 日志。验证是否在预期的时间发生 API 调用,并且匹配事件模式中的所有字段。
    **注意:**某些 AWS 服务仅在 us-east-1 区域可用。例如,AWS Identity and Access Management (IAM)API 调用仅在 us-east-1 区域发布。如果在其他区域创建了匹配 IAM 事件的规则,这些事件不会转发到 EventBridge。因此,该规则不是由这些事件触发的。
  • Amazon EventBridge 控制台提供了 EventBridge 工具沙盒,其中包含示例 AWS 和合作伙伴事件。使用该工具将建议的事件模式与 AWS、合作伙伴和自定义事件进行匹配。还可以使用 TestEventPattern API 来确认事件模式和事件之间的匹配。
  • EventBridge 提供 TriggeredRules 指标,用于报告成功匹配的事件的规则。TriggeredRules 数据点的时间戳显示事件发生的时间。

查看 CloudWatch 指标

请按照以下步骤查看 Amazon EventBridge 规则的 CloudWatch 指标:

  1. 打开 CloudWatch 控制台
  2. 选择所有指标
  3. 选择 AWS/Events 命名空间。
  4. 为相关规则选择 TriggerRulesInvocationsFailedInvocations 指标(如有)。您可以通过 SUM 统计数据查看这些指标。

验证事件模式

要匹配事件,事件模式中的所有字段都必须匹配。使用沙盒工具根据包含几个字段的事件模式测试所需的事件。例如,使用简单的事件模式,如此处列出的内容:

{
    "source": ["aws.s3"]
}

如果成功匹配,则会增加事件模式的复杂性。您添加到事件模式的每个字段都会筛选与之匹配的事件并缩小其焦点。

以下是事件模式示例。该模式将 Amazon S3 API 调用列表与以两个字符串中的任何一个开头对象的特定桶进行匹配:feature1 和 feature2。

{
  "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/"
        }
      ]
    }
  }
}

逐渐添加字段,隔离与目标事件不匹配的字段。

验证目标

  • 当规则将事件转发到目标时,Invocations 指标会发布一个数据点。这代表成功的调用和失败的调用。

  • Amazon EventBridge 无法永久调用目标时,它会发布一个 FailedInvocations 数据点。FailedInvocations 表示目标配置存在问题或权限不足引起的问题。

  • 必须向 Amazon EventBridge 授予相应的权限才能调用目标。根据目标的不同,AWS Identity and Access Management(IAM)角色资源策略授予权限。

  • 当您使用 Amazon EventBridge 控制台创建规则时,控制台会自动向相关资源添加所需的权限。
    **注意:**如果您使用 AWS SDK、AWS 命令行界面(AWS CLI)或 AWS CloudFormation 部署规则,请显式配置权限。

  • 如果没有任何 FailedInvocations 数据点,则 Amazon EventBridge 成功将事件传送给了目标。但是,目标可能无法正常运行。例如,AWS Lambda 目标在运行或限制时可能会遇到错误。要获取更多信息,请查看目标的 Amazon CloudWatch 指标和所有相关日志。

  • Amazon Simple Queue Service(Amazon SQS)死信队列(DLQ)与目标相关联。未传送到目标的事件将发送到死信队列。您可以使用此方法来获取有关失败事件的更多详细信息。查看以下从 DLQ 检索到的失败事件的消息片段:

    "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 服务没有调用 Lambda 目标所需的权限。

  • Amazon EventBridge 规则最多支持五个目标。暂时附上 Amazon CloudWatch Logs 群组目标或 Amazon Simple Notification Service(Amazon SNS)主题。此操作会捕获转发给目标的事件或隔离目标的错误配置。日志或主题提供以下服务:

  • 确认目标必须解析和处理的事件正文和特定字段

  • 确认事件已传送到目标

  • 确认输入变压器配置正确

相关信息

对 Amazon EventBridge 进行故障排除

为什么我的 Lambda 函数不是由我的 CloudWatch 事件规则触发的?

如何解决 Amazon EventBridge 调度器中的错误?

AWS 官方
AWS 官方已更新 9 个月前