我已经使用基于web的编辑器创建了几个Lambda函数。到目前为止一切顺利。现在我想开始用模块扩展这些模块(比如Q表示承诺)。我不知道如何将模块转换为Lambda,以便它们可以被我的函数使用。
我已经读完了这篇文章,但它似乎涉及到设置一个EC2并从那里运行Lambda函数。在创建函数时,有一种机制可以上传压缩文件,但这似乎涉及到发送本地开发的函数。因为我在基于网络的编辑器中工作,这似乎是一个奇怪的工作流程。
我如何简单地部署一些模块在我的Lambda函数中使用?
我已经使用基于web的编辑器创建了几个Lambda函数。到目前为止一切顺利。现在我想开始用模块扩展这些模块(比如Q表示承诺)。我不知道如何将模块转换为Lambda,以便它们可以被我的函数使用。
我已经读完了这篇文章,但它似乎涉及到设置一个EC2并从那里运行Lambda函数。在创建函数时,有一种机制可以上传压缩文件,但这似乎涉及到发送本地开发的函数。因为我在基于网络的编辑器中工作,这似乎是一个奇怪的工作流程。
我如何简单地部署一些模块在我的Lambda函数中使用?
当前回答
这是一个古老的问题,但它帮助我找到了一个非常简单的方法,将新的Lambda依赖项添加到Alexa技能中。
就像JohnAllen的回答一样,你需要在你的本地机器上创建一个文件夹,给它起任何你想要的名字(这是任意的):
mkdir lambdaFunc
cd lambdaFunc
进入文件夹后,使用npm安装必要的包。对我来说,我需要解析ISO8601持续时间(我的命令是npm install ISO8601 -duration):
npm install <your-package-here>
安装完成后,从该目录中退出,并压缩它。在Alexa技能开发控制台打开你的Alexa技能,然后选择“Import Code”选项。从这里,你将上传你的.zip文件,并选择所有的代码:
就是这样!然后你可以导入代码,就像我做的那样:
const DateConverter = require('iso8601-duration');
其他回答
你不能在不上传.zip文件的情况下加载NPM模块,但实际上你可以将这个过程简化为两个快速命令行。
方法如下:
Put your Lambda function file(s) in a separate directory. This is because you install npm packages locally for Lambda and you want to be able to isolate and test what you will upload to Lambda. Install your NPM packages locally with npm install packageName while you're in your separate Lambda directory you created in step #1. Make sure your function works when running locally: node lambdaFunc.js (you can simply comment out the two export.handler lines in your code to adapt your code to run with Node locally). Go to the Lambda's directory and compress the contents, make sure not to include the directory itself. zip -r lambdaFunc.zip . If you have the aws-cli installed, which I suggest having if you want to make your life easier, you can now enter this command: aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip (no quotes around the lambdaFunc part above in case you wonder as I did) Now you can click test in the Lambda console. I suggest adding a short alias for both of the above commands. Here's what I have in mine for the much longer Lambda update command: alias up="aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip"
现在您可以使用Lambda Layers来处理这些问题。只需添加一个包含您需要的包的层,它就会完美地运行。
关注这篇文章: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
现在在许多ide中,例如:VSC,你可以为AWS安装一个扩展,只需从那里点击上传,而不需要输入所有这些命令+区域。
这里有一个例子:
在摆弄了几个小时的包之后,我发现它似乎对在浏览器中运行做了一些假设(即使我告诉它使用engine: node)。
而不是:
esbuild
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文件夹。
要在CI中构建一个包,只需: NPM ci && NPM运行构建&& NPM运行导出
build/main.js.zip文件将包含您需要的所有内容!
npm模块必须捆绑在你的nodejs包中,并以zip的形式上传到AWS Lambda Layers,然后你需要如下所示引用你的模块/js,并使用其中的可用方法。 const mymodule = require('/opt/nodejs/MyLogger');