Настройка AWS CloudFront CDN под ключ
При запуске сайта на AWS глобальные пользователи часто сталкиваются с долгой загрузкой. TTFB выше 500 мс, LCP зашкаливает, а сервер не справляется с пиковой нагрузкой. Без CDN это норма. Мы настраиваем AWS CloudFront так, чтобы время отклика сократилось в 2-3 раза, а нагрузка на origin упала на 90%. Наш опыт — 5+ лет работы с AWS, 50+ проектов, сертифицированные инженеры. Мы гарантируем SLA и круглосуточную поддержку.
Как CloudFront ускоряет загрузку сайта?
CloudFront — CDN от Amazon с 450+ edge-локациями по всему миру. Вместо того чтобы каждый раз ходить к вашему серверу, он отдаёт кешированные копии контента с ближайшего узла. Это радикально снижает TTFB (первые 50 мс) и улучшает Core Web Vitals: LCP, CLS, INP. Кроме того, CloudFront поддерживает HTTP/2, автоматическое сжатие Brotli/Gzip и stale-while-revalidate. Экономия на трафике может достигать 60% благодаря сжатию и кешированию на границе сети.
Типовые политики кеширования для разных типов контента:
| Тип контента | Cache Policy ID | Min/Max TTL | Поведение при ошибке |
|---|---|---|---|
| Статические ассеты (CSS, JS, изображения) | Managed-CachingOptimized |
1 год | stale-while-revalidate |
| HTML-страницы | Кастомная | 5-10 минут | stale-while-revalidate |
| API-запросы | Managed-CachingDisabled |
0 | Не кешировать |
Почему выбирают CloudFront для AWS-инфраструктуры?
CloudFront плотно интегрирован с AWS — S3, ALB, API Gateway, Lambda@Edge. Вы можете:
- Привязать SSL-сертификат через ACM бесплатно.
- Использовать Origin Shield для дополнительного кеша между edge и origin.
- Запускать кастомную логику на Edge Functions (CloudFront Functions или Lambda@Edge) без задержек.
Сравнение с другими CDN:
| Характеристика | CloudFront | Cloudflare | Fastly |
|---|---|---|---|
| Edge-локации | 450+ | 330+ | 50+ |
| Интеграция с AWS | нативная | сторонняя | сторонняя |
| Lambda@Edge | есть | нет | нет |
| Origin Shield | есть | нет | есть (только платный) |
CloudFront лучше всего подходит, если ваша инфраструктура уже на AWS. Он даёт полный контроль над кешированием и безопасностью.
Какие проблемы решает CloudFront на практике?
В одном проекте с 100 000 уникальных посетителей в день мы снизили TTFB с 800 мс до 40 мс после настройки CloudFront с Origin Shield и правильными политиками кеша. Нагрузка на origin упала в 50 раз, а расходы на трафик сократились на 40%. Origin Shield — это второй уровень кеша между edge и origin, который агрегирует запросы и снижает нагрузку. Рекомендуется для проектов с тысячами запросов в секунду.
Процесс настройки CDN
- Аналитика: изучаем архитектуру вашего сайта, определяем, какие ресурсы кешировать, какие API оставить без кеша.
- Проектирование: проектируем distribution, политики кеша, behaviours, origin shield.
- Реализация: пишем Terraform-конфигурацию, настраиваем SSL через ACM, подключаем S3 для статики.
- Тестирование: проверяем заголовки кеша, инвалидацию, скорость загрузки в разных регионах.
- Деплой: деплоим через CI/CD, документируем процесс.
Что входит в работу
- Документация по конфигурации и инструкция для разработчиков.
- Доступы к CloudFront, ACM, S3 с минимальными привилегиями.
- Обучение вашей команды: как управлять кешем, создавать инвалидации.
- Поддержка в течение месяца после запуска — исправляем нештатные ситуации.
- Мониторинг через CloudWatch и настройка алертов по ошибкам и задержкам.
- Отчёт о производительности с метриками TTFB, LCP, CLS до и после внедрения.
Пример конфигурации Terraform
# main.tf — создание CloudFront distribution resource "aws_cloudfront_distribution" "main" { enabled = true is_ipv6_enabled = true default_root_object = "index.html" price_class = "PriceClass_200" # Основной origin — Laravel на EC2/ALB origin { domain_name = aws_lb.main.dns_name origin_id = "alb-origin" custom_origin_config { http_port = 80 https_port = 443 origin_protocol_policy = "https-only" origin_ssl_protocols = ["TLSv1.2"] } custom_header { name = "X-Origin-Verify" value = var.origin_verify_token } } # S3 origin для статических файлов origin { domain_name = aws_s3_bucket.assets.bucket_regional_domain_name origin_id = "s3-assets" origin_access_control_id = aws_cloudfront_origin_access_control.main.id origin_shield { enabled = true origin_shield_region = "eu-central-1" } } # Статические ассеты с S3 ordered_cache_behavior { path_pattern = "/assets/*" target_origin_id = "s3-assets" viewer_protocol_policy = "redirect-to-https" allowed_methods = ["GET", "HEAD"] cached_methods = ["GET", "HEAD"] compress = true cache_policy_id = aws_cloudfront_cache_policy.assets.id } # API — без кеша ordered_cache_behavior { path_pattern = "/api/*" target_origin_id = "alb-origin" viewer_protocol_policy = "https-only" allowed_methods = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"] cached_methods = ["GET", "HEAD"] cache_policy_id = data.aws_cloudfront_cache_policy.caching_disabled.id origin_request_policy_id = data.aws_cloudfront_origin_request_policy.all_viewer.id } # Основные страницы — короткий кеш default_cache_behavior { target_origin_id = "alb-origin" viewer_protocol_policy = "redirect-to-https" allowed_methods = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"] cached_methods = ["GET", "HEAD"] compress = true cache_policy_id = aws_cloudfront_cache_policy.pages.id } restrictions { geo_restriction { restriction_type = "none" } } viewer_certificate { acm_certificate_arn = aws_acm_certificate.main.arn ssl_support_method = "sni-only" minimum_protocol_version = "TLSv1.2_2021" } } # Cache Policy для статических ассетов resource "aws_cloudfront_cache_policy" "assets" { name = "assets-immutable" min_ttl = 31536000 max_ttl = 31536000 default_ttl = 31536000 parameters_in_cache_key_and_forwarded_to_origin { cookies_config { cookie_behavior = "none" } headers_config { header_behavior = "none" } query_strings_config { query_string_behavior = "none" } enable_accept_encoding_brotli = true enable_accept_encoding_gzip = true } } Инвалидация кеша при деплое
# AWS CLI: инвалидировать всё aws cloudfront create-invalidation \ --distribution-id $DISTRIBUTION_ID \ --paths "/*" # Только HTML-страницы (после публикации контента) aws cloudfront create-invalidation \ --distribution-id $DISTRIBUTION_ID \ --paths "/blog/*" "/products/*" "/" // Laravel: инвалидация при публикации статьи use Aws\CloudFront\CloudFrontClient; class ArticlePublished { public function handle(Article $article): void { $client = new CloudFrontClient([ 'version' => 'latest', 'region' => 'us-east-1', ]); $client->createInvalidation([ 'DistributionId' => config('services.cloudfront.distribution_id'), 'InvalidationBatch' => [ 'Paths' => ['Quantity' => 1, 'Items' => ["/blog/{$article->slug}"]], 'CallerReference' => (string) now()->timestamp, ], ]); } } CloudFront Functions — безопасность на edge
// function.js — добавляет security headers (< 1 мс) function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubDomains; preload' }; headers['x-content-type-options'] = { value: 'nosniff' }; headers['x-frame-options'] = { value: 'SAMEORIGIN' }; headers['referrer-policy'] = { value: 'strict-origin-when-cross-origin' }; return response; } resource "aws_cloudfront_function" "security_headers" { name = "security-headers" runtime = "cloudfront-js-2.0" code = file("function.js") publish = true } Origin Shield
Дополнительный промежуточный кеш между edge-узлами и origin-сервером. Уменьшает нагрузку на origin в 10–50 раз для популярного контента. Включён в примере выше.
Подробнее о конфигурации Origin Shield
Origin Shield включается в блоке origin. Выбирайте регион, ближайший к вашему origin. Для Европы — eu-central-1, для США — us-east-1. Это снизит задержки и сделает кеш более эффективным.Сроки и стоимость
Базовая настройка занимает 1-2 дня. Сложные сценарии с Lambda@Edge и Origin Shield — до 5 дней. Точную стоимость рассчитываем индивидуально после анализа вашей инфраструктуры. Оценим ваш проект за 1 день — свяжитесь, и мы подготовим предложение. Получите консультацию по настройке CloudFront уже сегодня.
Подробнее: CloudFront Documentation, CDN







