【问题标题】:How can I deploy a Serverless Framework application the macOS that uses the sharp library to AWS?如何将使用Sharp库的无服务器框架应用程序部署到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库?

【问题讨论】:

    标签: node.js macos amazon-web-services serverless-framework sharp


    【解决方案1】:

    您可以使用以下方式安装 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. 使用具有匹配节点版本的 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 兼容的包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2021-06-04
      • 2019-10-12
      • 1970-01-01
      • 2019-08-04
      • 2022-06-14
      • 2016-04-30
      • 2021-01-07
      相关资源
      最近更新 更多