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

上次更新日期:2022 年 8 月 10 日

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

简短描述

创建以 Lambda 函数为目标的 EventBridge 规则时,请记住以下几点:

  • 使用 EventBridge 控制台创建规则时,相应的权限会自动添加到函数的资源策略中。
  • 使用 AWS CLI、软件开发工具包或 AWS CloudFormation 创建相同的规则时,必须在资源策略中手动应用这些权限。

这些权限将授予 Amazon EventBridge 服务调用 Lambda 函数的权限。

解决方法

注意:如果在运行 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. Targets(目标)下,选择 Edit(编辑),然后展开 Additional settings(其他设置)部分。
  3. Dead-letter queue(死信队列)下,选择 Select an Amazon SQS queue in the current AWS account to use as the dead-letter queue(在当前 AWS 账户中选择一个 Amazon SQS 队列用作死信队列)。
  4. 选择要用作 DLQ 的 SQS 队列。
  5. 分配 DLQ 后,完成 Edit Rule(编辑规则)部分中的剩余步骤以保存更改。