"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.
- 使用
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。
对于那些在 Lambda 上将 JS 移植到 TypeScript 的开发人员,确保导入所有依赖项,而不是必需的:
import $ from "cheerio";
没有
const $ = require("cheerio");
同样,对于任何在这个问题上快要流泪的人,请尝试单独打包您的函数:
serverless.ts /.yml
块引用
package: {
individually: true
},
我刚刚向 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.
- 使用
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。
对于那些在 Lambda 上将 JS 移植到 TypeScript 的开发人员,确保导入所有依赖项,而不是必需的:
import $ from "cheerio";
没有
const $ = require("cheerio");
同样,对于任何在这个问题上快要流泪的人,请尝试单独打包您的函数:
serverless.ts /.yml
块引用
package: {
individually: true
},