2016-12-05 55 views
2

我试图在aws lambda函数中使用node-phash,但是很快就会出现。如何在AWS Lambda中使用rpath构建节点本机模块?

我发现了node-canvashere和github上的指令,但仍有一些麻烦。

步骤我已经采取了:

    在Amazon Linux的EC2实例
  1. ,我已经克隆了node-phash回购
  2. 我设置的环境变量来使用rpath,作为node-canvas演练指示:

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

  3. 予确定的共享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] 
    
  4. 我再复制和下载列出的文件在我zip包括用于lambda

  5. 我跑npm install,其中又以表面上细小
  6. 我证实.node会看着aws lambda根其代表:

    $ objdump -p build/Release/pHashBinding.node | grep RPATH 
        RPATH    /var/task/ 
    
  7. 然后我下载了build/Release文件夹,并重写了我的项目的node_modules/phash/build/Release从亚马逊的Linux环境

  8. 我拉上我的项目上传到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来引用正确的目录呢?

+0

在这里运行 - 如果有人发现自己处于类似的困境中,我最终只是为了这个功能而使用了[python image hashing library](https://github.com/JohannesBuchner/imagehash)。我并不擅长Python,但是我能够在短时间内获得一个功能性的微服务设置(并且大多数Python本地依赖项都可以广泛使用,就像在aws linux上预建的那样) – Brandon

回答

0

我知道这是一个较老的问题,但我一直在努力,并设法找到一种解决方案,可能也适合你。

该解决方案来自这里https://github.com/grpc/grpc/issues/6443#issuecomment-270558452

一个GitHub的讨论,基本上,你应该使用泊坞窗安装你的包,当你准备部署到AWS LAMBDA。

  1. 删除项目中的node_modules文件夹。
  2. 打开终端和cd到您的项目文件夹中。
  3. 运行此命令docker run --rm -it -v "$PWD":/worker -w /worker node:4.2 npm i --production --silent

之后,你应该看到在你的项目中node_modules文件夹,但是现在可以压缩,并上传到AWS LAMBDA。

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

希望这会有所帮助!

+0

Docker是不需要的(仅用于这个特定的场景),如果你已经在使用Linux。 – dashmug