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

时间:2015-12-23 14:33:09

标签: amazon-web-services npm aws-lambda

我使用基于Web的编辑器创建了几个Lambda函数。到现在为止还挺好。我现在想开始扩展模块(例如Q for promises)。我无法弄清楚如何将模块输出到Lambda以便它们可以被我的函数使用。

我已阅读this但似乎涉及设置EC2并从那里运行Lambda函数。在创建函数时有一种上传zip的机制,但这似乎涉及发送本地开发的函数。因为我在基于Web的编辑器中工作,这似乎是一个奇怪的工作流程。

如何简单地部署一些模块以用于我的Lambda函数?

8 个答案:

答案 0 :(得分:140)

我非常确定您无法在不上传.zip文件的情况下加载NPM模块。

但实际上你可以将这个过程分为两个快速命令行。

以下是:

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

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

  3. 确保您的功能在本地运行时有效:node lambdaFunc.js(您可以在代码中注释掉两条export.handler行,以使您的代码适应本地Node运行。

  4. 好的,你的Lambda包有效。使用zip -r lambdaFunc.zip . 等命令将其压缩,而您的Lambda包的目录中。确保不要压缩目录本身,而是压缩目录的内容

  5. 如果您安装了aws-cli,我建议您如果想让生活更轻松,现在可以输入以下命令:

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

    (如果你不知道我做了什么的话,上面的lambdaFunc部分没有引号)

  6. 现在您可以在Lambda控制台中点击 test

  7. 我建议为上述两个命令添加一个简短的别名。以下是我用于更长时间Lambda更新命令的内容:

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

答案 1 :(得分:11)

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

我的流程:

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

2)每个单独的lambda目录都包含一个包含功能代码的 index.js 文件,一个定义依赖项的 package.json 文件以及一个 / node_modules < / strong>子目录。 (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)我安装模块,在本地开发和测试

5)我.zip lambda目录并通过控制台上传。

重要提示::请勿使用Finder中Mac的'compress'实用工具压缩文件!您必须从目录根目录下的CLI运行zip压缩程序,请参见here

zip -r ../yourfilename.zip * 

另请参阅AWS Lambda Deployment Package in Node.js - AWS Lambda


注意:

您可能会遇到一个问题,其中像PhantomJS这样的模块会构建特定于操作系统的二进制文件,因此在OSX上本地构建的节点包最终在Lambda中失败。

我发现here的答案是使用these scripts在Docker容器中构建它。

答案 2 :(得分:4)

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

  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/

答案 3 :(得分:2)

现在在许多 IDE 中,例如:VSC,您可以安装 AWS 扩展,然后从那里单击上传,无需输入所有这些命令 + 区域。

这是一个例子:

enter image description here

答案 4 :(得分:1)

您现在可以使用Lambda图层来解决此问题。只需添加一个包含所需软件包的层,即可正常运行。

关注此帖子: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这是一个古老的问题,但它帮助我找到了一种将新的 Lambda 依赖项添加到 Alexa 技能的非常简单的方法。

就像 JohnAllen 的回答一样,您需要在本地机器上创建一个文件夹,随意命名(随意):

mkdir lambdaFunc
cd lambdaFunc

进入您的文件夹后,使用 npm 安装必要的软件包。对我来说,我需要解析 ISO8601 持续时间(我的命令是 npm install iso8601-duration):

npm install <your-package-here>

安装后,退出该目录,并压缩它。在 Alexa Skill 开发人员控制台中打开您的 Alexa Skill,然后选择“导入代码”选项。从这里,您将上传您的 .zip 文件,并选择所有代码:

Import Lambda Code in Alexa Skill Developer Console

Select all code in .zip file

就是这样!然后你可以像我一样导入代码:

const DateConverter = require('iso8601-duration');

答案 7 :(得分:0)

在摆弄了几个小时后,我发现它似乎对在浏览器中运行做出了一些假设(即使我告诉它使用 engine: node)。

esbuild 更容易,也更快!

只需运行 npm add --save-dev esbuild,并将这些脚本添加到您的 package.json

{
  ...
  "scripts": {
    "build": "esbuild --bundle --minify --platform=node --target=node12 --outdir=build main.js",
    "export": "cd build && zip main.js.zip main.js"
  },
  ...
  "devDependencies": {
    "esbuild": "^0.11.19",
    ...
  }
}

这使我能够使用 aws-sdk,同时仍然进行摇树和缩小,同时仍然能够安装其他依赖项,例如 jest 和 eslint,而无需打包整个 node_modules 文件夹。< /p>

要在 CI 中构建包,只需: npm ci && npm run build && npm run export

文件 build/main.js.zip 将包含您需要的一切!