Настройка 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







