如何将使用 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 插件)意味着我的模块再次安装在一个单独的文件夹中,清除了我刚刚手动安装的特定于平台的模块。

这里有两个选择:

  1. 使用serverless-plugin-scripts将部署事件挂接到运行上述补丁;或
  2. 运行 docker 中的无服务器使用具有匹配节点版本的 Linux 容器。

对于我的特定 edge 案例,我必须使用 Docker。构建脚本将影响您正在部署的每个功能——添加约 30mb 的 Sharp 代码——并且 Lambda@Edge 对源代码大小有限制。

对于使用 Sharp 模块的 AWS lambda 部署,以下在使用 serverlessesbuild[= 时对我有用21=] 和 serverless-esbuild。使用以下配置更改了 serverless.yml 文件。考虑到您的 lambda 使用 x64 arch,它基本上告诉 esbuild 使用以下 --arch=x64 --platform=linux 再次下载 sharp。检查 serverless-esbuild packagerpackagerOptions 选项以获得更多理解。

esbuild:
    # keep existing configurations
    external:
      - sharp
    packagerOptions:
      scripts:
        - npm install --arch=x64 --platform=linux sharp