【问题标题】:Error running Sharp inside AWS Lambda function: darwin-x64' binaries cannot be used on the 'linux-x64' platform在 AWS Lambda 函数中运行 Sharp 时出错:darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用
【发布时间】:2020-05-27 14:03:32
【问题描述】:

尝试在 AWS Lambda 函数中快速运行时,我不断收到以下错误:

darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用。 请删除“node_modules/sharp/vendor”目录并运行“npm” 安装”

我在 MacBook Pro 上使用无服务器框架部署无服务器应用程序。我该如何解决这个问题?

【问题讨论】:

  • 你需要在Linux环境中构建,因为它不同于Mac O/S环境。
  • 我相信你是对的。但是我该怎么做呢?为什么尖锐的环境依赖于环境?
  • 有多种方法可以做到这一点。在 Mac O/S 环境中,您可以考虑安装 VirtualBox,然后将 Linux 发行版放在那里。或者,如果您已经拥有一个 AWS 账户,那么您可以使用 Linux 启动一个小型 EC2。这将需要在任一环境中都有一个开发环境。看来夏普在后台有一些原生组件。

标签: aws-lambda macos-mojave sharp


【解决方案1】:

感谢stdunbar 引导我朝着正确的方向前进。

当通过 NPM 在 MacOS 上以正常方式安装Sharp(即:npm i sharp --save)时,安装程​​序会自动添加 OS X 的二进制文件。但是 AWS lambda 函数在具有 x64 处理器的 Linux 2 机器上运行,这就是我们收到此错误的原因.

要修复你必须先完全卸载sharp然后运行:

npm install --arch=x64 --platform=linux sharp

注意:

0.25 版不再适用于目标标志。这曾经有效:

npm install --arch=x64 --platform=linux --target=10.15.0 sharp

然后像往常一样使用sls deploy从无服务器框架部署

旁注:

夏普非常快!!!在使用sharp 之前,我使用了另一个名为Jimp 的图像大小调整实用程序。它完成了这项工作,但速度很慢。为了防止超时错误,我不得不将内存大小从 128 增加到 512,并将超时从 5 秒增加到 30 秒,以处理典型的 1 兆字节图像。

以下是使用相同配置将 1.2Mb 图片缩小到 600x400 时两者之间的比较:

Jimp -> 使用了 512Mb 的内存,AWS 向我收取了 14300 毫秒的费用。

Sharp -> 使用了 132 MB 内存,AWS 向我收取了 800 毫秒的费用。

这比 Jimp 快 14 倍以上!!!

【讨论】:

  • 我试过这个npm install --arch=x64 --platform=linux sharp -save 并使用无服务器部署,仍然得到这个错误。我在 Mac 上。
  • 不是-save,是--save。而你不需要它。记得在运行上述命令之前完全卸载sharp。
  • 我无法通过 mac 正确构建和部署到 CloudFoundry。但是,你让我走上了正轨。我使用了一个 linux VM 来构建,并且成功了。谢谢!!!
  • 干杯!它对我有用。谢谢,@KeithHarris。
  • 这工作谢谢!你知道有没有办法同时安装 mac 和 linux 版本,这样我也可以在本地测试?
【解决方案2】:

当我在 Windows 机器的 CMD 中执行 npm install --arch=x64 --platform=linux sharp 时,我遇到了同样的问题。

通过在管理员模式下打开CMD修复它,我在运行npm install --arch=x64 --platform=linux sharp时没有发现任何错误

【讨论】:

  • 这解决了我在运行“放大推送”时收到以下错误的问题:npm ERR!路径 ...\amplify\backend\function\AmplifyFunction\src\node_modules\.bin\semver.cmd npm 错误!代码 EEXIST npm 错误!文件存在:...\amplify\backend\function\AmplifyFunction\src\node_modules\.bin\semver.cmd npm ERR!将其移开,然后重试。
【解决方案3】:

从 MacOS 或 Windows 构建时,我发现了一个更简单的解决方案,我使用带有 SAM 的 Makefile 并提供 linux 作为 NPM 安装的目标。

template.yaml

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: mycode/
      Handler: handler.handler
      Runtime: nodejs12.x
      MemorySize: 512
      Timeout: 5
      Role: !GetAtt EdgeLambdaRole.Arn
    Metadata:
        BuildMethod: makefile

我的代码/makefile

build-MyFunction:
    cp *.js $(ARTIFACTS_DIR)
    cp package.json $(ARTIFACTS_DIR)
    cp package-lock.json $(ARTIFACTS_DIR)
    cd $(ARTIFACTS_DIR) && npm install --production --arch=x64 --platform=linux

确保在 makefile 中使用 TABS

【讨论】:

    【解决方案4】:

    如果您将serverlessserverless-webpack 一起使用,则必须在serverless.yml 文件中使用此custom-config

    custom:
      # ...
      webpack:
        # ...
        packagerOptions:
          scripts:
            - npm install --arch=x64 --platform=linux sharp
    
    

    【讨论】:

      【解决方案5】:

      如果你喜欢yarn,通过环境变量设置

      注意:我先清理现有平台/架构。

      # For macOS/Windows, we can install natively
      yarn remove sharp
      yarn add sharp
      
      # For AWS Lambda, we need to specify this when we package:
      yarn remove sharp
      npm_config_platform=linux npm_config_arch=x64 yarn add sharp
      

      【讨论】:

        【解决方案6】:

        如果您使用 SAM,您可以在类似 AWS Lambda 的 Linux Docker 容器中构建您的函数:

        sam build -u
        

        【讨论】:

          【解决方案7】:

          对于现在偶然发现这篇文章的任何人。我通过将我的package.json 文件复制到AWS Cloud9 IDE 并简单地运行npm install 来完成此操作。从那里,只需下载node_modules/ 文件夹。

          【讨论】:

            【解决方案8】:

            如果你像我一样使用 Docker 并遇到这个问题。

            您的 node_modules 文件夹很可能正在从您的主机复制到 docker 容器中。

            为什么?因为您的node_modules 文件夹会下载特定于您机器架构(在我的情况下为 Mac)的模块,所以当您获取这些包并尝试在容器操作系统中运行它们时,它会导致问题,因为二进制文件适用于 mac(darwin-x64 ) 并尝试在容器内的 linux (linux-x64) 上运行它们

            要修复它,请在与您的 Dockerfile 相同的目录中创建一个名为 .dockerignore 的文件并相应地更新它们。

            .dockerignore

            node_modules/
            

            Dockerfile

            FROM node:latest
            WORKDIR /usr/src/app
            COPY package*.json ./
            RUN ["npm", "install"]
            COPY . .
            CMD ["npm", "start"]
            

            【讨论】:

              猜你喜欢
              • 2020-09-14
              • 2021-10-19
              • 2022-09-25
              • 2020-01-15
              • 1970-01-01
              • 1970-01-01
              • 2021-08-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多