node.js - 如何使用适用于 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”?
编辑:问题的重点是动态创建代码,而不需要先压缩它。
解决方案
我认为 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运行
推荐阅读
- networking - 如何将外部 IP 转发到本地托管的 websocket 服务器?
- google-colaboratory - 已加载运行时 CuDNN 库:8.0.5,但源代码编译为:8.1.0 Tensorflow2 对象检测
- adobe-analytics - Adobe Analytics 中的“保留变量”是什么?
- git - 我可以将一个本地 git 存储库与两个远程存储库一起使用吗?
- python - 总结列表中接近特定数字的数字
- python-3.x - 如何仅在用户打印/关闭窗口后关闭打印窗口|| 如何使用 QPrintPreviewDialog 预览图像
- python - 需要用 Python 实现的树形数据结构
- android - 几分钟后 Chrome 远程 DevTools 连接断开
- javascript - 表 tr 中有多个侦听器,提到的描述有 html 注释
- flutter - 检查互联网连接不删除弹出颤振