如何在AWS Lambda中使用rpath构build节点本机模块?
我试图在aws lambda
函数中使用node-phash
,但是很快就会出现。
我已经在这里和在github上find了关于node-canvas
库的指令,但仍然有一些麻烦。
我已经采取的步骤:
- 在Amazon Linux ec2实例上,我克隆了
node-phash
回购 -
我设置了一个env var来使用一个
rpath
,如node-canvas
演练所示:export LDFLAGS=-Wl,-rpath=/var/task/
-
我确定了共同的代表:
$ 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]
-
然后,我复制并下载列出的文件,以包含在我的
lambda
zip
文件中 - 我跑
npm install
,表面上看起来很好 -
我确认了
.node
将会看到aws lambda
根的代表:$ objdump -p build/Release/pHashBinding.node | grep RPATH RPATH /var/task/
-
然后,我下载了
build/Release
文件夹,并使用Amazon Linux环境中的文件夹覆盖了项目的node_modules/phash/build/Release
- 我将我的项目上传到
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时安装软件包。
- 删除项目中的
node_modules
文件夹。 - 打开terminal,并进入你的项目文件夹。
- 运行这个命令
docker run --rm -it -v "$PWD":/worker -w /worker node:4.2 npm i --production --silent
之后,您应该在项目中看到一个node_modules
文件夹,现在可以将其压缩并上载到AWS Lambda。
这应该适用于运行npm install
时需要本地代码的任何依赖项。
希望这可以帮助!
- 如何将缓冲区保存到S3 Bucket中
- 使用Node Lambda通过JDBC连接到AWS Athena时出错
- 将SQL SERVER(RDS)事务实时stream式传输到NoSQL
- 在亚马逊lambda,并行调整多个缩略图大小asynchronous抛出错误:stream产生空的缓冲区
- 我想在S3中存储用户的个人资料图像,并将其显示在客户端 – 将S3对象展示给移动客户端的最佳做法是什么?
- 从Amazon S3存储中删除图像
- npm使用AWS Lambda进行安装
- 有什么方法可以使用适用于Node.js的AWS开发工具包来检查S3存储桶中是否存在path?
- Nodejs – 使用MochatestingAWS