为 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.jsservice/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/ 文件夹。