使用 AWS SDK 为事件桥规则添加 AWS Lambda 作为目标
Posted
技术标签:
【中文标题】使用 AWS SDK 为事件桥规则添加 AWS Lambda 作为目标【英文标题】:adding AWS Lambda as target using AWS SDK for event bridge rule 【发布时间】:2021-05-13 05:12:12 【问题描述】:我正在使用无服务器框架和 AWS Node.js 开发工具包将基于计划 cron 表达式的规则添加到默认事件总线。
eventBridge.putRule(params, function (err, data) ...
之后我将目标添加到此规则中。
const params =
Rule: data.ruleName,
Targets: [
Arn: process.env.SCHEDULED_EVENT_LAMBDA_ARN, /* required */
Id: process.env.SCHEDULED_EVENT_LAMBDA_ID, /* required */
Input: JSON.stringify(someData)
,
],
;
eventBridge.putTargets(params, function (err, data) ...
在事件桥上动态创建的计划 cron 规则上添加目标是成功的,但是当我导航到 lambda 仪表板时,触发层似乎没有更新,最终 lambda 函数没有被触发。
事件桥 putTargets
的 AWS 开发工具包文档提到:
For AWS Lambda and Amazon SNS resources, EventBridge relies on resource-based policies
因此,如果资源策略是问题(未确认),是否有任何关于资源策略的配置,我可以在 serverless.yml
文件中为允许事件桥服务添加层到部署的目标 lambda 函数的特定功能设置。
【问题讨论】:
【参考方案1】:对于动态生成,您可以使用AddPermission 添加必要的权限。
function addPermission ( lambdaArn, restApiId )
const region, namespace = parseArn(lambdaArn)
const params =
Action: 'lambda:InvokeFunction',
FunctionName: lambdaArn,
Principal: 'events.amazonaws.com',
StatementId: `scheduleName`,
SourceArn: `RuleARN`
return lambda.addPermission(params).promise()
如果您使用的是serverless
框架。
functions:
myFunction:
handler: index.handler
events:
- eventBridge:
schedule: rate(10 minutes)
input:
key1: value1
上面的定义只是简单地创建规则并添加你的 lambda 作为目标。它将处理必要的权限以及所需的权限。
Setting up event pattern matching
EventBridge Use Cases and Examples
Schedule
【讨论】:
计划的 cron 作业是通过 eventbridge 上的 api 动态添加的。我认为这是提前声明一个预定义的事件。 @UditBhardwaj 所以你想要的是允许eventbridge
正确触发你的 lambda?
是的,但是当添加新规则时,它会添加 lambda 作为其目标。这可行,但事件桥触发层未添加到 lambda。似乎来自 AWS-SDK 的事件桥 API 添加了目标,但无法更新 lambda 部署。
而直接从 AWS 管理控制台在事件桥服务的事件规则部分下添加事件规则目标(以 root 用户身份登录),lambda 函数会更新并显示事件桥层。
@UditBhardwaj 然后您可以简单地添加允许eventbridge
调用 lambda 的权限。 Is it possible to use configure Lambda Function Resource-based Policies using serverless framework?以上是关于使用 AWS SDK 为事件桥规则添加 AWS Lambda 作为目标的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift:将 AWS SDK 与 xCode6 结合使用 - 错误消息
多个 cloudwatch 事件规则可以触发 aws 目标吗