返回

弹指一挥,让 AWS Lambda@Edge 为你解决图片问题

前端

何为 AWS Lambda@Edge

AWS Lambda@Edge 是一项无服务器计算服务,可以让你在 Amazon CloudFront 的边缘位置运行代码。这允许你处理请求,而无需在每个请求中启动新的实例。

使用 AWS Lambda@Edge,你可以:

  • 改进网站的性能和速度
  • 减少带宽消耗
  • 提高安全性
  • 降低成本
  • 简化应用程序架构

图片处理 Lambda 函数

要使用 AWS Lambda@Edge 处理图片,你需要创建一个 Lambda 函数。此函数应完成以下任务:

  • 从请求中提取图片 URL
  • 从 S3 下载图片
  • 根据需要处理图片(例如,缩放、调整质量或转换为 webp)
  • 将处理后的图片上传到 S3
  • 返回处理后图片的 URL

创建 Lambda 函数

要创建 Lambda 函数,请按照以下步骤操作:

  1. 登录 AWS 管理控制台并打开 Lambda 服务。
  2. 单击“创建函数”按钮。
  3. 选择“从头开始”选项。
  4. 在“函数名称”字段中输入函数的名称。
  5. 在“运行时”字段中选择“Node.js 12.x”。
  6. 在“代码”部分中,粘贴以下代码:
const sharp = require('sharp');
const { createReadStream, createWriteStream } = require('fs');
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');

exports.handler = async (event) => {
  // Get the image URL from the request
  const imageUrl = event.Records[0].cf.request.uri;

  // Get the image from S3
  const s3Client = new S3Client();
  const s3Params = {
    Bucket: 'your-bucket-name',
    Key: imageUrl.substring(1),
  };
  const s3GetObjectCommand = new GetObjectCommand(s3Params);
  const s3GetObjectResponse = await s3Client.send(s3GetObjectCommand);

  // Process the image
  const imageBuffer = await sharp(s3GetObjectResponse.Body).resize(800, 600).toBuffer();

  // Upload the processed image to S3
  const putObjectParams = {
    Bucket: 'your-bucket-name',
    Key: `processed/${imageUrl.substring(1)}`,
    Body: imageBuffer,
  };
  const putObjectCommand = new PutObjectCommand(putObjectParams);
  await s3Client.send(putObjectCommand);

  // Get the signed URL for the processed image
  const signedUrlParams = {
    Bucket: 'your-bucket-name',
    Key: `processed/${imageUrl.substring(1)}`,
    Expires: 3600,
  };
  const signedUrl = await getSignedUrl(s3Client, signedUrlParams);

  // Return the signed URL
  return {
    statusCode: 302,
    headers: {
      'Location': signedUrl,
    },
  };
};

部署 Lambda 函数

要部署 Lambda 函数,请按照以下步骤操作:

  1. 在 Lambda 控制台中,单击“部署”按钮。
  2. 选择“触发器”选项卡。
  3. 在“触发器类型”字段中选择“CloudFront 事件”。
  4. 在“分布”字段中选择要部署函数的 CloudFront 分布。
  5. 在“事件类型”字段中选择“Viewer Request”。
  6. 单击“保存”按钮。

测试 Lambda 函数

要测试 Lambda 函数,请按照以下步骤操作:

  1. 将图片上传到 S3 存储桶。
  2. 在浏览器中打开图片的 URL。
  3. 查看图片是否已按预期处理。

使用其他 AWS 服务

你可以将 AWS Lambda@Edge 与其他 AWS 服务结合使用,以创建强大的解决方案。例如,你可以使用以下服务:

  • Amazon CloudFront:将 Lambda 函数作为 CloudFront 分布的边缘位置,以提高网站的性能和速度。
  • Amazon S3:将 Lambda 函数作为 S3 存储桶的触发器,以在文件上传或删除时执行操作。
  • Amazon DynamoDB:将 Lambda 函数作为 DynamoDB 表的触发器,以在记录添加、修改或删除时执行操作。
  • Amazon Kinesis:将 Lambda 函数作为 Kinesis 流的消费者,以处理流数据。

结论

AWS Lambda@Edge 是一种功能强大的服务,可用于处理图片和其他类型的请求。通过使用 AWS Lambda@Edge,你可以提高网站的性能和速度,减少带宽消耗,提高安全性,降低成本并简化应用程序架构。