open atlas
↑ К треку
AWS на практике AWS · 04 · 03

DNS и CDN: Route 53, CloudFront и ACM на краю сети

Route 53 + CloudFront + ACM — это край пути запроса. ALIAS на апексе, верная политика маршрутизации и TTL, ориджин под замком OAC и сертификат в us-east-1 превращают четыре движущиеся части в одну быструю парадную дверь с готовым failover.

AWS Middle ◷ 18 min
Уровень
ОсновыJuniorMiddleSenior

Команда переключается на новый балансировщик в пятницу. У старой 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. Что не так?

Вспомните перед уходом
  1. 01
    Почему нельзя сделать CNAME с апекса на CloudFront, что используешь вместо и какие три преимущества это даёт?
  2. 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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.