node.js - 使用 AWS SDK 为事件桥规则添加 AWS Lambda 作为目标
问题描述
我正在使用无服务器框架和 AWS Node.js SDK 将基于计划的 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 函数没有被触发。
事件桥的 AWS 开发工具包文档putTargets
提到:
For AWS Lambda and Amazon SNS resources, EventBridge relies on resource-based policies
因此,如果资源策略是问题(未确认),是否有任何关于资源策略的配置,我可以在serverless.yml
文件中为允许事件桥服务添加层到部署的目标 lambda 函数的特定功能设置。
解决方案
对于动态生成,您可以使用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 添加为目标。它将处理必要的权限以及任何需要的权限。
推荐阅读
- javascript - 将 JSX 文件导入 webpack 配置
- vue.js - 如何在不同页面之间使用 Vue js 在导航链接上添加平滑滚动?
- python - 如何在pytest中使用monkeypatch多次模拟一个函数
- html - 基于父类中的数字样式 N 元素
- r - 验证消息未在屏幕上的任何位置向用户显示
- javascript - 如何在 Shopify 上添加 wow.js/animate.css?
- terraform - Terraform:使用带有 for_each 和映射 security_group_rule 的 Terraform 创建多个实例
- python - BeautifulSoup - 在多个页面上抓取 html 表
- c# - 在类中注入作为静态变量的依赖项
- sql - SQL问题——如何创建日期+小时维度表?