为 aws lambda 构建节点模块
Building a node module for aws lambda
我正在尝试在 AWS Lambda 中使用 Sharp 库,但它需要为 lambda 环境编译模块。说明说要创建一个 ec2 实例并在那里编译它 - 但我注意到有一些工具可以帮助解决这个问题,但它们都至少有一年的历史并且没有维护。是否有 Serverless 附带的软件包,或者现在被认为是标准方式的东西?
我找到了这些,但它们都至少有一年的历史了
https://github.com/node-hocus-pocus/thaumaturgy
https://github.com/Max-Kolodezniy/aws-lambda-build
https://github.com/tomdale/lambda-packager
也许有一个目录可以让我下载 AWS lambda 的预编译 Sharp 库?
我使用 sharp-0.17.3-aws-linux-x64-node-6.10.1.tar.gz tarball, that was created on AWS EC2 instance running Nodejs 6.10.1. The tarball contains node_modules/
directory with sharp
system binaries (libvips library) specific to the Lambda execution environment 使其工作。
项目结构
为了避免本地 node_modules/
(Mac 上的 Nodejs 7.5)和 tarball 中的 node_modules/
(Linux 上的 Nodejs 6.10)之间的冲突,我正在子目录下创建我的 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
除外),我会使用 --prefix
选项将它们安装到 services/package.json
。但不是 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 函数部署
由于 Lambda 需要 .zip
存档,我压缩了 service/
目录的内容。我的 Lambda 函数有效。一切都兼容 ES6,sharp
有 Lambda 环境二进制文件,我的其他生产依赖版本与 Nodejs 6.10.1 相关。
此外,我建议使用 Serverless ⚡️(我也使用它)。它极大地简化了 Lambda 函数的开发和部署。
Nik 的回答无疑帮助我找到了可行的解决方案!我要补充的一件事是,serverless-sharp-image 背后的人更新了他们的包,因此 tarball 现在可以与节点 v6.10 一起使用,所以我看不出有理由引用两个不同的节点环境。我在 v6.10 中做所有事情。
https://github.com/adieuadieu/serverless-sharp-image/tree/master/lib
有类似的问题,并设法通过
为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
的文档中
对于现在遇到此问题的任何人 post。我通过将 package.json
文件复制到 AWS Cloud9 IDE 并简单地 运行 npm install
来完成此操作。从那里,只需下载 node_modules/
文件夹。
我正在尝试在 AWS Lambda 中使用 Sharp 库,但它需要为 lambda 环境编译模块。说明说要创建一个 ec2 实例并在那里编译它 - 但我注意到有一些工具可以帮助解决这个问题,但它们都至少有一年的历史并且没有维护。是否有 Serverless 附带的软件包,或者现在被认为是标准方式的东西?
我找到了这些,但它们都至少有一年的历史了
https://github.com/node-hocus-pocus/thaumaturgy
https://github.com/Max-Kolodezniy/aws-lambda-build
https://github.com/tomdale/lambda-packager
也许有一个目录可以让我下载 AWS lambda 的预编译 Sharp 库?
我使用 sharp-0.17.3-aws-linux-x64-node-6.10.1.tar.gz tarball, that was created on AWS EC2 instance running Nodejs 6.10.1. The tarball contains node_modules/
directory with sharp
system binaries (libvips library) specific to the Lambda execution environment 使其工作。
项目结构
为了避免本地 node_modules/
(Mac 上的 Nodejs 7.5)和 tarball 中的 node_modules/
(Linux 上的 Nodejs 6.10)之间的冲突,我正在子目录下创建我的 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
除外),我会使用 --prefix
选项将它们安装到 services/package.json
。但不是 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 函数部署
由于 Lambda 需要 .zip
存档,我压缩了 service/
目录的内容。我的 Lambda 函数有效。一切都兼容 ES6,sharp
有 Lambda 环境二进制文件,我的其他生产依赖版本与 Nodejs 6.10.1 相关。
此外,我建议使用 Serverless ⚡️(我也使用它)。它极大地简化了 Lambda 函数的开发和部署。
Nik 的回答无疑帮助我找到了可行的解决方案!我要补充的一件事是,serverless-sharp-image 背后的人更新了他们的包,因此 tarball 现在可以与节点 v6.10 一起使用,所以我看不出有理由引用两个不同的节点环境。我在 v6.10 中做所有事情。
https://github.com/adieuadieu/serverless-sharp-image/tree/master/lib
有类似的问题,并设法通过
为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
的文档中对于现在遇到此问题的任何人 post。我通过将 package.json
文件复制到 AWS Cloud9 IDE 并简单地 运行 npm install
来完成此操作。从那里,只需下载 node_modules/
文件夹。