我使用在运行Nodejs 6.10.1的 AWS EC2 实例上创建的sharp-0.17.3-aws-linux-x64-node-6.10.1.tar.gz压缩包使其工作。tarball 包含具有特定于Lambda 执行环境的系统二进制文件(libvips 库)的目录。node_modules/
sharp
项目结构
为了避免我的本地(Mac 上的 Nodejs node_modules/
7.5)和tarball(Linux 上的 Nodejs 6.10)之间的冲突,我在子目录下创建了我的 Lambda 服务。
项目结构如下:node_modules/
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/
包含 ES6 兼容的源代码和Lambda 函数处理程序——它是从src/
目录中转译的。
如果我需要其他依赖项进行生产(除了sharp
),我将它们安装到services/package.json
using--prefix
选项。但不是aws-lambda
,也不是aws-sdk
——它们全局安装在 Lambda 中,这意味着不需要将它们包含在可部署.zip
文件中。
npm i -S lodash --prefix services/
它确保安装lodash
与 Lambda 环境兼容的版本,因为service/package.json
定义了要依赖的 Nodejs 版本:
{
"private": true,
"engines": { "node" : "6.10.1" },
"dependencies": {
...
}
}
但是,有一个细微差别——其他生产依赖项不必依赖于环境。如果是这样,它们将不起作用,因为您从本地机器安装它们,这不等于 Lambda 的机器。
Lambda 函数部署
由于 Lambda 需要.zip
存档,因此我压缩了service/
目录的内容。而且我的 Lambda 函数有效。一切都是 ES6 兼容的,sharp
有 Lambda 环境二进制文件,我的其他生产依赖版本与 Nodejs 6.10.1 相关。
此外,我建议使用无服务器⚡️(我也使用它)。它极大地简化了 Lambda 函数的开发和部署。