在 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 实例。
使用nvm
和docker
安装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 Lambda NodeJS 连接到 RDS Postgres 数据库