我使用基于Web的编辑器创建了几个Lambda函数。到现在为止还挺好。我现在想开始扩展模块(例如Q for promises)。我无法弄清楚如何将模块输出到Lambda以便它们可以被我的函数使用。
我已阅读this但似乎涉及设置EC2并从那里运行Lambda函数。在创建函数时有一种上传zip的机制,但这似乎涉及发送本地开发的函数。因为我在基于Web的编辑器中工作,这似乎是一个奇怪的工作流程。
如何简单地部署一些模块以用于我的Lambda函数?
答案 0 :(得分:140)
我非常确定您无法在不上传.zip
文件的情况下加载NPM模块。
但实际上你可以将这个过程分为两个快速命令行。
以下是:
将Lambda函数文件放在单独的目录中。这是因为您在本地为Lambda安装了npm
个软件包,并希望能够隔离并测试您将上传到Lambda的内容。
当您在步骤1中创建的单独Lambda目录中时,使用npm install packageName
在本地安装NPM软件包。
确保您的功能在本地运行时有效:node lambdaFunc.js
(您可以在代码中注释掉两条export.handler
行,以使您的代码适应本地Node运行。
好的,你的Lambda包有效。使用zip -r lambdaFunc.zip .
等命令将其压缩,而在您的Lambda包的目录中。确保不要压缩目录本身,而是压缩目录的内容 。
如果您安装了aws-cli
,我建议您如果想让生活更轻松,现在可以输入以下命令:
aws lambda update-function-code --function-name lambdaFunc \
--zip-file fileb://~/path/to/your/lambdaFunc.zip
(如果你不知道我做了什么的话,上面的lambdaFunc部分没有引号)
现在您可以在Lambda控制台中点击 test 。
我建议为上述两个命令添加一个简短的别名。以下是我用于更长时间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)
希望这会有所帮助,借助无服务器框架,您可以执行以下操作:
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)
答案 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 文件,并选择所有代码:
就是这样!然后你可以像我一样导入代码:
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
将包含您需要的一切!