无服务器 NodeJS / 本机 node_modules

Posted

技术标签:

【中文标题】无服务器 NodeJS / 本机 node_modules【英文标题】:Serverless NodeJS / Native node_modules 【发布时间】:2018-02-08 22:50:47 【问题描述】:

我在使用无服务器框架在 AWS Lambda 中加载节点模块时遇到问题。我的一个节点包使用本机库,因此我使用 EC2 创建 node_module 文件夹,然后将它们复制到我的无服务器项目中。如果我手动压缩项目并上传到 AWS Lambda,一切正常,但如果我在没有指定工件的情况下使用 serverless deploy,我会收到关于模块的错误(特别是:ELF file's phentsize not the expected size 关于 .node 文件)

我尝试添加excludeDevDependencies: false,这会使部署变得更大,但仍然给我错误。目前,它仅在我压缩项目文件夹的内容并将该文件指定为要上传的工件时才有效。是否有其他方法可以让具有本机绑定的节点模块与 Serverless 一起部署?

更新:关闭开发依赖项的排除,使用 serverless package 打包并检查无服务器创建的扩展 zip 文件后,我发现打包版本中 .o 和 .a 文件的文件大小与原本的。这正常吗?

【问题讨论】:

你的原生库是 .so? 我不认为问题出在库本身,而是更多地与运行 serverless deploy 有关,因为如果我手动复制它们,它就可以工作。 我也看到了。使用节点模块中的图像文件进行测试,serverless package 然后解压缩会导致我无法打开的图像,而压缩和解压缩工作正常。 【参考方案1】:

我遇到了这个问题并进行了一些挖掘。事实证明,v1.21.0 的 serverless 破坏了二进制文件的打包。

https://forum.serverless.com/t/serverless-1-21-0-breaks-sharp-library/2606

https://github.com/serverless/serverless/issues/4182

建议的修复方法是升级到v1.21.1。

【讨论】:

很好的发现。您可以更新此答案。他们刚刚发布了serverless v1.21.1【参考方案2】:

由于 Lambda 在 Linux 容器上运行,您应该在 Linux 机器上运行 serverless deploy

这样,您的本地模块将针对您的目标架构(即 Linux)进行编译。

要检查serverless 创建的部署包,您可以使用sls packagesls deploy --noDeploy(对于旧版本),并检查它创建的.serverless 目录。您将在此处看到一个 zip 文件,提取其内容,然后从那里测试代码。

如果此 zip 的内容不是您所期望的(与您手动复制它们时不同),那么您的文件结构和/或 serverless.yml 可能有问题。

【讨论】:

当运行serverless deploy 时它会再次运行npm install 吗?我假设它只是压缩目录中的文件(正如文档所述)。 你的假设是正确的。 serverless deploy 只是压缩目录。 我的猜测是您的serverless.yml 和您的项目结构存在问题(它们不匹配)。如果你能展示你的serverless.yml 和你的项目树结构,那就太好了。 我可以通过一个空项目来实现这一点,该项目只是 requires 提到的模块。我现在正在通过自己压缩部署包并将其指定为serverless.yml 中的工件来解决它。如果您仍然认为它会有所帮助,我可以包含文件结构和 serverless.yml 文件,但它是运行 serverless create --template aws-nodejs 然后进入创建并需要模块的 handler.js 的产物。 我在使用 Fiber 模块 (ELF file's phentsize not the expected size) 时遇到了同样的问题,我在 docker 中,我可以在 sls package 之前要求该模块,但是一旦我完成了打包,如果我解压缩它并尝试要求相同的模块,它向我显示错误。有什么帮助吗?在我个人的情况下,一旦我添加 serverless-typescript-plugin,它就会开始发生,然后我们才能成功使用光纤

以上是关于无服务器 NodeJS / 本机 node_modules的主要内容,如果未能解决你的问题,请参考以下文章

用nodejs的express框架在本机搭建一台服务器

为桌面、移动本机应用程序和 oAuth 功能设计 nodejs expressjs mongodb Webserver 流

对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?

如何在 nodejs 中调试或运行本地 GCP 无服务器应用程序?

通过 NodeJS 与 MongoDB 反应本机 [关闭]

无法在 NodeJS 中使用本机 Windows 库