在 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 模块)