Генератор сценариев сжатия Lambda@Edge
Создайте готовую к использованию функцию Lambda@Edge, которая добавляет сжатие Brotli и GZIP к ответам CloudFront — для источников, которые не поддерживают сжатие изначально. Настройте тип события (Ответ источника или Ответ зрителя), алгоритм сжатия и дополнительные заголовки. Генератор сценариев сжатия Lambda@edge создает код функции, политику доверия IAM, политику выполнения IAM и пошаговые команды развертывания AWS CLI. Вся генерация происходит в вашем браузере без необходимости регистрации.
Lambda@Edge Compression Script Generator
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. Настройте параметры: выберите тип события CloudFront (Ответ источника или Ответ зрителя), среду выполнения Node.js, алгоритм сжатия (предпочтительно Brotli, только GZIP или только Brotli) и дополнительные функции, такие как Vary заголовки, Cache-Control и заголовки безопасности. Генератор сценариев сжатия Lambda@edge обновляет выходные данные в режиме реального времени.
- 2. Скопируйте сценарий, политики IAM и шаги развертывания. Генератор выдает четыре выходных данных: код функции (index.js), политику доверия IAM, политику выполнения IAM и команды развертывания AWS CLI. Вся генерация происходит в вашем браузере — никакие данные никуда не отправляются.
- 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.