Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用AWS SDK for JavaScript动态创建内联Lambda?_Node.js_Amazon Web Services_Aws Lambda_Aws Sdk - Fatal编程技术网

Node.js 如何使用AWS SDK for JavaScript动态创建内联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

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

这在云层形成中是可能的:

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部署包限制(编写时的值):

  • 如果您直接以blob的形式上载zip文件,它需要小于50MB
  • 如果大于50MB,则需要先上传到s3,并指定位置
  • 整体解压大小仍然需要小于250 MB

  • 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"); }')
    });