【发布时间】:2019-03-19 15:22:31
【问题描述】:
我需要从另一个 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”?
编辑:问题的重点是动态创建代码,无需先压缩。
【问题讨论】:
-
您可以通过将其保存到 /tmp 来动态创建一个 zip 文件,因为您在那里确实具有写入权限。
-
@ThalesMinussi 非常感谢,我认为它会起作用!但问题的重点实际上是代码的“内联”创建,它意味着不需要创建一个 zip 文件。我对问题进行了一些编辑以使其清楚。
-
我明白了。是的,这是一个非常好的问题!让我们看看是否有人回复你:)
-
用例是什么?为什么不简单地使用 Terraform 之类的东西呢?让一个 Lambda 创建另一个 Lambda 对我来说似乎是一种不好的做法……您冒着触发重试的错误风险,最终会得到数百个 Lambda
标签: node.js amazon-web-services aws-lambda aws-sdk