DNS и CDN: Route 53, CloudFront и ACM на краю сети
Route 53 + CloudFront + ACM — это край пути запроса. ALIAS на апексе, верная политика маршрутизации и TTL, ориджин под замком OAC и сертификат в us-east-1 превращают четыре движущиеся части в одну быструю парадную дверь с готовым failover.
Команда переключается на новый балансировщик в пятницу. У старой DNS-записи TTL в 24 часа, выставленный годы назад и ни разу не пересмотренный. В 10 утра они меняют запись, видят, что их собственные ноутбуки резолвятся на новый эндпойнт, и считают дело сделанным. А потом все выходные капают тикеты в поддержку: часть пользователей всё ещё бьётся в мёртвый балансировщик — резолверы по всему миру держат старый ответ ровно тот день, что им пообещал TTL. Хуже того, апекс example.com был подделан в CNAME хаком у регистратора, так что половина плана failover оказалась нелегальным DNS, который часть резолверов молча отбрасывала. Решение было невзрачным и структурным: ALIAS-запись на апексе, TTL в 60 секунд на всём, что может переехать, и failover-запись с health-check, чтобы следующее переключение сливало трафик само. DNS — это не конфигурация, которую выставляют один раз; это самый медленный кэш во всей твоей системе, и он кэширует твои ошибки.
Route 53: авторитативный DNS, ALIAS и политики маршрутизации
Прежде чем выбирать политику маршрутизации или выставлять TTL, разберись с одним типом записи, который AWS придумал специально для апекса зоны — и почему стандартная альтернатива там нелегальна.
Route 53 — управляемый авторитативный DNS от AWS: он отвечает на «какой IP у example.com?» для доменов, чьей hosted zone (хостинг-зоной, контейнером записей домена) ты владеешь. Hosted zone — контейнер записей домена; она может быть публичной (резолвится в интернете) или приватной (резолвится только внутри связанных VPC, для внутреннего service discovery). Внутри ты пишешь обычные типы записей: A (имя в IPv4), AAAA (имя в IPv6), CNAME (имя в другое имя), MX, TXT и так далее.
Подвох, на который натыкается каждая команда: нельзя поставить CNAME на апексе зоны. Апекс — это сам голый домен example.com, а спецификация DNS запрещает CNAME сосуществовать с записями SOA/NS, которые обязаны там жить. Поэтому нельзя сделать CNAME с апекса на хостнейм CloudFront или ALB — только поддомен вроде www.example.com может быть CNAME. Ответ Route 53 — ALIAS-запись, AWS-специфичное расширение. ALIAS на апексе отображает example.com прямо на ресурс AWS — дистрибуцию CloudFront, ALB/NLB, S3-бакет как статический сайт, API Gateway, App Runner — и Route 53 резолвит его в текущие IP ресурса в момент запроса. Три вещи делают ALIAS строго лучше CNAME здесь: он легален на апексе, AWS не берёт плату за ALIAS-запросы к ресурсам AWS (за CNAME-запросы платишь), и он сам отслеживает смену IP цели, так что IP руками править не приходится.
; Апекс зоны - ALIAS, не CNAME (CNAME тут нелегален)
example.com. A ALIAS d111abcdef8.cloudfront.net. ; без TTL - берёт у цели
; Поддомен - CNAME здесь подходит
www.example.com. CNAME example.com. ; 300
; Failover-пара с health-check (active / passive)
api.example.com. A ALIAS primary-alb.elb.amazonaws.com. ; Failover=PRIMARY + health check
api.example.com. A ALIAS dr-alb.elb.amazonaws.com. ; Failover=SECONDARY
; Запись, которую может понадобиться переместить - держи TTL низким
edge.example.com. A 203.0.113.10 ; 60Политика маршрутизации решает, какой ответ Route 53 вернёт, когда имя делят несколько записей. Simple возвращает один фиксированный ответ. Weighted делит трафик по целочисленным весам — рычаг канарейки: пусти 95/5 на новую версию, потом подкручивай. Latency-based направляет каждого пользователя в тот AWS-регион, что даёт наименьшую измеренную задержку от его резолвера. Geolocation маршрутизирует по континенту/стране пользователя (комплаенс, локализованный контент). Failover связывает первичную и вторичную записи через health-check: когда health-check первичной падает, Route 53 перестаёт её возвращать и отдаёт вторичную — именно это заставляет переключение выше сливать трафик само. Multivalue answer возвращает до восьми здоровых записей случайно — балансировщик для бедных с учётом здоровья записей. (Ещё у Route 53 есть geoproximity и IP-based политики.)
▸Почему это работает
TTL — это весь компромисс DNS в одном числе. Резолвер кэширует твой ответ на TTL секунд и не спросит снова, пока он не истечёт, — так что высокий TTL (скажем, 86400, сутки) означает меньше запросов и ниже стоимость Route 53, но failover или переключение доходит до всех вплоть до целых суток. Низкий TTL (60с) делает failover и миграции почти мгновенными, но множит объём запросов. Ход сеньора: держи низкий TTL на всём, что может переехать или зафейловиться, и сбрось TTL за дни до плановой миграции, чтобы кэши уже были короткими к моменту переключения. Для ALIAS-записей на ресурс AWS TTL вообще не задаёшь — Route 53 берёт дефолт ресурса и отслеживает его IP за тебя.
CloudFront и ACM: кэш и сертификат
Представь, что 50 000 пользователей одновременно запрашивают один и тот же статический ресурс. Без CDN каждый запрос пролетает через океан до твоего EC2. Именно эту проблему решает CloudFront — а OAC не даёт обойти CDN и ударить в ориджин напрямую.
CloudFront — глобальный CDN (Content Delivery Network, сеть доставки контента) от AWS. Он держит флот edge-локаций (точек присутствия) по всему миру; запрос пользователя приземляется на ближайший edge, который отдаёт из кэша, если может, и идёт назад к твоему ориджину (S3, ALB, любой HTTP-сервер) только при промахе. Это срезает и задержку (байты приходят с edge рядом с пользователем), и нагрузку на ориджин (edge поглощает повторный трафик). У дистрибуции есть одно или несколько поведений (behaviors), отображающих шаблоны путей на ориджины и настройки кэша — например, /* на ориджин приложения и /static/* на S3-ориджин с долгим кэшем. Что и насколько долго кэширует CloudFront, управляется ключом кэша плюс TTL: заголовки Cache-Control/Expires ориджина задают свежесть на объект, ограниченную min/default/max TTL поведения. Чтобы вычистить устаревший контент до истечения, ты выпускаешь инвалидацию (invalidation) на путь; первые 1000 путей инвалидации в месяц бесплатны, сверх — тарифицируются (цены зависят от региона/использования — см. страницу цен CloudFront). Ещё можно гонять код на edge: CloudFront Functions для лёгких правок заголовков/URL и Lambda@Edge для более тяжёлой логики на запрос.
Чтобы люди не обходили CDN и не били прямо в бакет, закрой ориджин через Origin Access Control (OAC). S3-бакет остаётся полностью приватным (публичный доступ заблокирован); его bucket policy даёт s3:GetObject сервис-принципалу CloudFront cloudfront.amazonaws.com, суженному условием AWS:SourceArn до именно твоей дистрибуции. Теперь единственный путь к объектам — через эту дистрибуцию, а прямые URL s3.amazonaws.com возвращают 403. OAC — актуальный механизм, он поддерживает все регионы, SSE-KMS и PUT/DELETE; легаси Origin Access Identity (OAI) оставлен лишь для миграции.
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowCloudFrontOAC",
"Effect": "Allow",
"Principal": { "Service": "cloudfront.amazonaws.com" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-private-site/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/E1ABCDEF2GHIJK"
}
}
}]
}ACM (AWS Certificate Manager) выпускает бесплатные публичные TLS-сертификаты и автопродлевает их, а интегрируется напрямую с CloudFront и ALB, так что приватного ключа ты не касаешься. Одно жёсткое правило цепляет всех: сертификат для HTTPS между зрителями и CloudFront обязан жить в регионе us-east-1 (N. Virginia), где бы ни работал твой ориджин — CloudFront глобален и читает viewer-сертификаты только оттуда. (Сертификат ACM для ALB живёт в собственном регионе ALB.) Сложи всё — и канонической парадной дверью статического сайта будет: Route 53 ALIAS на апексе на CloudFront, CloudFront терминирует TLS сертификатом ACM в us-east-1 и достаёт приватный S3-ориджин через OAC.
| Политика маршрутизации | Возвращает | Health-check? | Бери, когда |
|---|---|---|---|
| Simple | Один фиксированный ответ | Нет | Один ресурс, без вариаций |
| Weighted | Ответ по целочисленному весу | Опционально | Канарейка / плавный раскат (95/5) |
| Latency-based | Регион с наим. задержкой для пользователя | Опционально | Мульти-регион active-active, скорость |
| Geolocation | Ответ по стране/континенту пользователя | Опционально | Комплаенс, локализованный контент |
| Failover | Первичная, иначе вторичная | Обязателен на первичной | Active-passive DR-переключение |
| Multivalue | До 8 здоровых записей, случайно | На запись | Дешёвый разброс с учётом здоровья |
Ты держишь идентичные стеки приложения в us-east-1 и eu-west-1, каждый за своим ALB, и хочешь, чтобы каждый пользователь попадал в самый быстрый для него регион - а регион, ставший нездоровым, переставал получать трафик. Выбери политику маршрутизации Route 53.
Нужно, чтобы голый домен example.com указывал на дистрибуцию CloudFront. Какую запись создаёшь?
Твоя дистрибуция CloudFront отдаёт приватный S3-бакет через OAC, но люди сообщают, что всё ещё качают объекты, бьясь прямо по URL s3.amazonaws.com. Что не так?
- 01Почему нельзя сделать CNAME с апекса на CloudFront, что используешь вместо и какие три преимущества это даёт?
- 02Опиши парадную дверь статического сайта под замком OAC от и до, включая подводные камни TTL и региона ACM.
Край пути запроса — это три управляемых сервиса, работающих вместе. Route 53 — авторитативный DNS: hosted zone (публичная или приватная) держит твои записи, и правило, которое все узнают на собственной шкуре, — что CNAME нелегален на апексе зоны, поэтому ты используешь AWS-специфичную ALIAS-запись, чтобы указать голый домен на дистрибуцию CloudFront, ALB или S3-бакет — ALIAS бесплатен для целей AWS, отслеживает их IP и легален на апексе. Политика маршрутизации выбирает ответ: simple для одного ресурса, weighted для канареек, latency-based для ближайшего региона, geolocation для комплаенса, failover с health-check для active-passive DR, multivalue для разброса с учётом здоровья; а TTL — это ручка между быстрым failover (низкий) и меньшим числом запросов (высокий), так что держи его низким на всём, что переезжает. CloudFront кэширует контент на edge-точках присутствия перед твоим ориджином, срезая задержку и нагрузку; behaviors отображают пути на ориджины, ключ кэша плюс min/default/max TTL правят свежестью, инвалидации чистят раньше срока, а OAC закрывает приватный S3-ориджин так, чтобы читать могла только твоя дистрибуция. ACM выпускает бесплатные автопродлеваемые TLS-сертификаты, но тот, что для CloudFront, обязан жить в us-east-1. Инстинкт сеньора — относиться к DNS как к самому медленному кэшу, которым владеешь: выставь ALIAS на апексе, верную политику, низкий TTL, ориджин под замком OAC и сертификат в us-east-1 — и парадная дверь останется быстрой и зафейловится сама. Теперь, когда будешь планировать переключение, первый шаг — снизить TTL за несколько дней, чтобы кэши уже успели дренировать к моменту, когда перевернёшь запись.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.