我已经使用基于web的编辑器创建了几个Lambda函数。到目前为止一切顺利。现在我想开始用模块扩展这些模块(比如Q表示承诺)。我不知道如何将模块转换为Lambda,以便它们可以被我的函数使用。

我已经读完了这篇文章,但它似乎涉及到设置一个EC2并从那里运行Lambda函数。在创建函数时,有一种机制可以上传压缩文件,但这似乎涉及到发送本地开发的函数。因为我在基于网络的编辑器中工作,这似乎是一个奇怪的工作流程。

我如何简单地部署一些模块在我的Lambda函数中使用?


当前回答

npm模块必须捆绑在你的nodejs包中,并以zip的形式上传到AWS Lambda Layers,然后你需要如下所示引用你的模块/js,并使用其中的可用方法。 const mymodule = require('/opt/nodejs/MyLogger');

其他回答

希望这对你有所帮助,使用无服务器框架你可以做这样的事情:

在无服务器中添加这些东西。yml文件:

    plugins:
      - serverless-webpack
    custom:
      webpackIncludeModules:
        forceInclude:
          - <your package name> (for example: node-fetch)

然后创建你的Lambda函数,通过无服务器部署来部署它,即无服务器中包含的包。Yml会在你身边。

有关无服务器的更多信息:https://serverless.com/framework/docs/providers/aws/guide/quick-start/

为了在Lambda中包含npm模块,需要一个.zip文件。你真的不应该在很多事情上使用Lambda web编辑器——就像任何生产代码一样,你应该在本地开发,提交到git等等。

我的流量:

1)我的Lambda函数通常是大型项目的辅助工具,所以我在其中创建了一个/aws/lambdas目录来容纳它们。

2)每个单独的lambda目录包含一个index.js文件,其中包含函数代码,一个包。Json文件定义依赖项,以及/node_modules子目录。(包。json文件不会被Lambda使用,这只是为了让我们可以在本地运行npm install命令。)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3)我.gitignore所有node_modules目录和.zip文件,这样从npm安装和压缩生成的文件就不会混乱我们的repo。

. gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4)我在目录中运行npm install来安装模块,并在本地开发/测试功能。

5)我压缩lambda目录,并通过控制台上传它。

(重要:不要使用Mac的“压缩”工具从Finder压缩文件!你必须从命令行中运行zip从根目录-见这里)

zip -r ../yourfilename.zip * 

注意:

如果在Mac上本地安装节点模块,可能会遇到问题,因为一些特定于平台的模块在部署到Lambda基于linux的环境时可能会失败。(参见https://stackoverflow.com/a/29994851/165673)

解决方案是在从AMI启动的EC2实例上编译模块,该AMI与您正在使用的Lambda Node.js运行时相对应(请参阅Lambda运行时列表及其各自的AMI)。


请参见Node.js - AWS Lambda中的AWS Lambda部署包

如果需要管理多个AWS资源,使用AWS CDK部署lambda函数可能是一个不错的选择。这是一个部署AWS资源并使用CloudFormation的IaC工具。要设置CDK,请参见开始。

一旦您设置了CDK,您就可以创建一个Function构造,并使用它的lambda.Code.fromAsset来轻松地捆绑源代码,包括node_modules,并将其用作函数的代码。

import * as lambda from "aws-cdk-lib/aws-lambda";
import * as path from "path";

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {

    const lambdaFunc = new lambda.Function(this, "lambdaFunc", {
      code: lambda.Code.fromAsset(path.join(__dirname, "..", "..", "project-containing-node-modules")),
      ...
    });

  }
}

然后使用cdk deploy将其部署到您的AWS帐户。

如果您在多个Lambdas中使用相同的node_modules,并且不想上传重复的依赖项,CDK也支持Lambda层。

npm模块必须捆绑在你的nodejs包中,并以zip的形式上传到AWS Lambda Layers,然后你需要如下所示引用你的模块/js,并使用其中的可用方法。 const mymodule = require('/opt/nodejs/MyLogger');

现在您可以使用Lambda Layers来处理这些问题。只需添加一个包含您需要的包的层,它就会完美地运行。

关注这篇文章: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e