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

问题描述 投票:0回答:9

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

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

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

aws-lambda macos-mojave sharp
9个回答
30
投票

感谢stdunbar引导我走向正确的方向。

当通过 NPM 在 MacOS 上以正常方式安装 Sharp 时(即:

npm i sharp --save
),安装程序会自动添加适用于 OS X 的二进制文件。但是 AWS lambda 函数在具有 x64 处理器的 Linux 2 计算机上运行,这就是我们收到此错误的原因。

要修复,您必须首先完全卸载锐利,然后运行:

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

注:

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

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

然后像往常一样从无服务器框架进行部署

sls deploy

旁注:

Sharp 速度极快!!!在使用 Sharp 之前,我使用的是另一个名为 Jimp 的图像调整大小实用程序。它完成了工作,但速度相当慢。为了防止超时错误,我必须将内存大小从 128 增加到 512,并将超时从 5 秒增加到 30 秒,才能处理典型的 1 MB 图像。

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

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

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

比 Jimp 快 14 倍以上!!!


6
投票

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

很可能您的

node_modules
文件夹正在从主机复制到 docker 容器中。

为什么?因为您的

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

要修复此问题,请在与

.dockerignore
相同的目录中创建一个名为
Dockerfile
的文件并进行相应更新。

.dockerignore

node_modules/

Dockerfile

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

现在它将忽略主机上的

node_modules
文件夹,并在 Dockerfile 内的命令
npm install
运行后重新填充模块。


4
投票

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

模板.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


3
投票

如果您愿意

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

2
投票

当我在 Windows 机器的 CMD 中执行

npm install --arch=x64 --platform=linux sharp
时,我遇到了同样的问题。

通过管理员模式打开CMD修复了,运行没有发现任何错误

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


1
投票

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

custom-config

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


0
投票

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

sam build -u

0
投票

对于现在偶然发现这篇文章的人。我通过将

package.json
文件复制到 AWS Cloud9 IDE 并简单地运行
npm install
来完成此操作。从那里,只需下载
node_modules/
文件夹。


0
投票

截至 2024 年,修复该问题的命令从 --arch 更改为 --cpu:

npm install --os=linux --cpu=x64 sharp
© www.soinside.com 2019 - 2024. All rights reserved.