Налаштування AWS CloudFront CDN під ключ
При запуску сайту на AWS глобальні користувачі часто стикаються з довгим завантаженням. TTFB вище 500 мс, LCP зашкалює, а сервер не справляється з піковим навантаженням. Без CDN це норма. Ми налаштовуємо AWS CloudFront так, що час відгуку скорочується в 2-3 рази, а навантаження на origin падає на 90%. Наш досвід — багаторічна робота з AWS, численні проекти, сертифіковані інженери. Ми гарантуємо 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







