无服务器 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 package
或sls deploy --noDeploy
(对于旧版本),并检查它创建的.serverless
目录。您将在此处看到一个 zip 文件,提取其内容,然后从那里测试代码。
如果此 zip 的内容不是您所期望的(与您手动复制它们时不同),那么您的文件结构和/或 serverless.yml
可能有问题。
【讨论】:
当运行serverless deploy
时它会再次运行npm install
吗?我假设它只是压缩目录中的文件(正如文档所述)。
你的假设是正确的。 serverless deploy
只是压缩目录。
我的猜测是您的serverless.yml
和您的项目结构存在问题(它们不匹配)。如果你能展示你的serverless.yml
和你的项目树结构,那就太好了。
我可以通过一个空项目来实现这一点,该项目只是 require
s 提到的模块。我现在正在通过自己压缩部署包并将其指定为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的主要内容,如果未能解决你的问题,请参考以下文章
为桌面、移动本机应用程序和 oAuth 功能设计 nodejs expressjs mongodb Webserver 流
对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?