AWS Lambda 因 NodeJS 依赖项而失败

0 lambda web-worker node.js aws-lambda serverless-framework

在执行具有依赖项的 NodeJS Lambda 函数时,我收到以下错误。在 MacOSX High Sierra v10.13.3 Beta 上运行 NodeJS v8.4.0 和 NPM v5.6.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)"
]
Run Code Online (Sandbox Code Playgroud)

我把它缩小到“自然”模块,它需要WebWorkerThreads模块触发错误。以下是我的依赖项。

"dependencies": {
    "natural": "^0.5.6",
    "path": "^0.12.7"
}
Run Code Online (Sandbox Code Playgroud)

我在AWS 论坛上提出了这个问题但没有答案,非常感谢堆栈溢出社区可以提供的任何帮助。我已经完成了大量的谷歌搜索,并找到了以下答案。不过,我没有使用自定义模块或 Docker。

das*_*mug 5

某些 npm 模块使用在执行npm install. 这些编译后的二进制文件仅在编译它们的操作系统/平台上运行。

由于上述原因,一旦您将它们上传到 AWS Lambda ,您在 MacOS 上编译的那些本机依赖项将无法工作,因为 Lambda 在 Linux 上运行。

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

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

  2. 使用vagrant. 和1号一样。

  3. 使用docker. 仍然与数字 1 和 2 非常相似。

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