首页 > 解决方案 > 使用 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 函数的特定功能设置。

标签: node.jsamazon-web-servicesaws-lambdaserverless-frameworkserverless

解决方案


对于动态生成,您可以使用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 添加为目标。它将处理必要的权限以及任何需要的权限。

设置事件模式匹配

EventBridge 用例和示例

日程


推荐阅读