我试图在aws lambda
函数中使用node-phash
,但是很快就会出现。如何在AWS Lambda中使用rpath构建节点本机模块?
我发现了node-canvas
库here和github上的指令,但仍有一些麻烦。
步骤我已经采取了:
-
在Amazon Linux的EC2实例
- ,我已经克隆了
node-phash
回购 我设置的环境变量来使用
rpath
,作为node-canvas
演练指示:export LDFLAGS=-Wl,-rpath=/var/task/
予确定的共享DEPS:
$ 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]
我再复制和下载列出的文件在我
zip
包括用于lambda
- 我跑
npm install
,其中又以表面上细小 我证实
.node
会看着aws lambda
根其代表:$ objdump -p build/Release/pHashBinding.node | grep RPATH RPATH /var/task/
然后我下载了
build/Release
文件夹,并重写了我的项目的node_modules/phash/build/Release
从亚马逊的Linux环境- 我拉上我的项目上传到
Lambda
,其中包括来自步骤3中的zip的根目录下的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
来引用正确的目录呢?
在这里运行 - 如果有人发现自己处于类似的困境中,我最终只是为了这个功能而使用了[python image hashing library](https://github.com/JohannesBuchner/imagehash)。我并不擅长Python,但是我能够在短时间内获得一个功能性的微服务设置(并且大多数Python本地依赖项都可以广泛使用,就像在aws linux上预建的那样) – Brandon