如何在AWS Amplify的Lambda Trigger中安装sharp包
问题原因说明
1. 包管理器冲突
同时存在yarn.lock和package-lock.json文件时,npm会检测到第三方锁文件并抛出错误,导致依赖安装失败;混用npm和yarn也会导致依赖版本不一致,引发后续运行问题。
2. Sharp原生模块兼容性问题
Sharp是依赖预编译二进制文件的原生模块,不同操作系统/架构的二进制文件不通用。本地开发环境(如Mac/Windows)安装的Sharp二进制文件,和Lambda运行的Linux x64环境不匹配,部署后Lambda找不到对应平台的sharp-linux-x64.node模块,导致运行报错。
分步解决指导
第一步:清理包管理器冲突
- 删除项目根目录下所有锁文件:
yarn.lock和package-lock.json - 选择单一包管理器(推荐npm,适配Amplify默认流程),执行
npm install重新生成package-lock.json- 若偏好yarn,删除
package-lock.json后执行yarn install生成yarn.lock
- 若偏好yarn,删除
第二步:为Lambda环境安装兼容的Sharp
方法一:使用Lambda层(推荐,避免本地环境差异)
Lambda层可以单独管理原生依赖,无需在函数包中打包大体积二进制文件:
- 本地新建
sharp-layer文件夹,进入后执行npm init -y初始化 - 安装适配Lambda环境的Sharp:
(npm install sharp --platform=linux --arch=x64 --target=18.xtarget值需匹配你的Lambda Node.js runtime版本,比如16.x/20.x,可在Lambda控制台查看) - 调整目录结构:创建
sharp-layer/nodejs文件夹,将node_modules移动到该目录下(Lambda层要求依赖放在nodejs/node_modules路径) - 压缩
nodejs文件夹为zip包 - 登录AWS控制台,进入Lambda > 层 > 创建层,上传zip包,命名为
sharp-layer,选择对应Node.js运行时 - 找到Amplify生成的Lambda触发器函数,进入配置 > 层 > 添加层,选择刚才创建的
sharp-layer
方法二:本地构建兼容二进制后部署
如果不想用Lambda层,可直接在Lambda函数目录构建适配环境的Sharp:
- 进入Amplify生成的Lambda函数源码目录(通常为
amplify/backend/function/[你的函数名]/src) - 执行命令重新安装适配Lambda的Sharp:
npm install sharp --platform=linux --arch=x64 --target=18.x - 或执行重建命令更新二进制文件:
npm rebuild sharp --platform=linux --arch=x64
第三步:调整Lambda代码(确保正确调用Sharp)
以下是基础的S3图片缩放示例代码(替换你的index.js内容):
const sharp = require('sharp'); const AWS = require('aws-sdk'); const s3 = new AWS.S3(); exports.handler = async (event) => { // 解析S3触发事件 const bucket = event.Records[0].s3.bucket.name; const rawKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); // 获取原始图片 const getParams = { Bucket: bucket, Key: rawKey }; const rawImage = await s3.getObject(getParams).promise(); // 执行缩放(示例:缩放到300px宽度,保持比例) const resizedBuffer = await sharp(rawImage.Body) .resize({ width: 300 }) .toFormat('jpeg') .toBuffer(); // 上传缩放后的图片到S3(可自定义存储路径) const uploadKey = `resized/${rawKey}`; const uploadParams = { Bucket: bucket, Key: uploadKey, Body: resizedBuffer, ContentType: 'image/jpeg' }; await s3.putObject(uploadParams).promise(); return { statusCode: 200, body: `图片已缩放并上传至: ${uploadKey}` }; };
第四步:部署与测试
- 执行
amplify push部署Lambda函数及层(若使用了层) - 上传一张图片到Amplify创建的S3存储桶
- 查看Lambda的CloudWatch日志(Lambda > 函数 > 监控 > 日志),确认无报错
- 检查S3存储桶中是否生成了
resized/目录及缩放后的图片
注意事项
- 确保Lambda执行角色拥有S3权限:Amplify默认生成的角色已包含基础读写权限,若自定义权限需添加
s3:GetObject和s3:PutObject权限 - 匹配Sharp与Node.js版本:Sharp v0.32+支持Node.js 18+,若Lambda使用旧版本Node.js,需安装对应兼容的Sharp版本(如Node.js 16.x对应Sharp v0.31.x)
- 禁止混用npm和yarn:后续依赖安装只用选定的包管理器,避免锁文件冲突
内容的提问来源于stack exchange,提问作者jonathan
相关产品推荐
相关产品推荐

