如何在AWS Lambda中加载npm模块?


147

我已经使用基于Web的编辑器创建了多个Lambda函数。到目前为止,一切都很好。我现在想开始使用模块(例如Q for promises)来扩展它们。我不知道如何将模块发布到Lambda,以便我的函数可以使用它们。

我已经读完了它,但似乎涉及设置EC2并从那里运行Lambda函数。创建函数时,有一种上载zip的机制,但这似乎涉及发送本地开发的函数。由于我正在使用基于Web的编辑器,因此这似乎是一个奇怪的工作流程。

如何简单地部署一些模块以供Lambda函数使用?


7
在此处的文档中对此进行了全部解释-docs.aws.amazon.com/lambda/latest/dg/…–
arcseldon

Answers:


196

您不能在不上传.zip文件的情况下加载NPM模块,但实际上可以将此过程简化为两个快速命令行。

这是如何做:

  1. 将Lambda函数文件放在单独的目录中。这是因为您npm在本地为Lambda 安装了软件包,并且希望能够隔离并测试要上传到Lambda的内容。

  2. npm install packageName当您在步骤1中创建的单独Lambda目录中时,可以在本地安装NPM软件包。

  3. 确保您的函数在本地运行时起作用:(node lambdaFunc.js您可以简单地注释掉export.handler代码中的两行,以使代码适合在本地运行Node)。

  4. 转到Lambda的目录并压缩内容,确保包括目录本身。

    zip -r lambdaFunc.zip .
    
  5. 如果您已经aws-cli安装了该软件(如果您想使自己的生活更轻松,建议您安装该软件),现在可以输入以下命令:

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (上面的lambdaFunc部分周围没有引号,以防您想像我一样)

  6. 现在,您可以在Lambda控制台中单击“ 测试 ”。

  7. 我建议为上述两个命令添加一个简短的别名。这是我的Lambda update命令更长的内容:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    

10
您可能需要明确声明要定位的区域: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
尽管要做的工作似乎还很多,但是通过构建这些lambda表达式确实是更好的方法……非常感谢!
Mike Perrenoud

9
在使用这些步骤时,我不得不使用--zip-file fileb://vs--zip-file file://
McLovin

2
确保压缩目录的内容,并且从CLI进行压缩(使用Mac's finder中的'compress'命令将不起作用)。
Yarin

2
这是超级有用的..至少有两件事使我无法使用此功能... 1)--zip-file fileb:代替file了我。2)在MacOS上似乎带有3个斜线,例如fileb:///Users/wio/Documents
Tobi

30

.zip为了在Lambda中包含npm模块,需要一个文件。而且您实际上不应该将Lambda Web编辑器用于任何事情-像任何生产代码一样,您应该在本地进行开发,提交git等。

我的流程:

1)我的Lambda函数通常是较大项目的帮助程序实用程序,因此我在其中创建了一个/ aws / lambdas目录来容纳它们。

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

package.json:

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

3)我.gitignore所有node_modules目录和.zip文件,以便从npm安装和压缩生成的文件不会使我们的仓库混乱。

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

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

5)我压缩了lambda目录并通过控制台将其上传。

重要:请勿使用Finder中Mac的'compress'实用程序来压缩文件!您必须从目录根目录中的CLI运行zip -参见此处

zip -r ../yourfilename.zip * 

注意:

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

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


另请参阅Node.js中的AWS Lambda部署软件包-AWS Lambda



9

希望这对您有所帮助,借助无服务器框架,您可以执行以下操作:

  1. 将这些内容添加到您的serverless.yml文件中:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2.然后创建您的Lambda函数,通过进行部署serverless deploy,serverless.yml中包含的软件包将为您提供。

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


您需要首先安装它serverless plugin install --name pluginName
Liad Livnat

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.