Node.js 如何使用AWS SDK for JavaScript动态创建内联Lambda?
我需要从另一个Lambda以编程方式创建一个简单的Lambda 这在云层形成中是可能的:Node.js 如何使用AWS SDK for JavaScript动态创建内联Lambda?,node.js,amazon-web-services,aws-lambda,aws-sdk,Node.js,Amazon Web Services,Aws Lambda,Aws Sdk,我需要从另一个Lambda以编程方式创建一个简单的Lambda 这在云层形成中是可能的: MyLambda: Type: AWS::Lambda::Function Properties: FunctionName: my-lambda Handler: index.handler Runtime: nodejs8.10 Role: !GetAtt MyRole.Arn Code: ZipFile: > expor
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”
编辑:问题的重点是动态创建代码,而不需要先压缩它。TLDR代码作为部署包上载到Lambda,这是一个压缩文件。因此,您可以动态地编写新的函数代码,但在将其传递给
lambda.createFunction
之前,仍然需要动态地创建一个部署包zip
其他信息:
从Lambda API文档中,Code元素必须是FunctionCode
对象。FunctionCode对象的选项是指定本地部署包zip文件,或指定部署包zip文件在s3上的位置
FunctionCode对象引用:
语法:
"Code": {
"S3Bucket": "string",
"S3Key": "string",
"S3ObjectVersion": "string",
"ZipFile": blob
}
资料来源:
需要记住的一些Lambda部署包限制(编写时的值):
Lambda限制参考:我认为aws cdk是一个不错的选择。它从javascript或typescript生成cloudformation,并将编码行数减至最少 在你的主lambda项目中
npm i @aws-cdk/aws-lambda --save-exact
然后需要在/tmp中创建一个目录,并使用
然后让lambda将cdk lambda模板导出到/tmp/output.js(转换内联部分,我假设这是您想要的)
然后,您需要从节点外壳运行
cdk--app'node/tmp/output.js'synth
,使用您可以通过将zip文件保存到/tmp动态创建一个zip文件,因为您在那里有写权限。@ThalesMinussi非常感谢,我认为它会工作的!但问题的焦点实际上是代码的“内联”创建,这意味着不需要创建zip文件。我对这个问题稍加修改以使它更清楚。我理解。是的,这是一个非常好的问题!让我们看看是否有人回复您:)看看CDK,用例是什么?为什么不简单地使用像Terraform这样的东西呢?让一个Lambda创建另一个Lambda对我来说似乎是一种糟糕的做法……你冒着触发重试的错误风险,最终得到数百个Lambda
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"); }')
});