使用 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 结合使用 - 错误消息

春季启动的aws-java sdk依赖问题

多个 cloudwatch 事件规则可以触发 aws 目标吗

将入站规则添加到安全组 aws cdk

如何使用 AWS Python SDK Boto 3 等待 Elastic Beanstalk 事件

如何使用 AWS JavaScript SDK (dynamoDB) 处理 UnprocessedItems?