当尝试在 AWS Lambda 函数中快速运行时,我不断收到以下错误:
darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用。 请删除“node_modules/sharp/vendor”目录并运行“npm” 安装'
我使用 MacBook Pro 上的无服务器框架部署无服务器应用程序。我该如何解决这个问题?
感谢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 倍以上!!!
如果你像我一样使用 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
运行后重新填充模块。
在从 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
如果您愿意
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
当我在 Windows 机器的 CMD 中执行
npm install --arch=x64 --platform=linux sharp
时,我遇到了同样的问题。
通过管理员模式打开CMD修复了,运行没有发现任何错误
npm install --arch=x64 --platform=linux sharp
如果您将 serverless 与 serverless-webpack 一起使用,则必须在 serverless.yml
文件中使用此
custom-config:
custom:
# ...
webpack:
# ...
packagerOptions:
scripts:
- npm install --arch=x64 --platform=linux sharp
如果您使用 SAM,您可以在类似 AWS Lambda 的 Linux Docker 容器中构建函数:
sam build -u
对于现在偶然发现这篇文章的人。我通过将
package.json
文件复制到 AWS Cloud9 IDE 并简单地运行 npm install
来完成此操作。从那里,只需下载 node_modules/
文件夹。
截至 2024 年,修复该问题的命令从 --arch 更改为 --cpu:
npm install --os=linux --cpu=x64 sharp