如何将使用Sharp库的无服务器框架应用程序部署到AWS?
Posted
技术标签:
【中文标题】如何将使用Sharp库的无服务器框架应用程序部署到AWS?【英文标题】:How can I deploy a Serverless Framework application the macOS that uses the sharp library to AWS? 【发布时间】:2020-05-18 03:51:30 【问题描述】:我正在开发一个使用 Node 运行时并部署到 AWS 的无服务器框架应用程序。我的一个 AWS Lambda 函数使用了 sharp 库。
当我运行 AWS Lambda 函数时,出现以下错误:
“darwin-x64”二进制文件不能在“linux-x64”平台上使用。请删除“node_modules/sharp/vendor”目录并运行“npm install”。
我认为发生此错误是因为当我在本地计算机上运行 sls deploy
命令时,应用程序在 macOS 上打包,然后移至 AWS。我认为应用程序需要使用linux-x64
打包在操作系统上。
如何从我的计算机部署我的无服务器框架并且仍然能够使用Sharp库?
【问题讨论】:
【参考方案1】:您可以使用以下方式安装 Linux 兼容包:
rm -rf node_modules/sharp
npm install --arch=x64 --platform=linux --target=10.15.0 sharp
请注意,这还指定了目标 NodeJS 版本,确保它与您在 Lambda 中使用的节点版本相同。这直接来自文档(请参阅here。)
但这并没有解决我的问题。我的无服务器配置(使用serverless-bundle
插件)意味着我的模块将再次安装在一个单独的文件夹中,从而清除了我刚刚手动安装的特定于平台的模块。
这里有两个选择:
-
使用serverless-plugin-scripts挂钩部署事件以运行上述补丁;或
使用具有匹配节点版本的 Linux 容器在 docker 中运行无服务器。
对于我特定的 edge 案例,我不得不选择 Docker。构建脚本将影响您正在部署的每个功能——添加约 30mb 的 Sharp 代码——并且 Lambda@Edge 对源代码大小有限制。
【讨论】:
这对我有帮助 - 安装带有特定arch
定义的Sharp包。我在官方文档中读到了这个,但一开始我并不太明白。我认为sls deploy
命令正在为我安装和打包所有东西。谢谢。【参考方案2】:
https://www.npmjs.com/package/sharp 的描述表明它是 linux 兼容的。
我不熟悉如何(或者如果可以的话)将节点本机包解析强制到单独的操作系统。尝试在 docker 镜像 https://hub.docker.com/_/alpine/
中构建你的 lambda zip【讨论】:
我不是很熟悉——是否可以设置一个 Docker 容器来启动、构建和部署代码,然后立即关闭? 是的。您挂载本地文件系统,它会像任何其他进程一样完成所有构建工作并死掉。 Docker / Containers 只是类固醇上的进程隔离,这里没有魔法。不过,您可能最终会得到由 root 拥有的输出文件。所以你需要以某种方式处理这个问题。最简单的解决方案可能也是在 docker 中进行上传,这样您就不需要挂载文件系统。【参考方案3】:如果您还没有,我建议您遵循Installing the AWS SAM CLI on macOS 指南,以确保您拥有在 macOS 上开发 Serverless 的正确本地环境。
此过程专为 macOS 设计,包括对 Docker 的内置支持,因此您可以直接从本地计算机构建和部署与 Lambda 兼容的包。
【讨论】:
以上是关于如何将使用Sharp库的无服务器框架应用程序部署到AWS?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用sharp.js将图像从缓冲区存储到node.js中的文件系统