39

我刚刚向 AWS Lambda 上传了一个 zip,其中包括验证 iOS Game Center 身份验证令牌所需的“ref”( https://www.npmjs.com/package/ref )(如何验证 Game Center 用户来自第 3 方 node.js 服务器)。

不幸的是,调用它会导致“无效的 ELF 标头”错误,

{
  "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)"
  ]
}

这是在运行 Yosemite 的 64 位 Macbook Pro 上开发的,在本地运行代码没有问题。谷歌搜索“无效的 ELF 标头”几乎没有产生什么相关结果,我真的不确定从这里去哪里。我会更好地在 node.js 区域中询问这个问题,还是这是相关区域,因为这可能是平台的问题?

4

5 回答 5

62

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

根据此页面,可能必须针对 EC2 上的 Amazon Linux 映像编译插件,以便编译的插件可以在其 Lambda 服务上使用。

于 2015-05-01T20:43:20.100 回答
6

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

.ebignore

node_modules/
于 2019-08-14T19:40:24.630 回答
1

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

import $ from "cheerio";

不是

const $ = require("cheerio");
于 2021-08-28T11:53:03.273 回答
0

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

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

然后通过 SSH 连接到运行 Amazon Linux 2 的 EC2 实例。

  • 安装npm并运行nvm_docker
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。

于 2021-07-02T09:57:33.210 回答
0

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

无服务器.ts /.yml

块引用

  package: {
    individually: true   
},
于 2021-09-15T03:57:43.367 回答