"invalid ELF header" 在 AWS Lambda 上使用 nodejs "ref" 模块时

"invalid ELF header" when using the nodejs "ref" module on AWS Lambda

我刚刚向 AWS Lambda 上传了一个 zip,其中包含 "ref" (https://www.npmjs.com/package/ref), which is needed to validate an iOS Game Center authentication token (How to authenticate Game Center User from 3rd party node.js server)。

不幸的是,调用它会导致 "invalid ELF header" 错误,

{
  "errorMessage": "/var/task/node_modules/ref/build/Release/binding.node: invalid ELF header",
  "errorType": "Error",
  "stackTrace": [
    "Module.load (module.js:356:32)",
    "Function.Module._load (module.js:312:12)",
    "Module.require (module.js:364:17)",
    "require (module.js:380:17)",
    "bindings (/var/task/node_modules/ref/node_modules/bindings/bindings.js:76:44)",
    "Object.<anonymous> (/var/task/node_modules/ref/lib/ref.js:5:47)",
    "Module._compile (module.js:456:26)",
    "Object.Module._extensions..js (module.js:474:10)",
    "Module.load (module.js:356:32)",
    "Function.Module._load (module.js:312:12)"
  ]
}

这是在 64 位 Macbook Pro 运行 Yosemite 上开发的,本地代码 运行 没有问题。谷歌搜索 "invalid ELF header" 几乎没有找到相关结果,我真的不确定从这里该往哪里走。我最好在 node.js 区域询问这个问题,还是这是相关区域,因为这可能是平台的问题?

当您在一种架构上构建,然后尝试在不同的架构(或某些情况下的平台)上使用相同的内置插件时,就会发生这种情况。

根据 this page,可能必须针对 EC2 上的 Amazon Linux 映像编译插件,以便编译后的插件可用于其 Lambda 服务。

这并不完全适用于您的问题,但万一有人在使用 AWS Elastic Beanstalk 时偶然发现这个问题,可能是因为上传了 node_modules/ 目录以及其他所有内容,所以您需要强制它忽略该文件。

.ebignore

node_modules/

这是我在 Reddit 上找到的问题的答案:

[由 JeffGebhart 解决] https://hub.docker.com/r/lambci/lambda/

然后通过 SSH 进入 EC2 实例 运行ning Amazon Linux 2.

  • 使用 nvmdocker 以及 运行
  • 安装 npm
docker pull lambci/lambda
  • 运行
mkdir LambdaFunction
  • 运行
npm init

并初始化所有内容。

  • 然后你需要在那个文件夹中 运行
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs12.x 
npm install <packages you need> 

并且它将在 node_modules 中构建证明者原生模块。现在您可以将所有文件提取到您的 PC 或 AWS。

对于那些在 Lambda 上将 JS 移植到 TypeScript 的开发人员,确保导入所有依赖项,而不是必需的:

import $ from "cheerio";

没有

const $ = require("cheerio");

同样,对于任何在这个问题上快要流泪的人,请尝试单独打包您的函数:

serverless.ts /.yml

块引用

  package: {
    individually: true   
},