如何将使用 sharp 库的 macOS 无服务器框架应用程序部署到 AWS?
How can I deploy a Serverless Framework application the macOS that uses the sharp library to AWS?
我正在开发一个使用 Node 运行time 并部署到 AWS 的无服务器框架应用程序。我的一个 AWS Lambda 函数使用了 sharp 库。
当我运行 AWS Lambda 函数时,出现以下错误:
'darwin-x64' binaries cannot be used on the 'linux-x64' platform. Please remove the 'node_modules/sharp/vendor' directory and run 'npm install'.
我认为发生此错误是因为当我在本地计算机上 运行 sls deploy
命令时,应用程序在 macOS 上打包,然后移动到 AWS。我认为应用程序需要在使用 linux-x64
.
的操作系统上打包
如何从我的计算机部署我的无服务器框架并且仍然能够使用 sharp 库?
https://www.npmjs.com/package/sharp 的描述表明它 linux 兼容。
我不熟悉如何(或者如果你可以)强制节点本地包解析到一个单独的 OS。尝试在 docker 图像 https://hub.docker.com/_/alpine/
中构建 lambda zip
如果您还没有,我建议您遵循 Installing the AWS SAM CLI on macOS 指南,以确保您拥有在 macOS 上开发 Serverless 的正确本地环境。
此过程专为 macOS 设计,包括对 Docker 的内置支持,因此您可以直接从本地计算机构建和部署与 Lambda 兼容的程序包。
您可以使用以下方法安装 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将部署事件挂接到运行上述补丁;或
- 运行 docker 中的无服务器使用具有匹配节点版本的 Linux 容器。
对于我的特定 edge 案例,我必须使用 Docker。构建脚本将影响您正在部署的每个功能——添加约 30mb 的 Sharp 代码——并且 Lambda@Edge 对源代码大小有限制。
对于使用 Sharp 模块的 AWS lambda 部署,以下在使用 serverless、esbuild[= 时对我有用21=] 和 serverless-esbuild。使用以下配置更改了 serverless.yml 文件。考虑到您的 lambda 使用 x64 arch,它基本上告诉 esbuild 使用以下 --arch=x64 --platform=linux 再次下载 sharp。检查 serverless-esbuild packager 和 packagerOptions 选项以获得更多理解。
esbuild:
# keep existing configurations
external:
- sharp
packagerOptions:
scripts:
- npm install --arch=x64 --platform=linux sharp
我正在开发一个使用 Node 运行time 并部署到 AWS 的无服务器框架应用程序。我的一个 AWS Lambda 函数使用了 sharp 库。
当我运行 AWS Lambda 函数时,出现以下错误:
'darwin-x64' binaries cannot be used on the 'linux-x64' platform. Please remove the 'node_modules/sharp/vendor' directory and run 'npm install'.
我认为发生此错误是因为当我在本地计算机上 运行 sls deploy
命令时,应用程序在 macOS 上打包,然后移动到 AWS。我认为应用程序需要在使用 linux-x64
.
如何从我的计算机部署我的无服务器框架并且仍然能够使用 sharp 库?
https://www.npmjs.com/package/sharp 的描述表明它 linux 兼容。
我不熟悉如何(或者如果你可以)强制节点本地包解析到一个单独的 OS。尝试在 docker 图像 https://hub.docker.com/_/alpine/
中构建 lambda zip如果您还没有,我建议您遵循 Installing the AWS SAM CLI on macOS 指南,以确保您拥有在 macOS 上开发 Serverless 的正确本地环境。
此过程专为 macOS 设计,包括对 Docker 的内置支持,因此您可以直接从本地计算机构建和部署与 Lambda 兼容的程序包。
您可以使用以下方法安装 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将部署事件挂接到运行上述补丁;或
- 运行 docker 中的无服务器使用具有匹配节点版本的 Linux 容器。
对于我的特定 edge 案例,我必须使用 Docker。构建脚本将影响您正在部署的每个功能——添加约 30mb 的 Sharp 代码——并且 Lambda@Edge 对源代码大小有限制。
对于使用 Sharp 模块的 AWS lambda 部署,以下在使用 serverless、esbuild[= 时对我有用21=] 和 serverless-esbuild。使用以下配置更改了 serverless.yml 文件。考虑到您的 lambda 使用 x64 arch,它基本上告诉 esbuild 使用以下 --arch=x64 --platform=linux 再次下载 sharp。检查 serverless-esbuild packager 和 packagerOptions 选项以获得更多理解。
esbuild:
# keep existing configurations
external:
- sharp
packagerOptions:
scripts:
- npm install --arch=x64 --platform=linux sharp