在 AWS Lambda 函数中运行 Sharp 时出错:darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用

Posted

技术标签:

【中文标题】在 AWS Lambda 函数中运行 Sharp 时出错:darwin-x64\' 二进制文件不能在 \'linux-x64\' 平台上使用【英文标题】: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。这将需要在任一环境中都有一个开发环境。看来夏普在后台有一些原生组件。 【参考方案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】:

如果您将serverless 与serverless-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"]

【讨论】:

以上是关于在 AWS Lambda 函数中运行 Sharp 时出错:darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用的主要内容,如果未能解决你的问题,请参考以下文章

错误:darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用(AWS lambda + typescript + webpack sharp 模块)

如何将使用Sharp库的无服务器框架应用程序部署到AWS?

如何在aws中运行java lambda函数[重复]

为 aws lambda 构建节点模块

在 AWS lambda 上运行 graphql 应用程序

如何从 AWS Lambda 函数运行 ECS 任务?