首页 > 解决方案 > 如何使用适用于 JavaScript 的 AWS 开发工具包动态创建内联 Lambda?

问题描述

我需要从另一个 Lambda 以编程方式创建一个简单的 Lambda。

这可以通过 CloudFormation 实现:

MyLambda:
  Type: AWS::Lambda::Function
  Properties:
    FunctionName: my-lambda
    Handler: index.handler
    Runtime: nodejs8.10
    Role: !GetAtt MyRole.Arn
    Code:
      ZipFile: >
        exports.handler = event => console.log('EVENT', event)

我想以编程方式以相同的方式创建一个 Lambda。

当我将 Lambda 代码打包成 zip 文件并使用 Lambda 代码上传 zip 时,一切正常:

const lambda = new Lambda({apiVersion: '2015-03-31'});
...
await lambda.createFunction({
    FunctionName: 'my-lambda',
    Handler: 'index.handler',
    Runtime: 'nodejs8.10',
    Role: role.Role.Arn,
    Code: {
        ZipFile: fs.readFileSync('my-lambda.zip')
    }
}).promise();

但是将 Lambda 代码写入文件并随后压缩它是很多样板代码。

如果我尝试内联设置 Lambda 代码:

...
Code: {
    ZipFile: "exports.handler = event => console.log('EVENT', event)"
}

我得到一个预期的错误:

失败:无法解压缩上传的文件。请检查您的文件,然后尝试重新上传。

有没有办法从另一个 Lambda 动态创建内联 Lambda 函数,类似于顶部提到的 CloudFormation“hack”?

编辑:问题的重点是动态创建代码,而不需要先压缩它。

标签: node.jsamazon-web-servicesaws-lambdaaws-sdk

解决方案


我认为 aws-cdk 是一个不错的选择。它从 javascript 或 typescript 生成 cloudformation,并将编码行数降至最低。

在您的主 lambda 项目中

npm i @aws-cdk/aws-lambda --save-exact

然后,您需要在 /tmp 中创建一个目录并使用node_cmdcdk init从节点 shell运行

然后你会让你的 lambda 导出 cdk Lambda 模板,如下所示到 /tmp/output.js (转换我假设是你想要的内联部分)

import lambda = require('@aws-cdk/aws-lambda');    
const fn = new lambda.Function(this, 'MyFunction', {
    runtime: lambda.Runtime.NodeJS810,
    handler: 'index.handler',
    code: lambda.Code.inline('exports.handler = function(event, ctx, cb) { return cb(null, "hello ttulka"); }')
});

然后,您需要使用node_cmdcdk --app 'node /tmp/output.js' synth从节点 shell运行


推荐阅读