Ускорение доставки изображений с помощью AWS Lambda@Edge и CloudFront

В современной цифровой среде предоставление пользователям оптимизированных изображений имеет решающее значение для обеспечения быстрого и привлекательного взаимодействия с пользователем. AWS Lambda@Edge и CloudFront — это мощные сервисы, которые можно использовать для ускорения доставки изображений за счет динамического управления и оптимизации изображений «на лету». В этой статье мы рассмотрим несколько методов достижения этой цели, а также примеры кода, которые помогут вам повысить производительность доставки изображений.

  1. Сжатие изображений.
    Уменьшение размера изображений без ущерба для качества является ключевым фактором оптимизации доставки изображений. AWS предоставляет различные библиотеки сжатия изображений, которые можно интегрировать с Lambda@Edge для автоматического сжатия изображений перед их отправкой пользователям. Вот пример использования библиотеки sharp:
const sharp = require('sharp');
exports.handler = async (event, context, callback) => {
  const { request, response } = event.Records[0].cf;

  // Check if the request is for an image
  if (request.headers['accept'].some((header) => header.value.includes('image'))) {
    // Compress the image
    const image = sharp(response.body);
    const compressedImage = await image.jpeg({ quality: 80 }).toBuffer();

    // Update the response with the compressed image
    response.body = compressedImage;
    response.headers['content-length'] = [{ key: 'Content-Length', value: compressedImage.length.toString() }];
  }

  callback(null, response);
};
  1. Изменение размера изображения.
    Представление изображений правильного размера в зависимости от области просмотра или устройства пользователя имеет решающее значение для оптимизации производительности. Lambda@Edge можно использовать для изменения размера изображений на лету. Вот пример использования библиотеки sharp:
const sharp = require('sharp');
exports.handler = async (event, context, callback) => {
  const { request, response } = event.Records[0].cf;

  // Check if the request is for an image
  if (request.headers['accept'].some((header) => header.value.includes('image'))) {
    // Resize the image to a specific width
    const image = sharp(response.body);
    const resizedImage = await image.resize({ width: 600 }).toBuffer();

    // Update the response with the resized image
    response.body = resizedImage;
    response.headers['content-length'] = [{ key: 'Content-Length', value: resizedImage.length.toString() }];
  }

  callback(null, response);
};
  1. Оптимизация изображений.
    Lambda@Edge можно использовать для оптимизации изображений путем применения различных преобразований, таких как преобразование их в прогрессивный формат или удаление метаданных. Вот пример использования библиотеки sharp:
const sharp = require('sharp');
exports.handler = async (event, context, callback) => {
  const { request, response } = event.Records[0].cf;

  // Check if the request is for an image
  if (request.headers['accept'].some((header) => header.value.includes('image'))) {
    // Optimize the image
    const image = sharp(response.body);
    const optimizedImage = await image.jpeg({ progressive: true }).toBuffer();

    // Update the response with the optimized image
    response.body = optimizedImage;
    response.headers['content-length'] = [{ key: 'Content-Length', value: optimizedImage.length.toString() }];
  }

  callback(null, response);
};
  1. Нанесение водяных знаков на изображения.
    Lambda@Edge также можно использовать для динамического добавления водяных знаков на изображения. Вот пример использования библиотеки sharp:
const sharp = require('sharp');
exports.handler = async (event, context, callback) => {
  const { request, response } = event.Records[0].cf;

  // Check if the request is for an image
  if (request.headers['accept'].some((header) => header.value.includes('image'))) {
    // Add a watermark to the image
    const image = sharp(response.body);
    const watermarkedImage = await image.composite([{input: 'watermark.png'}]).toBuffer();

    // Update the response with the watermarked image
    response.body = watermarkedImage;
    response.headers['content-length'] = [{ key: 'Content-Length', value: watermarkedImage.length.toString() }];
  }

  callback(null, response);
};

Используя AWS Lambda@Edge и CloudFront, вы можете оптимизировать доставку изображений, сжимая, изменяя размер, оптимизируя и даже добавляя водяные знаки к изображениям на лету. Эти методы помогают повысить производительность, снизить использование полосы пропускания и улучшить взаимодействие с пользователем. Поэкспериментируйте с этими методами, чтобы найти оптимальную комбинацию для вашего конкретного случая использования, и вы увидите, как скорость доставки изображений ускорится!