为什么我的 EventBridge 规则未触发 Lambda 函数?

上次更新日期:2022 年 2 月 15 日

我使用 AWS Command Line Interface (AWS CLI)、API 或 AWS CloudFormation 创建了 Amazon EventBridge 规则。但未调用目标 AWS Lambda 函数。当我通过 AWS 管理控制台创建或更新相同的 EventBridge 规则时,该规则可以正常工作。如何排查此问题?

简短描述

当您使用 EventBridge 控制台以 Lambda 函数作为目标创建 EventBridge 规则时,适当的权限将自动添加到该函数的资源策略中。但是,当通过 AWS CLI、软件开发工具包或 AWS CloudFormation 创建相同的规则时,必须在资源策略中手动应用这些权限。这些权限将授予 Amazon EventBridge 服务调用 Lambda 函数的权限。

解决方法

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

查看 EventBridge 规则的 CloudWatch 指标

  1. 打开 CloudWatch 控制台
  2. 从左侧导航窗格中的 Metrics(指标)下,选择 All Mertics(所有指标)。
  3. 选择 AWS/Events(AWS/事件)命名空间。
  4. 为您查看的指标选择 Invocations(调用)和 FailedInvocations(未能调用)指标。

Invocation(调用)数据点指示规则调用了目标。如果存在 FailedInvocations(未能调用)数据点,则表示调用目标时出现问题。FailedInvocations(未能调用)表示永久性故障,可能是由权限不正确或目标配置错误所致。

确认 Lambda 函数资源策略包含适当的权限

  1. 打开 AWS Lambda 控制台
  2. 选择目标函数。
  3. 选择 Configuration(配置)选项卡,然后选择 Permissions(权限)。
  4. Resource-based policy(基于资源的策略)部分下,查看策略文档。

以下是允许 EventBridge 调用 Lambda 函数的示例资源策略:

{
  "Effect": "Allow",
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:region:account-id:function:function-name",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
    }
  },
  "Sid": "InvokeLambdaFunction"
}

注意:在部署之前,请将 ARN 替换为适当的区域、账户 ID 和资源名称。

或者,您也可以使用 GetPolicy API 来检索 Lambda 函数的资源策略。

如果现有资源策略不包含所需的权限,请参照前面的步骤来更新策略。您还可以使用 AWS CLI 中的 AddPermission 命令更新策略。以下是 AddPermission 命令的示例:

aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule

向目标添加 Amazon SQS 死信队列

EventBridge 使用 Amazon Simple Queue Service (Amazon SQS) DLQ 存储无法传送到目标的事件。SQS DLQ 可以附加到报告 FailedInvocations 的目标上。可以从 DLQ 中检索事件并对其进行分析,以获取有关问题的更多背景信息。修复完成后,可以将以前失败的事件重新发送到目标进行处理。

  1. 在 EventBridge 控制台中打开相关规则。
  2. 选择目标下,选择重试策略和死信队列
  3. 选择要用作 DLQ 的 SQS 队列