在AWS Lambda中使用imagemin-pngquant报错:无法执行二进制文件
解决AWS Lambda中imagemin-pngquant无法执行二进制文件的问题
问题场景
在AWS Lambda函数中使用imagemin搭配imagemin-pngquant压缩PNG图片,代码如下:
// 压缩图片后上传 let converted_image = await imagemin.buffer(await image.data, { plugins: [ imageminPngquant({ quality: [.55, .65], speed: 8, strip: true }) ], })
执行时报错:
Error: Error: /var/task/node_modules/pngquant-bin/vendor/pngquant: /var/task/node_modules/pngquant-bin/vendor/pngquant: cannot execute binary file
核心原因
pngquant-bin默认根据本地开发环境(比如Mac/Windows)下载对应架构的二进制文件,但AWS Lambda运行的是Amazon Linux 2 x64环境,本地的二进制文件无法在该环境下执行。
解决步骤
1. 重新安装适配Lambda环境的依赖
在项目根目录执行以下命令,强制npm下载适配Linux x64架构的pngquant二进制包:
npm_config_platform=linux npm_config_arch=x64 npm install imagemin-pngquant --save
2. 精简代码冗余
代码中await image.data是多余操作——axios以arrayBuffer类型请求返回的image.data本身就是Buffer,无需额外await。修改后的代码:
// 压缩图片后上传 let converted_image = await imagemin.buffer(image.data, { plugins: [ imageminPngquant({ quality: [.55, .65], speed: 8, strip: true }) ], })
3. 备选方案:用Lambda层封装依赖
如果上述方法无效,可以将依赖打包成Lambda层:
- 新建空目录,执行
npm init -y初始化项目 - 用第一步的命令安装依赖
- 将
node_modules目录打包成zip文件 - 在AWS控制台上传该zip作为Lambda层,并关联到你的函数
验证
部署修改后的代码到Lambda,测试PNG压缩功能,即可确认报错是否解决。
内容的提问来源于stack exchange,提问作者Joel Hager
相关产品推荐
相关产品推荐

