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

2 分钟阅读
0

我想解决使用 AWS 命令行界面(AWS CLI)创建的 Amazon EventBridge 规则不调用我的 AWS Lambda 函数的问题。

简短描述

使用以下步骤来确定问题:

  1. 确认事件源已发布事件并触发了关联的 Amazon EventBridge 规则。
  2. 确认 EventBridge 规则调用了配置的目标。
  3. 如果目标调用失败,请确认 AWS Lambda 函数在其资源策略中具有相应的权限。

解决方法

**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

查看 EventBridge 规则的 CloudWatch 指标

  1. 打开 Amazon CloudWatch 控制台
  2. 在左侧导航窗格的指标下,选择所有指标
  3. 选择 AWS/Events 命名空间。
  4. 为相关规则选择 TriggerRulesInvocationsFailedInvocations 指标(如有)。如有必要,可以通过 SUM 统计数据查看这些指标。
    **注意:**TriggerRules 数据点表示触发了 EventBridge 规则的事件。Invocation 数据点表示调用了相应目标的 EventBridge 规则。如果指标包含 FailedInvocations 数据点,则这些数据点表示该规则可能无法调用目标。FailedInvocations 表示永久失败,可能是由于权限不正确或目标配置错误所致。

确认 Lambda 函数的资源策略具有相应的权限

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

  • 当您使用 Amazon EventBridge 控制台创建规则时,控制台会自动向函数的资源策略添加相应的权限。
  • 当您使用 AWS CLI、SDK 或 AWS CloudFormation 创建规则时,必须手动应用资源策略中的权限。

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

查看与目标 Lambda 函数关联的权限

请按照以下步骤进行操作:

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

或者,通过相应的输入来使用 GetPolicy API 或 get-policy AWS CLI 命令,以检索 Lambda 函数的资源策略。

以下示例显示了允许 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 和资源名称。

更新资源策略

如果您需要更新资源策略,请按照下列步骤进行操作:

  1. 打开 AWS Lambda 控制台
  2. 选择目标 Lambda 函数。
  3. 选择配置选项卡,然后选择权限
  4. 基于资源的策略部分,选择添加权限
  5. 选择 AWS 服务 - EventBridge(CloudWatch 事件)
  6. 提供语句 ID(Sid)作为您的策略语句的可选标识符。
  7. events.amazonaws.com 作为委托人提供。
    **注意:**这通常是自动填充的。
  8. 提供**源 ARN ** 作为 EventBridge 规则的 ARN。
  9. 对于操作,从下拉列表中选择 lambda:InvokeFunction
  10. 选择保存

您也可以使用 AddPermission API 或 AWS Lambda add-permission AWS CLI 命令更新策略。

例如:

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 来存储无法传送到目标的事件。将 Amazon SQS DLQ 附加到报告 FailedInvocations 的目标。从 DLQ 中检索事件,以进行分析并获取有关该问题的更多背景信息。修正后,可以将失败的事件重新发送到目标进行处理。

  1. EventBridge 控制台中打开相关规则。
  2. 目标下,选择编辑,然后展开其他设置部分。
  3. 死信队列下,选择选择当前 AWS 账户中的一个 Amazon SQS 队列作为死信队列
  4. 选择要用作 DLQ 的 SQS 队列。
  5. 分配 DLQ 后,完成编辑规则部分的其余步骤以保存更改。

相关信息

我的规则运行了,但未调用我的 Lambda 函数

为 Amazon EventBridge 使用基于资源的策略: AWS Lambda 权限

事件重试策略和死信队列的使用

改进了 Amazon EventBridge 的故障恢复

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