You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

第二步:为Lambda环境安装兼容的Sharp

方法一:使用Lambda层(推荐,避免本地环境差异)

Lambda层可以单独管理原生依赖,无需在函数包中打包大体积二进制文件:

  1. 本地新建sharp-layer文件夹,进入后执行npm init -y初始化
  2. 安装适配Lambda环境的Sharp:
    npm install sharp --platform=linux --arch=x64 --target=18.x
    
    (target值需匹配你的Lambda Node.js runtime版本,比如16.x/20.x,可在Lambda控制台查看)
  3. 调整目录结构:创建sharp-layer/nodejs文件夹,将node_modules移动到该目录下(Lambda层要求依赖放在nodejs/node_modules路径)
  4. 压缩nodejs文件夹为zip包
  5. 登录AWS控制台,进入Lambda > 层 > 创建层,上传zip包,命名为sharp-layer,选择对应Node.js运行时
  6. 找到Amplify生成的Lambda触发器函数,进入配置 > 层 > 添加层,选择刚才创建的sharp-layer

方法二:本地构建兼容二进制后部署

如果不想用Lambda层,可直接在Lambda函数目录构建适配环境的Sharp:

  1. 进入Amplify生成的Lambda函数源码目录(通常为amplify/backend/function/[你的函数名]/src)
  2. 执行命令重新安装适配Lambda的Sharp:
    npm install sharp --platform=linux --arch=x64 --target=18.x
    
  3. 或执行重建命令更新二进制文件:
    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}`
  };
};

第四步:部署与测试

  1. 执行amplify push部署Lambda函数及层(若使用了层)
  2. 上传一张图片到Amplify创建的S3存储桶
  3. 查看Lambda的CloudWatch日志(Lambda > 函数 > 监控 > 日志),确认无报错
  4. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:00:22