VPC и подсети: CIDR, маршрутизация и ловушка egress через NAT
VPC — изолированная виртуальная сеть, задаваемая через CIDR; подсети режут её по AZ, а «публичная» против «приватной» решается маршрутизацией, а не флагом. Освой IGW, NAT и gateway-эндпоинты — или получи пятизначный счёт за egress.
Дата-команда гоняет ночной Spark-джоб в приватной подсети, читающий и пишущий терабайты в S3. Год всё работает безупречно. Потом финансы пересылают счёт AWS с одной строкой, обведённой красным: десятки тысяч долларов под «NAT Gateway — data processing». Код никто не менял. Произошло вот что: каждый байт в S3 всё это время маршрутизировался через NAT Gateway, а NAT берёт плату за обработку данных по гигабайтам поверх почасовой ставки. Этому трафику NAT вообще не был нужен — у S3 есть бесплатный VPC Gateway Endpoint, который полностью уводит его мимо NAT. Одна запись в таблице маршрутизации, добавленная за пять минут, стёрла эту строку из счёта. Урок жёсткий и частый: в VPC то, куда идут твои пакеты, решается маршрутизацией, которую настроил ты, и неверный маршрут по умолчанию — это молчаливый счёт.
CIDR, подсети и правило «одна AZ»
К концу этого раздела ты будешь точно знать, какие именно две вещи делают подсеть «публичной» — и почему неверный ответ стоит денег каждый час.
VPC (Virtual Private Cloud, виртуальное приватное облако) — логически изолированная виртуальная сеть, которую ты выделяешь внутри AWS-региона. Её адресное пространство ты задаёшь блоком CIDR, например 10.0.0.0/16 — это даёт 65 536 приватных IPv4-адресов для раздачи. Ничто внутри одной VPC не достучится до другой VPC или интернета, пока ты явно не проложишь путь; изоляция — это поведение по умолчанию.
Ресурсы ты кладёшь не прямо в VPC — ты кладёшь их в подсети, которые режут CIDR VPC на меньшие диапазоны вроде 10.0.1.0/24. Самый важный структурный факт: подсеть целиком живёт в одной зоне доступности (AZ) и не может охватывать несколько AZ. AZ — это изолированный кластер дата-центров, поэтому если ты разместишь все подсети в одной AZ и у этой AZ случится сбой, весь твой слой погаснет. Поэтому высокая доступность не обсуждается: разнеси подсети минимум по двум AZ и держи копию каждого слоя в каждой.
VPC CIDR 10.0.0.0/16 (65 536 IP, один регион)
AZ us-east-1a
public 10.0.0.0/24 веб / балансировщик / NAT
private 10.0.1.0/24 app-серверы, базы данных
AZ us-east-1b
public 10.0.2.0/24
private 10.0.3.0/24CIDR подсети должен быть подмножеством CIDR VPC, и они не могут пересекаться между собой. AWS также резервирует первые четыре и последний IP в каждой подсети, поэтому /24 даёт 251 пригодный адрес, а не 256 — деталь, которая кусает, когда подсеть нарезана впритык под autoscaling-парк. Когда планируешь раскладку CIDR, всегда оставляй запас: /24 выглядит щедро, пока 200 Lambda ENI или EKS-нодпул не начнут расти под нагрузкой.
«Публичная» и «приватная» — это маршрутизация, а не флаг
Нет галочки, которая делает подсеть публичной. Подсеть публична, только если верны две вещи: её связанная таблица маршрутизации отправляет 0.0.0.0/0 (весь трафик в интернет) на Internet Gateway (IGW, интернет-шлюз), и у инстансов в ней есть публичные IP-адреса. Убери любое — и та же подсеть фактически приватна. IGW — горизонтально масштабируемый, избыточный компонент VPC, дающий двунаправленную связь с интернетом; AWS не берёт почасовую плату за сам шлюз (ты платишь обычные тарифы за передачу данных).
Каждая подсеть связана ровно с одной таблицей маршрутизации — списком правил назначение → цель, оцениваемых по самому длинному совпадающему префиксу. У каждой таблицы есть неизменяемый локальный маршрут для CIDR VPC, именно он позволяет любой подсети говорить с любой другой подсетью внутри VPC без дополнительной настройки.
# Таблица маршрутизации публичной подсети
Назначение Цель
10.0.0.0/16 local # внутри VPC, всегда есть
0.0.0.0/0 igw-0abc123 # интернет, в обе стороны
# Таблица маршрутизации приватной подсети
Назначение Цель
10.0.0.0/16 local
0.0.0.0/0 nat-0def456 # только исходящий, через NAT в публичной подсетиNAT Gateway — это как приватные инстансы достукиваются наружу в интернет — за обновлениями ОС, в реестры пакетов, к сторонним API — не будучи доступными из интернета. По документации AWS, инстансы в приватной подсети подключаются наружу через NAT Gateway, но внешние сервисы не могут инициировать соединение обратно. Публичный NAT Gateway обязан жить в публичной подсети и иметь Elastic IP, а его маршрут в итоге отправляет трафик на IGW. Это управляемый, зональный ресурс: он существует в одной AZ.
Ловушка стоимости egress и как эндпоинты её убивают
Вот ловушка, рождающая пятизначные сюрпризы. NAT Gateway тарифицируется по двум осям: почасовая плата за каждый шлюз плюс плата за обработку данных по гигабайтам за каждый прошедший через него байт (цены иллюстративные и зависят от региона — смотри страницу цен Amazon VPC для актуальных ставок). Когда приватный инстанс говорит с S3, DynamoDB или другим высокообъёмным сервисом через дефолтный маршрут 0.0.0.0/0 на NAT, каждый гигабайт облагается этой платой за обработку — и в масштабе терабайтов она перекрывает саму стоимость вычислений.
Решение — VPC Gateway Endpoint. По документации AWS, gateway-эндпоинты дают связь с S3 и DynamoDB «без необходимости в internet gateway или NAT-устройстве», и за их использование нет дополнительной платы. Включаешь ты его выбором таблиц маршрутизации своих приватных подсетей; AWS автоматически добавляет маршрут, у которого назначение — управляемый AWS prefix list для сервиса, а цель — эндпоинт. Поскольку маршрутизация идёт по самому длинному префиксу, трафик в S3 теперь идёт по бесплатному маршруту эндпоинта вместо дефолтного NAT — и целиком остаётся в сети AWS.
Для сервисов без gateway-эндпоинта Interface Endpoints (PrivateLink) ставят ENI в твоей подсети, чтобы трафик к этому сервису не выходил в публичный интернет (у них своя почасовая + поГБ-плата, но они избегают платы NAT за обработку и интернет-пути).
| Компонент пути | Направление | Форма стоимости | Вопрос HA |
|---|---|---|---|
| Internet Gateway | Входящий + исходящий | Нет почасовой платы за шлюз; есть за передачу данных | Региональный, избыточный |
| NAT Gateway | Только исходящий | Почасовая + за ГБ обработки данных | Зональный — по одному на AZ для HA |
| Gateway Endpoint (S3/DynamoDB) | Только к сервису | Без дополнительной платы | На таблицу маршрутизации, без ENI |
| Interface Endpoint (PrivateLink) | Только к сервису | Почасовая + за ГБ (без платы NAT) | По одному ENI на AZ для HA |
▸Почему это работает
Почему у NAT отдельная история про отказ по AZ? NAT Gateway зональный — он живёт ровно в одной AZ. Если ты построишь один NAT Gateway в us-east-1a и направишь приватные таблицы маршрутизации всех AZ на него, ты получишь сразу два режима отказа. Первый: если us-east-1a падает, инстансы в 1b и 1c теряют весь egress, хотя их собственная AZ здорова — единственный NAT это AZ-ограниченная единая точка отказа. Второй: в нормальной работе трафик из инстансов 1b/1c пересекает границы AZ, чтобы дойти до этого NAT, а межзональный трафик сам по себе тарифицируется за ГБ. Решение — по одному NAT Gateway на AZ, где приватная таблица каждой AZ указывает на NAT в её собственной AZ: это убирает и SPOF, и межзональную плату за данные одним движением.
Приватные app-серверы в трёх AZ читают и пишут 40 ТБ/месяц в S3 и ещё вызывают несколько сторонних HTTPS-API. Нужен egress, который высокодоступен и не финансово радиоактивен. Выбери основной дизайн.
Что на самом деле делает подсеть «публичной» в VPC?
Приватные инстансы гонят 30 ТБ/месяц в S3, и строка NAT Gateway за обработку данных огромна. Самый дешёвый верный фикс?
- 01Что определяет публичную против приватной подсети и как приватные подсети достукиваются до интернета?
- 02Объясни ловушку стоимости egress через NAT и как VPC-эндпоинты её решают, плюс правило высокой доступности NAT.
VPC — логически изолированная виртуальная сеть, которую ты задаёшь блоком CIDR вроде 10.0.0.0/16, и ресурсы ты кладёшь в подсети, режущие этот CIDR на меньшие диапазоны. Структурное правило, управляющее каждым решением о доступности, — что подсеть целиком живёт в одной зоне доступности и не может охватывать несколько AZ, поэтому ты разносишь подсети минимум по двум AZ, чтобы пережить сбой зоны. Публичная против приватной — не флаг, а следствие маршрутизации: подсеть публична, только когда её таблица маршрутизации отправляет 0.0.0.0/0 на Internet Gateway и у её инстансов есть публичные IP, тогда как приватная подсеть выходит наружу через зональный NAT Gateway, сидящий в публичной подсети, который позволяет инстансам инициировать соединения наружу, но блокирует непрошеные входящие. NAT Gateway — ещё и то место, где деньги тихо горят, потому что он берёт плату за час и за ГБ обработанных данных, поэтому маршрутизация высокообъёмного трафика S3 или DynamoDB через него рождает пятизначные сюрпризы, которые бесплатный VPC Gateway Endpoint устраняет, отправляя этот трафик по маршруту через prefix list, который никогда не касается NAT и остаётся в сети AWS. Доверши картину правилом высокой доступности — по одному NAT Gateway на AZ, где таблица каждой AZ указывает на её собственный NAT — чтобы убрать и единую точку отказа, и межзональную плату за данные, и у тебя VPC, чьи пути и чей счёт выбраны намеренно. Теперь, когда откроешь Cost Explorer и увидишь неожиданную строку NAT Gateway, первый вопрос один: какая таблица маршрутизации гоняет этот трафик через NAT вместо бесплатного эндпоинта?
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.
Примени это
Примени этот урок в реальном проекте.