对于名为“argon2”的包,我遇到了一个错误,上面写着“无效的 ELF 标头”。通过无服务器框架将我的代码上传到 AWS Lambda 时。代码在本地运行时完美运行。
MacOS Big Sur 11.4 版开发
我对错误进行了一些研究,人们说要使用 Docker 编译包然后发送到 Lambda。在尝试 docker 解决方案之前,我没有与 Docker 合作太多,并想探索其他选项。
任何指导或帮助将不胜感激!我已经被这个错误困住了一两天了。
对于名为“argon2”的包,我遇到了一个错误,上面写着“无效的 ELF 标头”。通过无服务器框架将我的代码上传到 AWS Lambda 时。代码在本地运行时完美运行。
MacOS Big Sur 11.4 版开发
我对错误进行了一些研究,人们说要使用 Docker 编译包然后发送到 Lambda。在尝试 docker 解决方案之前,我没有与 Docker 合作太多,并想探索其他选项。
任何指导或帮助将不胜感激!我已经被这个错误困住了一两天了。
到底是怎么回事?
您正在使用的包 ( argon2
) 包含到 argon2 算法的 C 实现的绑定。换句话说,包本身包装了一个用 C 编写的库,并使其可以在您的 node.js 环境中访问。
该 C 包也随您的包一起提供,并在您运行npm install argon2
. 这意味着在安装 argon2 之后,您的文件系统上有一个二进制共享库,它与您的节点环境交互。因为您是在 MacOS 上安装,所以将为 Mac 编译(或下载)二进制文件。这意味着您最终会得到一个 MACH-O 文件(这是 macOS 的可执行文件格式)而不是 ELF 文件(这是 Linux 用于可执行文件的格式)。
现在您的 Lambda(在后台运行 Linux)有效地抱怨说,您在 Mac 上构建的可执行文件不是 Linux 可执行文件。
你如何解决这个问题?
简单来说,您需要一种方法来npm install
构建或下载适用于 Linux 的 argon2 版本。有两种不同的方法可以实现这一目标。选一个:
npm install
在 Linux 上正如标题所说,在 Linux 下下载并构建您的依赖项。您可以使用虚拟机或 Docker 容器来执行此操作。另一种选择是使用 AWS 构建 SaaS 产品 (AWS CodeBuild) 来执行此操作。
npm install --target_arch=x64 --target_platform=linux --target_libc=glibc
在 Mac 上值得庆幸的是,argon2 支持 node-pre-gyp。它们有效地为您提供了预构建二进制文件,这意味着您可以只拉取 linux 二进制文件,而不必自己编译它们。为此,扔掉你的 node_modules 文件夹并运行npm install --target_arch=x64 --target_platform=linux
. 这将下载 Linux 文件,而不是 macOS 文件。然后,您可以将所有内容推送到您的 lambda 中。请注意,这意味着您的应用程序将不再在本地运行,因为您的 mac 无法运行 Linux 可执行文件(您必须npm install
再次运行,省略两个参数才能返回 MacOS 版本)。
请注意,除了 argon2 之外,可能还有不支持 MacOS 的软件包,在这种情况下,您必须选择第一个选项。
只是补充。要部署到 Lambda,您(最终)需要以 zip 格式发送文件。为了有效地打包你的项目,你需要一个像 Webpack 这样的打包器。问题是,argon2 和任何其他散列实现(如 bcrypt)使用 node-pre-gyp 依赖项,这与 bundler 不兼容。所以选项是:
请记住,哈希性能本身与内存和 CPU 成正比。因此,运行哈希算法以获得快速结果可能意味着高额的 Lambda 账单。