在 AWS Lambda 上使用 nodejs“ref”模块时出现“无效的 ELF 标头”

Posted

技术标签:

【中文标题】在 AWS Lambda 上使用 nodejs“ref”模块时出现“无效的 ELF 标头”【英文标题】:"invalid ELF header" when using the nodejs "ref" module on AWS Lambda 【发布时间】:2015-07-11 17:31:44 【问题描述】:

我刚刚向 AWS Lambda 上传了一个 zip,其中包含验证 ios Game Center 身份验证令牌 (How to authenticate Game Center User from 3rd party node.js server) 所需的“ref”(https://www.npmjs.com/package/ref)。

不幸的是,调用它会导致“无效的 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 区域问这个问题,或者这是相关区域,因为这可能是平台的问题?

【问题讨论】:

包含本机代码的节点模块必须构建在(或用于)目标平台上。在目标平台上重建你的节点模块。 【参考方案1】:

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

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

【讨论】:

链接中的重要信息。我只是想补充一点,要旋转的 EC2 实例的名称应该类似于(AMI 名称:amzn-ami-hvm-2016.03.3.x86_64-gp2),基于docs.aws.amazon.com/lambda/latest/dg/…。如果您不知道要创建哪一个。 在使用虚拟机时也经常发生,所以请注意,可靠的答案。【参考方案2】:

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

.ebignore

node_modules/

【讨论】:

我已经为此苦苦挣扎了一段时间,感谢您的回答。我最初的猜测是 EOF 线问题,因为我在 Windows 上进行开发,而应用程序在 AWS Linux 容器上运行。 哇,这正是我在 Lightsail 上发生的事情。即使我不想,Webstorm 也上传了【参考方案3】:

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

import $ from "cheerio";

不是

const $ = require("cheerio");

【讨论】:

【参考方案4】:

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

[由杰夫格布哈特解决] https://hub.docker.com/r/lambci/lambda/

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

使用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。

【讨论】:

【参考方案5】:

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

serverless.ts /.yml

块引用

  package: 
    individually: true   
,

【讨论】:

以上是关于在 AWS Lambda 上使用 nodejs“ref”模块时出现“无效的 ELF 标头”的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 和 AWS Lambda 上更新 nodejs API

使用 AWS Lambda (NodeJS) 创建 AWS AppSync

如何使用依赖项创建AWS nodejs lambda函数

AWS Lambda NodeJS 连接到 RDS Postgres 数据库

ReactJS - NodeJS - 在 AWS Lambda 上连接到 Graphql 的问题

如何使用 NodeJS 在本地测试 AWS Lambda 处理程序?