我想解决使用 AWS 命令行界面(AWS CLI)创建的 Amazon EventBridge 规则不调用我的 AWS Lambda 函数的问题。
简短描述
使用以下步骤来确定问题:
- 确认事件源已发布事件并触发了关联的 Amazon EventBridge 规则。
- 确认 EventBridge 规则调用了配置的目标。
- 如果目标调用失败,请确认 AWS Lambda 函数在其资源策略中具有相应的权限。
解决方法
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
查看 EventBridge 规则的 CloudWatch 指标
- 打开 Amazon CloudWatch 控制台。
- 在左侧导航窗格的指标下,选择所有指标。
- 选择 AWS/Events 命名空间。
- 为相关规则选择 TriggerRules、Invocations 和 FailedInvocations 指标(如有)。如有必要,可以通过 SUM 统计数据查看这些指标。
**注意:**TriggerRules 数据点表示触发了 EventBridge 规则的事件。Invocation 数据点表示调用了相应目标的 EventBridge 规则。如果指标包含 FailedInvocations 数据点,则这些数据点表示该规则可能无法调用目标。FailedInvocations 表示永久失败,可能是由于权限不正确或目标配置错误所致。
确认 Lambda 函数的资源策略具有相应的权限
在创建以 Lambda 函数为目标的 EventBridge 规则时,请记住以下事项:
- 当您使用 Amazon EventBridge 控制台创建规则时,控制台会自动向函数的资源策略添加相应的权限。
- 当您使用 AWS CLI、SDK 或 AWS CloudFormation 创建规则时,必须手动应用资源策略中的权限。
这些权限授予 Amazon EventBridge 服务调用 Lambda 函数的权限。
查看与目标 Lambda 函数关联的权限
请按照以下步骤进行操作:
- 打开 AWS Lambda 控制台。
- 选择目标 Lambda 函数。
- 选择配置选项卡,然后选择权限。
- 在基于资源的策略部分下,查看策略文档。
或者,通过相应的输入来使用 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 和资源名称。
更新资源策略
如果您需要更新资源策略,请按照下列步骤进行操作:
- 打开 AWS Lambda 控制台。
- 选择目标 Lambda 函数。
- 选择配置选项卡,然后选择权限。
- 在基于资源的策略部分,选择添加权限。
- 选择 AWS 服务 - EventBridge(CloudWatch 事件)。
- 提供语句 ID(Sid)作为您的策略语句的可选标识符。
- 将 events.amazonaws.com 作为委托人提供。
**注意:**这通常是自动填充的。
- 提供**源 ARN ** 作为 EventBridge 规则的 ARN。
- 对于操作,从下拉列表中选择 lambda:InvokeFunction。
- 选择保存。
您也可以使用 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 中检索事件,以进行分析并获取有关该问题的更多背景信息。修正后,可以将失败的事件重新发送到目标进行处理。
- 在 EventBridge 控制台中打开相关规则。
- 在目标下,选择编辑,然后展开其他设置部分。
- 在死信队列下,选择选择当前 AWS 账户中的一个 Amazon SQS 队列作为死信队列。
- 选择要用作 DLQ 的 SQS 队列。
- 分配 DLQ 后,完成编辑规则部分的其余步骤以保存更改。
相关信息
我的规则运行了,但未调用我的 Lambda 函数
为 Amazon EventBridge 使用基于资源的策略: AWS Lambda 权限
事件重试策略和死信队列的使用
改进了 Amazon EventBridge 的故障恢复