本文使用 nodejs 来实现图片格式转换,需要用到 sharp,aws lambda 是无法在线安装这个库的,必须在本地安装好后,将整个代码打包成 zip 上传到 lambda 才可以运行。
第一步:在 aws 控制台创建 lambda 函数。

第二步:在本地创建 webp2png 项目
mkdir webp2png && cd webp2png
touch index.mjs
npm init -y && npm install --os=linux --cpu=x64 sharp
主要一定要使用 Linux x64 环境来创建这个项目,否则 sharp 可能与 lambda 运行平台不一致,从而无法运行。参考文档:How to Deploy Sharp as an AWS Lambda Function Layer
index.mjs 代码
import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";
import sharp from "sharp";
const s3 = new S3Client({ region: "ap-southeast-1" });
export const handler = async (event) => {
const record = event.Records[0].s3;
const srcBucket = record.bucket.name;
const srcKey = decodeURIComponent(record.object.key.replace(/\+/g, " "));
if (!srcKey.endsWith(".webp")) return; // 仅处理 webp
// 构造新路径: output/原文件名.png
const dstKey = `output/${srcKey.replace(".webp", ".png")}`;
try {
// 1. 获取图片
const { Body } = await s3.send(new GetObjectCommand({ Bucket: srcBucket, Key: srcKey }));
const inputBuffer = Buffer.concat(await Body.toArray()); // v3 SDK 简写
// 2. 使用 Sharp 转换
const outputBuffer = await sharp(inputBuffer).png().toBuffer();
// 3. 上传新图片
await s3.send(new PutObjectCommand({
Bucket: srcBucket,
Key: dstKey,
Body: outputBuffer,
ContentType: "image/png",
}));
return { statusCode: 200, body: 'Success' };
} catch (error) {
console.error(error); throw error;
}
};
第三步:打包代码
zip -r web2png.zip .
注意:要在项目根目录下打包。
第四步:上传 zip 包到 lambda

第五步:添加测试
添加一个 s3PutEvent 事件,事件 json 大致如下:
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "ap-southeast-1",
"eventTime": "1970-01-01T00:00:00.000Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "EXAMPLE123456789",
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {
"name": "mycloud-test-filestorge",
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "arn:aws:s3:::mycloud-test-filestorge"
},
"object": {
"key": "images/avatar/f23cfaf4b006ae82ef11f432dce94f19.webp",
"size": 1024,
"eTag": "f23cfaf4b006ae82ef11f432dce94f19",
"sequencer": "0A1B2C3D4E5F678901"
}
}
}
]
}
这个测试用例的 json 内容是自动生成的,笔者只是修改了 region 和 object key、eTag 部分,保证其真实存在。
保存测试用例,并点击测试按钮,就可以看到对应的 webp 图片转换格式后并保存到前缀为 ouput 的目录下去了。 这里特别需要注意的是 awsRegion 要与 index.mjs 中 S3Client 初始化的 region 保持一直,否则可能出现错误。
The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.