AWS Lambda因NodeJS依赖性而失败

时间:2018-01-12 01:44:46

标签: node.js lambda aws-lambda web-worker serverless-framework

我在执行带有依赖项的NodeJS Lambda函数时收到以下错误。在MacOSX High Sierra v10.13.3 Beta上运行带有NPM v5.6.0的NodeJS v8.4.0。

"errorMessage": "/var/task/node_modules/webworker-threads/build/Release/WebWorkerThreads.node: invalid ELF header",
"errorType": "Error",
"stackTrace": [
    "Object.Module._extensions..node (module.js:597:18)",
    "Module.load (module.js:487:32)",
    "tryModuleLoad (module.js:446:12)",
    "Function.Module._load (module.js:438:3)",
    "Module.require (module.js:497:17)",
    "require (internal/module.js:20:19)",
    "bindings (/var/task/node_modules/bindings/bindings.js:81:44)",
    "Object.<anonymous> (/var/task/node_modules/webworker-threads/index.js:1:105)",
    "Module._compile (module.js:570:32)"
]

我已将其缩小到&#34; natural&#34;需要WebWorkerThreads模块触发错误的模块。以下是我的依赖项。

"dependencies": {
    "natural": "^0.5.6",
    "path": "^0.12.7"
}

我已经在AWS Forums上提出了这个问题而没有回答,并且非常感谢堆栈溢出社区可以给予的任何帮助。我已经完成了所有的谷歌搜索,并找到了以下答案。我虽然没有使用自定义模块或Docker。

1 个答案:

答案 0 :(得分:4)

某些npm模块使用在执行npm install时正在编译的本机二进制文件。这些已编译的二进制文件仅在编译它们的OS /平台上运行。

由于上述原因,您在MacOS上编译的那些本机依赖项将会在AWS Lambda上传之后 NOT 工作,因为Lambda在Linux上运行。

要解决您的问题,您需要在Linux计算机上创建Lambda部署包(包括npm install)。您有几种方法可以做到这一点:

  1. 使用Linux虚拟机(例如Virtualbox或Parallels)并从该虚拟机内部执行npm install

  2. 使用vagrant。与数字1相同。

  3. 使用docker。仍然非常类似于1号和2号。

  4. 或者,简单地使用纯JS依赖项,您首先不会遇到上述问题。许多原生的npm模块现在都有纯JS替代品。