Перейти к содержимому
Aback Tools Logo

Генератор сценариев сжатия Lambda@Edge

Создайте готовую к использованию функцию Lambda@Edge, которая добавляет сжатие Brotli и GZIP к ответам CloudFront — для источников, которые не поддерживают сжатие изначально. Настройте тип события (Ответ источника или Ответ зрителя), алгоритм сжатия и дополнительные заголовки. Генератор сценариев сжатия Lambda@edge создает код функции, политику доверия IAM, политику выполнения IAM и пошаговые команды развертывания AWS CLI. Вся генерация происходит в вашем браузере без необходимости регистрации.

Lambda@Edge Compression Script Generator

Configure the options below to generate a Lambda@Edge function that adds Brotli and GZIP compression to CloudFront responses. The lambda@edge compression script generator produces the function code, IAM trust policy, IAM execution policy, and deployment steps. All generation happens in your browser - no signup required.

Node.js 20.x is recommended. Lambda@Edge supports Node.js 18.x and 20.x.

Response Headers

Skip Conditions

/**
 * Lambda@Edge Compression Script
 * Event type: origin-response
 * Runtime: nodejs20.x
 * Generated by AbackTools - https://abacktools.com
 */

'use strict';

// Content types that benefit from compression
const COMPRESSIBLE_TYPES = [
  'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
  'application/javascript', 'application/x-javascript', 'application/json',
  'application/ld+json', 'application/xml', 'application/rss+xml',
  'application/atom+xml', 'image/svg+xml', 'font/ttf', 'font/otf',
];

// Already-compressed formats - skip to avoid overhead
const SKIP_TYPES = [
  'image/jpeg', 'image/png', 'image/webp', 'image/avif', 'image/gif',
  'image/bmp', 'video/mp4', 'video/webm', 'audio/mpeg', 'audio/ogg',
  'application/zip', 'application/gzip', 'application/x-brotli',
  'font/woff2',
];

exports.handler = async (event) => {
  const { request, response } = event.Records[0].cf;

  // Get the Accept-Encoding header from the viewer request
  const acceptEncoding =
    (request.headers['accept-encoding'] || [{ value: '' }])[0].value.toLowerCase();

  // Get the Content-Type of the response
  const contentType =
    (response.headers['content-type'] || [{ value: '' }])[0].value.split(';')[0].trim().toLowerCase();

  // Skip if already compressed
  const alreadyEncoded = response.headers['content-encoding'];
  if (alreadyEncoded && alreadyEncoded[0]?.value) {
    return response;
  }

  // Skip already-compressed content types
  if (SKIP_TYPES.some(t => contentType.startsWith(t))) {
    return response;
  }

  // Only compress compressible content types
  const isCompressible = COMPRESSIBLE_TYPES.some(t => contentType.startsWith(t));
  if (!isCompressible) {
    return response;
  }

  // Skip small responses (compression overhead not worth it)
  const bodyLength = response.body ? Buffer.byteLength(response.body, 'utf8') : 0;
  if (bodyLength < 1024) {
    return response;
  }

  // Determine the best encoding to use
  let encoding = null;
  if (acceptEncoding.includes('br')) {
    encoding = 'br';
  } else if (acceptEncoding.includes('gzip')) {
    encoding = 'gzip';
  }

  if (!encoding) {
    return response;
  }

  // Compress the response body
  try {
    const zlib = require('zlib');
    const body = Buffer.from(
      response.body,
      response.bodyEncoding === 'base64' ? 'base64' : 'utf8'
    );

    let compressed;
    if (encoding === 'br') {
      compressed = zlib.brotliCompressSync(body, {
        params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 6 },
      });
    } else {
      compressed = zlib.gzipSync(body, { level: 6 });
    }

    // Only use compressed version if it's actually smaller
    if (compressed.length < body.length) {
      response.body = compressed.toString('base64');
      response.bodyEncoding = 'base64';
      response.headers['content-encoding'] = [{ key: 'Content-Encoding', value: encoding }];
      response.headers['content-length'] = [{ key: 'Content-Length', value: String(compressed.length) }];
    }
  } catch (err) {
    console.error('Compression failed:', err);
    // Return uncompressed response on error
  }

  // Add Vary: Accept-Encoding so CloudFront caches separate variants
  const existingVary = (response.headers['vary'] || [{ value: '' }])[0].value;
  if (!existingVary.toLowerCase().includes('accept-encoding')) {
    response.headers['vary'] = [{
      key: 'Vary',
      value: existingVary ? `${existingVary}, Accept-Encoding` : 'Accept-Encoding',
    }];
  }

  // Set Cache-Control for compressed assets
  if (!response.headers['cache-control']) {
    response.headers['cache-control'] = [{
      key: 'Cache-Control',
      value: 'public, max-age=31536000, stale-while-revalidate=86400',
    }];
  }

  return response;
};

Lambda@Edge requirement: Functions must be deployed in us-east-1(N. Virginia) regardless of your CloudFront distribution's origin region. Lambda@Edge does not support environment variables or VPC access.

Зачем использовать наш генератор сценариев сжатия Lambda@Edge?

  • Сценарий мгновенного сжатия Lambda@Edge. Мгновенно создавайте готовую к использованию функцию сжатия Lambda@Edge — не нужно углубляться в документацию AWS или исследовать Node.js zlib API. Наш генератор сценариев сжатия Lambda@edge создает правильно отформатированный код функции, политики IAM и этапы развертывания за считанные секунды.
  • Безопасный онлайн-генератор сценариев сжатия Lambda@Edge: выбранная вами конфигурация никогда не покидает ваше устройство, когда вы используете этот генератор сценариев сжатия Lambda@edge. Все создание скриптов происходит полностью в вашем браузере — никаких запросов к серверу, никакого сохранения данных, 100% конфиденциальность. Безопасно для настройки рабочих дистрибутивов CloudFront.
  • Генератор сценариев сжатия Lambda@Edge — без установки. Создавайте сценарии сжатия Lambda@Edge непосредственно в любом современном браузере без установки AWS CLI, настройки Node.js и учетной записи. Генератор сценариев сжатия Lambda@edge работает в Windows, macOS, Linux и мобильных устройствах.
  • Полный пакет: скрипт, политики IAM и этапы развертывания. Генератор сценариев сжатия Lambda@edge создает все необходимое — код функции, политику доверия IAM, политику выполнения IAM и пошаговые команды развертывания AWS CLI. Включает предупреждения в режиме реального времени о распространенных ошибках конфигурации, таких как отсутствие заголовков Vary.

Распространенные случаи использования генератора сценариев сжатия Lambda@Edge

  • Сжатие дистрибутива CloudFront. Добавьте сжатие Brotli и GZIP в дистрибутив CloudFront, который обслуживает контент из корзины S3 или пользовательского источника, не поддерживающего сжатие. Генератор сценариев сжатия Lambda@edge создает функцию Origin Response, которая сжимает ответы до того, как CloudFront их кэширует, поэтому сжатие выполняется один раз при каждом промахе в кэше, а не при каждом запросе.
  • API Gateway + CloudFront Compression: сжатие ответов API Gateway, передаваемых через CloudFront. API Gateway поддерживает GZIP, но не Brotli — генератор сценариев сжатия Lambda@edge добавляет поддержку Brotli для современных браузеров, но при этом возвращается к GZIP для устаревших клиентов, улучшая размер передаваемых ответов API на 15-25% по сравнению с одним GZIP.
  • Статическое сжатие сайта S3. Добавьте динамическое сжатие к статическому сайту, размещенному на S3 и обслуживаемому через CloudFront. S3 не сжимает ответы — генератор сценариев сжатия Lambda@edge добавляет функцию Origin Response, которая сжимает HTML, CSS, JavaScript и JSON перед тем, как CloudFront кэширует сжатую версию.
  • Оптимизация CDN в нескольких регионах. Сократите затраты на полосу пропускания во всех периферийных местоположениях CloudFront за счет сжатия ответов в источнике. Генератор сценариев сжатия Lambda@edge создает функцию, которая запускается в us-east-1, но выполняется в периферийных местоположениях CloudFront по всему миру, что сокращает размер передачи на 60–80 % для текстового контента.
  • Обновление устаревшего исходного сжатия: добавьте сжатие Brotli на устаревший исходный сервер, который поддерживает только GZIP или не поддерживает сжатие. Генератор сценариев сжатия Lambda@edge перехватывает события Origin Response и применяет сжатие Brotli для современных браузеров — никаких изменений на исходном сервере не требуется.
  • Заголовки безопасности + пакет сжатия: объедините сжатие с заголовками безопасности в одной функции Lambda@Edge. Генератор сценариев сжатия Lambda@edge дополнительно добавляет заголовки X-Content-Type-Options, X-Frame-Options и X-XSS-Protection наряду со сжатием, что сокращает количество функций Lambda@Edge, необходимых для каждого поведения CloudFront.

Что такое сжатие Lambda@Edge?

Lambda@Edge — это сервис AWS, который запускает функции Node.js в периферийных местоположениях CloudFront по всему миру. Функция сжатия Lambda@Edge перехватывает ответы CloudFront и применяет сжатие GZIP или Brotli перед тем, как ответ будет кэширован или доставлен зрителю. Это полезно, когда ваш исходный сервер (S3, шлюз API, EC2 или пользовательский сервер) не поддерживает сжатие — функция Lambda@Edge прозрачно добавляет сжатие на уровне CDN. Наш генератор сценариев сжатия Lambda@edge создает полную функцию Node.js с использованием встроенного модуля zlib (без внешних зависимостей), который обрабатывает согласование Accept-Encoding, фильтрацию типов контента, управление заголовками Vary и заголовки Cache-Control.

Как работает наш генератор сценариев сжатия Lambda@Edge

  1. 1. Настройте параметры: выберите тип события CloudFront (Ответ источника или Ответ зрителя), среду выполнения Node.js, алгоритм сжатия (предпочтительно Brotli, только GZIP или только Brotli) и дополнительные функции, такие как Vary заголовки, Cache-Control и заголовки безопасности. Генератор сценариев сжатия Lambda@edge обновляет выходные данные в режиме реального времени.
  2. 2. Скопируйте сценарий, политики IAM и шаги развертывания. Генератор выдает четыре выходных данных: код функции (index.js), политику доверия IAM, политику выполнения IAM и команды развертывания AWS CLI. Вся генерация происходит в вашем браузере — никакие данные никуда не отправляются.
  3. 3. Разверните на AWS и свяжитесь с CloudFront. Создайте функцию Lambda в us-east-1, опубликуйте версию и свяжите ее с вашим поведением распространения CloudFront. На вкладке «Шаги развертывания» представлены точные команды AWS CLI с заполнителями для идентификатора вашей учетной записи и идентификатора распространения.

Ответ источника и ответ зрителя

  • Ответ источника (рекомендуется): запускается после того, как CloudFront получит ответ от источника, прежде чем он будет кэширован. Сжатый ответ хранится в кеше CloudFront — последующие запросы к тому же объекту обслуживаются из кеша без вызова функции Lambda. Это наиболее экономичный подход: сжатие выполняется один раз при каждом промахе в кэше.
  • Ответ средства просмотра: выполняется до того, как CloudFront отправит ответ средству просмотра, после поиска в кэше. Это означает, что функция Lambda запускается при каждом запросе, включая попадания в кеш. Используйте ответ зрителя только в том случае, если вам нужно изменить ответы, которые уже кэшированы, или когда вам нужно добавить заголовки для каждого зрителя, которые не могут быть кэшированы.
  • Ограничения Lambda@Edge: функции должны быть развернуты в us-east-1. Максимальное время выполнения: 5 секунд (Просмотр) или 30 секунд (Origin). Максимальный размер тела ответа: 1 МБ (Просмотр) или 1 МБ (Origin). Никаких переменных среды или доступа к VPC. Никаких внешних пакетов npm — используйте только встроенные модули Node.js.
  • Сжатие CloudFront и Lambda@Edge: CloudFront имеет встроенную функцию сжатия (включенную в настройках распространения), которая поддерживает GZIP и Brotli. По возможности используйте встроенное сжатие CloudFront — оно бесплатное и не требует затрат на вызов Lambda. Используйте сжатие Lambda@Edge только в том случае, если вам нужна специальная логика (фильтрация типов контента, заголовки безопасности или сжатие для источников, которые отправляют неправильные заголовки Content-Type).

Важные ограничения Lambda@Edge

Функции Lambda@Edge имеют строгие ограничения: они должны быть развернуты в регионе us-east-1 (Северная Вирджиния) независимо от региона вашего происхождения. Они не могут использовать переменные среды, соединения VPC или внешние пакеты npm — сгенерированный скрипт использует только встроенный модуль zlib Node.js. Максимальный размер тела ответа составляет 1 МБ. Ответы размером более 1 МБ не могут быть изменены с помощью Lambda@Edge. Для больших ответов рассмотрите возможность использования функций CloudFront (только для манипуляций с заголовками) или вместо этого включите встроенное сжатие CloudFront. Lambda@Edge также имеет задержку холодного запуска 100–500 мс при первом вызове в каждом граничном местоположении.

Часто задаваемые вопросы

Генератор сценариев сжатия Lambda@edge создает готовую к развертыванию функцию Node.js для AWS Lambda@Edge, которая добавляет сжатие Brotli и GZIP к ответам CloudFront. Наш бесплатный онлайн-генератор сценариев сжатия Lambda@edge создает код функции, политику доверия IAM, политику выполнения IAM и этапы развертывания AWS CLI.

Используйте сжатие Lambda@Edge, когда ваш источник отправляет неправильные заголовки Content-Type, когда вам нужна фильтрация настраиваемого типа контента, когда вы хотите объединить сжатие с заголовками безопасности или когда вам нужно сжатие для источников, которые встроенное сжатие CloudFront не поддерживает.

Используйте Origin Response — он запускается один раз при каждом промахе в кэше и сохраняет сжатый ответ в кеше CloudFront. Viewer Response запускается при каждом запросе, включая попадания в кэш, что значительно дороже и увеличивает задержку для каждого ответа.

Да. Вся генерация скриптов полностью выполняется в вашем браузере с использованием JavaScript. Никакие данные конфигурации не отправляются на какой-либо сервер, не сохраняются удаленно и не передаются по сети.

Да – 100% бесплатно, навсегда. Без регистрации, без учетной записи, без премиум-уровня и без рекламы. Создавайте неограниченное количество сценариев сжатия Lambda@Edge совершенно бесплатно.

AWS требует, чтобы все функции Lambda@Edge были созданы в регионе us-east-1 (Северная Вирджиния). AWS автоматически реплицирует эту функцию во все периферийные местоположения CloudFront по всему миру, когда вы связываете ее с дистрибутивом.

Сгенерированный скрипт использует только встроенный модуль zlib Node.js — внешние пакеты не требуются. Благодаря этому размер пакета развертывания не превышает 1 КБ. Lambda@Edge поддерживает пакеты npm, если вы развертываете ZIP-архив с помощью node_modules, но для простоты предпочтительнее использовать встроенные модули.

Lambda@Edge может изменять только тела ответа размером до 1 МБ. Ответы размером более 1 МБ возвращаются без изменений. Для больших ответов используйте встроенное сжатие CloudFront или сжимайте на исходном сервере.

Проверьте с помощью Curl: "curl -H "Accept-Encoding: br, gzip" -I https://your-cloudfront-domain.com/". Найдите Content-Encoding: br или Content-Encoding: gzip в заголовках ответов. Проверьте журналы CloudWatch в us-east-1 на наличие журналов выполнения Lambda@Edge.