如何在AWS Lambda中使用rpath构build节点本机模块?

我试图在aws lambda函数中使用node-phash ,但是很快就会出现。

我已经在这里和在github上find了关于node-canvas库的指令,但仍然有一些麻烦。

我已经采取的步骤:

  1. 在Amazon Linux ec2实例上,我克隆了node-phash回购
  2. 我设置了一个env var来使用一个rpath ,如node-canvas演练所示:

    export LDFLAGS=-Wl,-rpath=/var/task/

  3. 我确定了共同的代表:

     $ readelf -d pHashBinding.node | grep NEEDED 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 
  4. 然后,我复制并下载列出的文件,以包含在我的lambda zip文件中

  5. 我跑npm install ,表面上看起来很好
  6. 我确认了.node将会看到aws lambda根的代表:

      $ objdump -p build/Release/pHashBinding.node | grep RPATH RPATH /var/task/ 
  7. 然后,我下载了build/Release文件夹,并使用Amazon Linux环境中的文件夹覆盖了项目的node_modules/phash/build/Release

  8. 我将我的项目上传到Lambda ,包括步骤3中的5 *.o文件到压缩文件的根目录,所以它们将在/var/task/中解压缩到Lambda

不幸的是,毕竟,我还是得到了我之前做过的同样的错误:

 "errorMessage": "/usr/local/lib64/node-v4.3.x/lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /var/task/node_modules/node-phash/build/Release/pHashBinding.node)", "errorType": "Error", "stackTrace": [ "Object.Module._extensions..node (module.js:434:18)", "Module.load (module.js:343:32)", "Function.Module._load (module.js:300:12)", "Module.require (module.js:353:17)", "require (internal/module.js:12:17)", "Object.<anonymous> (/var/task/node_modules/node-phash/lib/phash.js:23:13)", "Module._compile (module.js:409:26)", "Object.Module._extensions..js (module.js:416:10)", "Module.load (module.js:343:32)" ] } 

libstdc++.so.6位于我的zip的根目录下。 那么,如何在寻找依赖关系的时候让pHashBinding.node引用正确的目录呢?

我知道这是一个较老的问题,但是我正在努力解决这个问题,并设法find一个可能适合你的解决scheme。

这个解决scheme来自于这里的GitHub讨论https://github.com/grpc/grpc/issues/6443#issuecomment-270558452

基本上,您应该使用Docker在准备部署到AWS Lambda时安装软件包。

  1. 删除项目中的node_modules文件夹。
  2. 打开terminal,并进入你的项目文件夹。
  3. 运行这个命令docker run --rm -it -v "$PWD":/worker -w /worker node:4.2 npm i --production --silent

之后,您应该在项目中看到一个node_modules文件夹,现在可以将其压缩并上载到AWS Lambda。

这应该适用于运行npm install时需要本地代码的任何依赖项。

希望这可以帮助!