CloudFront Functions: быстрый код на краю CDN

Что такое CloudFront Functions
CloudFront Functions — это способ запускать небольшие JavaScript-функции непосредственно на краю CDN Amazon CloudFront (edge), ближе к пользователю. Функции оптимизированы для сверхнизкой задержки и очень недороги по сравнению с Lambda@Edge, но имеют жёсткие лимиты по времени выполнения, памяти и размеру кода.
Определение в одну строку: лёгкая среда выполнения JavaScript для быстрых трансформаций HTTP-запросов и ответов на узлах CloudFront.
Ключевые возможности:
- Запуск на всех узлах CloudFront с минимальной задержкой.
- Поддержка работы на событиях viewer-request и viewer-response.
- Ограниченный пакет: максимум 10 KB кода и 2 MB памяти.
- Процессная модель изоляции, минимум файловой и сетевой подсистемы.
Сравнение: CloudFront Functions vs Lambda@Edge
- Цена: CloudFront Functions примерно в 1/6 стоимости Lambda@Edge для эквивалентных кратких операций.
- Возможности: Lambda@Edge поддерживает полноценный Node.js Lambda runtime, доступ к сети/файловой системе более гибкий; CloudFront Functions — только лёгкий JS и ограниченный API.
- События: CloudFront Functions доступны на viewer-request и viewer-response; Lambda@Edge может работать также на origin-request и origin-response, что позволяет модифицировать контент перед кэшированием.
Когда выбрать CloudFront Functions:
- Простейшие трансформации URL и заголовков.
- Быстрые авторизации на уровне запроса (например, проверка токенов).
- Нормализация ключей кэша и A/B тестирование редиректами.
Когда выбрать Lambda@Edge:
- Необходима модификация Origin Response (контента до кэша).
- Требуется доступ к внешним ресурсам или длительная обработка.
- Нужно больше памяти или богатый runtime.
Important: если задача требует изменения ответа от origin перед кэшированием, CloudFront Functions не подойдёт — используйте Lambda@Edge.

Ограничения и практические числа
Fact box — ключевые ограничения:
- Максимальный пакет кода: 10 KB.
- Память процесса: ~2 MB.
- Рекомендуемое время выполнения: < 1 ms (максимум — очень короткое время, оптимизировано для миллисекунд).
- Поддерживаемые события: viewer-request, viewer-response.
- Логирование: console.log() → CloudWatch.
Эти ограничения делают функции подходящими для быстрых манипуляций с заголовками, URL и единой проверкой авторизации, но не для тяжёлой бизнес-логики.
Когда это не сработает — примеры
- Нужна модификация HTML/JSON-ответа от origin перед кэшированием.
- Требуется подключение к базе данных или внешнему API из функции.
- Необходимо исполнять криптографические операции, требующие больших библиотек или памяти.
Краткая методология: как выбрать подход
- Опишите задачу (одно предложение). Если задача — строковая манипуляция запроса/заголовка → CloudFront Functions вероятно подходит.
- Оцените зависимость от внешних ресурсов и объём выполнения. Если нужна сеть/файлы → Lambda@Edge.
- Проверяйте ограничения кода (10 KB) и тестируйте производительность на высоких QPS.
flowchart TD
A[Нужна модификация запроса/ответа?] --> B{Требуется доступ к origin-response или внешним ресурсам?}
B -- Да --> C[Lambda@Edge]
B -- Нет --> D{Манипуляция простая 'заголовки, URL, редиректы'?}
D -- Да --> E[CloudFront Functions]
D -- Нет --> CПошаговое руководство: создание и развёртывание
- Убедитесь, что у вас есть распределение CloudFront. Если нет — настройте CloudFront в консоли или через IaC (CloudFormation/Terraform).
- В консоли CloudFront слева выберите “Functions” и нажмите “Create function”.

- Дайте функции имя, откроется редактор кода, где можно писать, тестировать и публиковать функцию.

- Пример простой тестовой функции (в демонстрационных примерах функция переведёт любой ответ в 404 — чисто для теста):
function handler(event) {
var response = event.response || { statusCode: 200, statusDescription: 'OK', headers: {} };
response.statusCode = 404;
response.statusDescription = 'Not Found';
return response;
}- Нажмите “Save” для сохранения редакционной версии, затем перейдите к тестированию. В тестовом режиме вы можете подставить пример события с URL и заголовками; консоль сделает запрос так, как если бы это был реальный трафик.

- После успешного теста нажмите “Publish” — это создаст продакшн-версию функции.

- Ассоциируйте опубликованную функцию с распределением CloudFront: выберите событие (viewer-request или viewer-response) и укажите функцию. Развёртывание будет глобальным.
Тестирование и логирование
- Логирование ограничено console.log(), данные отправляются в CloudWatch. Добавляйте логирующие вызовы экономно, чтобы не превысить квоты и не влиять на латентность.
console.log('debug:', request.uri, request.headers);- Тестируйте на реальных сценариях: разные географии, горячие и холодные кэши, сочетание cookies и заголовков.
- Инструменты: браузер, curl, заголовок Host для эмуляции запросов, CloudFront тестовые события.
Рекомендации по безопасности и приватности
- Не храните секреты в коде функции. Используйте защищённые хранилища (Secrets Manager) и внешние контроллеры для распространения конфигурации, если нужно.
- Проверяйте входящие заголовки и валидируйте токены строго — функции работают на границе сети, поэтому они первыми встречают трафик.
- Учитывайте законодательство о данных: если вы обрабатываете персональные данные на границе, проверьте требования локальных правил и GDPR.
Notes: так как функция исполняется по всему миру, логирование и обработка персональных данных может подпадать под требования локальных регуляторов.
Ролевая чек-лист для развёртывания
DevOps:
- Настроить распределение CloudFront.
- Проверить IAM-права для создания/публикации функций.
- Настроить CI/CD для версии кода (опционально).
Разработчик:
- Убедиться, что код укладывается в 10 KB.
- Минимизировать зависимости и использовать нативный JS.
- Добавить тестовые события и unit-тесты вне консоли.
QA/Сайт-менеджер:
- Прогнать A/B тестирование и сценарии с разными географиями.
- Проверить логи CloudWatch и латентность.
Плейбук внедрения — минимальный набор шагов
- Прототип в консоли (редактирование + тестирование).
- Публикация и привязка к staging-распределению CloudFront.
- Наблюдение за метриками: latencies, error rates, CloudWatch logs.
- Постепенное продвижение на production по каналу релизов.
- Откат: удалить ассоциацию функции с распределением и, при необходимости, удалить опубликованную версию.
Критерии приёмки
- Функция корректно обрабатывает 100% тестовых сценариев.
- Нагрузка не приводит к увеличению median latency более чем на 1 ms.
- Логи не содержат ошибок выполнения или превышений лимитов.
- Пакет кода < 10 KB и потребление памяти в рамках ожиданий.
Альтернативные подходы
- Использовать Lambda@Edge для сложной обработки origin-response.
- Выполнить предварительную нормализацию запросов на CDN уровне (без кода) с помощью правил перенаправления.
- Перенести бизнес-логику в API Gateway + региональные Lambda для более сложных проверок.
Заключение
CloudFront Functions — отличное решение для лёгких, высокопроизводительных трансформаций HTTP-запросов и ответов на краю сети. Они экономичны, масштабируются мгновенно и превосходно подходят для задач с низкой вычислительной сложностью. При проектировании учитывайте ограничения по размеру и времени, тестируйте в разных географиях и имейте план отката.
Summary:
- Подходит для простых манипуляций заголовками, URL, авторизации на уровне запроса.
- Не заменяет Lambda@Edge для сложных задач или работы с origin-response.
- Тестируйте и логируйте экономно; следите за размерами кода.

Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента