为什么我的 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 指标
- 打开 CloudWatch 控制台。
- 从左侧导航窗格中的 Metrics(指标)下,选择 All Mertics(所有指标)。
- 选择 AWS/Events(AWS/事件)命名空间。
- 为您查看的指标选择 Invocations(调用)和 FailedInvocations(未能调用)指标。
Invocation(调用)数据点指示规则调用了目标。如果存在 FailedInvocations(未能调用)数据点,则表示调用目标时出现问题。FailedInvocations(未能调用)表示永久性故障,可能是由权限不正确或目标配置错误所致。
确认 Lambda 函数资源策略包含适当的权限
- 打开 AWS Lambda 控制台。
- 选择目标函数。
- 选择 Configuration(配置)选项卡,然后选择 Permissions(权限)。
- 在 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 中检索事件并对其进行分析,以获取有关问题的更多背景信息。修复完成后,可以将以前失败的事件重新发送到目标进行处理。
- 在 EventBridge 控制台中打开相关规则。
- 在 Targets(目标)下,选择 Edit(编辑),然后展开 Additional settings(其他设置)部分。
- 在 Dead-letter queue(死信队列)下,选择 Select an Amazon SQS queue in the current AWS account to use as the dead-letter queue(在当前 AWS 账户中选择一个 Amazon SQS 队列用作死信队列)。
- 选择要用作 DLQ 的 SQS 队列。
- 分配 DLQ 后,完成 Edit Rule(编辑规则)部分中的剩余步骤以保存更改。