AWS lambda 实现 S3 webp 图片转 png

本文使用 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.

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:AWS lambda 实现 S3 webp 图片转 png

本文地址:https://jizhong.plus/post/2026/06/aws-lambda-webp2png.html