我正在尝试在AWS Lambda中使用Sharp库,但它需要为lambda环境编译模块。说明说创建一个ec2实例并在那里编译它 - 但我注意到有一些工具可以帮助它,但它们都至少有一年没有维护。是否有无服务器附带的软件包,或者现在被认为是标准方式的软件包?
我发现了这些,但是自提交以来它们都至少已有一年了
https://github.com/node-hocus-pocus/thaumaturgy
https://github.com/Max-Kolodezniy/aws-lambda-build
https://github.com/tomdale/lambda-packager
也许有一个目录我可以为AWS lambda下载预编译的Sharp库?
答案 0 :(得分:3)
我使用sharp-0.17.3-aws-linux-x64-node-6.10.1.tar.gz tarball工作,这是在运行 Nodejs 6.10.1 的AWS EC2实例上创建的。 tarball包含node_modules/
目录,其中sharp
系统二进制文件(libvips库)特定于Lambda execution environment。
为了避免我的本地node_modules/
(Mac上的Nodejs 7.5)和tarball(Linux上的Nodejs 6.10)中的node_modules/
之间发生冲突,我正在子目录下创建我的Lambda服务。
项目结构如下:
node_modules/
service/
node_modules/ <= sharp-0.17.3-aws-linux-x64-node-6.10.1.tar.gz
utils/
handler.js
package.json <= engines: node 6.10.1
serverless.yml
src/
jasmine.json
package.json
我需要的大部分依赖项都用于开发和测试目的。它们保存在根package.json
文件中(也包括sharp
,但是为我的Nodejs 7.5环境编译,提供在本地测试图像操作)。
我的service/handler.js
和service/utils/
包含与Lambda function handler兼容的ES6源代码 - 它来自src/
目录。
如果我需要其他生产依赖项(sharp
除外),我会使用services/package.json
选项将它们安装到--prefix
。但不是aws-lambda
,也不是aws-sdk
- 它们全局安装在Lambda中,这意味着无需将它们包含在可部署的.zip
文件中。
npm i -S lodash --prefix services/
它确保安装与Lambda环境兼容的lodash
版本,因为service/package.json
定义了依赖的Nodejs版本:
{
"private": true,
"engines": { "node" : "6.10.1" },
"dependencies": {
...
}
}
但是,有一个细微差别 - 其他生产依赖关系不必依赖于环境。如果是这样,它们将无法工作,因为您从本地计算机安装它们,这不等于Lambda的计算机。
由于Lambda需要.zip
存档,我压缩了我的service/
目录的内容。我的Lambda功能有效。一切都与ES6兼容,sharp
具有Lambda环境二进制文件,而我的其他生产依赖版本与Nodejs 6.10.1相关。
此外,我建议使用Serverless ⚡️(我也使用它)。它大大简化了Lambda函数的开发和部署。
答案 1 :(得分:1)
Nik的答案肯定帮助我找到了有效的解决方案!我要补充的一件事是无服务器清晰图像背后的人更新了他们的软件包,因此tarball现在可以与节点v6.10一起工作,所以我没有看到引用两个不同节点环境的理由。我在v6.10中做了所有事情。
https://github.com/adieuadieu/serverless-sharp-image/tree/master/lib
答案 2 :(得分:0)
存在类似问题,并通过以下方式成功安装了Linux x64平台的二进制文件
npm install --arch=x64 --platform=linux --target=8.10.0 sharp
然后像往常一样上载Lambda,就可以了。 以上在Mac以及Windows上均可使用,有关详细信息,请参见http://sharp.pixelplumbing.com/en/stable/install/#aws-lambda
中的文档