Введение
Приложению доставки посылок нужны отдельные диапазоны адресов для публичного сервиса и внутренних рабочих процессов. Вы создадите VPC, разместите две непересекающиеся подсети в разных зонах доступности и проверите план адресации в AWS View.
Вы уже должны уметь выполнять команды AWS CLI и читать идентификаторы ресурсов. CLI настроен для этой новой среды. В конце вы удалите только созданные вами ресурсы.
Связь с сертификацией
Эта лабораторная работа даёт практику по следующим темам экзаменов.
- Cloud Practitioner (CLF-C02) · Задачи 3.2 и 3.5: компоненты VPC и подсетей, связь региона с зонами доступности.
- Solutions Architect – Associate (SAA-C03) · Задача 3.4: базовое размещение уровней подсетей и планирование непересекающихся IP-адресных диапазонов.
- CloudOps Engineer – Associate (SOA-C03) · Задача 5.1: базовая настройка VPC и подсетей.
Создание VPC для доставки
На этом шаге вы выберете общий диапазон адресов приложения и создадите его VPC.
Virtual Private Cloud (VPC) — изолированная сеть для ресурсов одного региона AWS. Её блок CIDR определяет адреса, доступные подсетям. Запись IPv4 CIDR объединяет начальный адрес и длину префикса: 10.20.0.0/16 охватывает адреса от 10.20.0.0 до 10.20.255.255. Чем меньше число префикса, тем больше битов остаётся для адресов, поэтому /16 больше, чем /24.
Выполняйте команды в подготовленном Terminal и откройте соседнюю вкладку AWS View. Она читает то же состояние ресурсов, что и CLI, и показывает созданные сетевые ресурсы. Держите оба интерфейса доступными.
Начните с рабочего каталога:
cd /home/labex/project
Перед изменениями прочитайте список существующих VPC. --query выбирает поля ID и CIDR, а --output table упрощает сравнение:
aws ec2 describe-vpcs --query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock}' --output table
Эталонная сеть использует 10.99.0.0/16. Могут отображаться и другие существующие VPC. Не изменяйте их: вы создадите и затем удалите собственную сеть 10.20.0.0/16.
Группа команд EC2 включает сетевые операции VPC. --cidr-block задаёт диапазон, а --tag-specifications добавляет теги Name и Project при создании. Кавычки объединяют значение со скобками и запятыми в один аргумент.
Выражение оболочки $(...) выполняет команду и захватывает её вывод. Присваивание переменной VPC_ID сохраняет созданный идентификатор для последующих команд. --query 'Vpc.VpcId' --output text возвращает только этот ID:
VPC_ID=$(aws ec2 create-vpc \
--cidr-block 10.20.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=delivery-network},{Key=Project,Value=parcel}]' \
--query 'Vpc.VpcId' \
--output text)
Команда с захваченным выводом не печатает результат. Прочитайте ресурс по сохранённому ID. "$VPC_ID" подставляет значение одним аргументом:
aws ec2 describe-vpcs \
--vpc-ids "$VPC_ID" \
--query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock,State:State}' \
--output table
CIDR равен 10.20.0.0/16, состояние — available. В AWS View появляется delivery-network с тем же CIDR и пока без подсетей приложения. Не закрывайте этот Terminal, чтобы сохранить ID.
Добавление подсети публичного сервиса
На этом шаге вы выделите меньший диапазон внутри VPC и разместите его в зоне доступности.
Подсеть — часть диапазона адресов VPC. Каждая подсеть принадлежит ровно одной зоне доступности (AZ) этого региона; сама VPC охватывает регион. Имя вроде us-east-1a определяет размещение ресурсов подсети.
Зарезервируйте 10.20.1.0/24 для будущего публичного сервиса. Диапазон охватывает 10.20.1.0–10.20.1.255 и входит в 10.20.0.0/16. В обычной IPv4-подсети AWS резервирует первые четыре адреса и последний, оставляя в этом /24 251 адрес для назначения. Не назначайте зарезервированные адреса рабочим нагрузкам.
Посмотрите имена доступных зон. Регион был настроен при запуске среды:
aws ec2 describe-availability-zones \
--query 'AvailabilityZones[].{Zone:ZoneName,State:State}' \
--output table
Для этой подсети используйте us-east-1a, для следующей — us-east-1b. --vpc-id выбирает родительскую сеть, --availability-zone — размещение. Сохраните новый ID для очистки:
PUBLIC_SUBNET_ID=$(aws ec2 create-subnet \
--vpc-id "$VPC_ID" \
--cidr-block 10.20.1.0/24 \
--availability-zone us-east-1a \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=delivery-public},{Key=Project,Value=parcel}]' \
--query 'Subnet.SubnetId' \
--output text)
Прочитайте родительскую сеть, диапазон и зону:
aws ec2 describe-subnets \
--subnet-ids "$PUBLIC_SUBNET_ID" \
--query 'Subnets[].{ID:SubnetId,VPC:VpcId,CIDR:CidrBlock,Zone:AvailabilityZone}' \
--output table
ID VPC совпадает с сохранённым, диапазон равен 10.20.1.0/24, зона — us-east-1a. AWS View помещает подсеть внутрь delivery-network.
Имя delivery-public описывает назначение. Одно имя не делает подсеть публичной: нужен маршрут к интернет-шлюзу, который вы настроите в следующей работе.
Добавление отдельной подсети рабочих процессов
На этом шаге вы выделите внутренним рабочим процессам собственную непересекающуюся подсеть и сравните готовый план.
Две подсети одной VPC не могут пересекаться. Диапазон 10.20.2.0/24 для рабочих процессов отделён от 10.20.1.0/24. Оба входят в /16 VPC.
Разместите эту подсеть в us-east-1b, чтобы увидеть подсети разных зон внутри одной VPC. Это демонстрация размещения: избыточное приложение в нескольких зонах ещё не развёрнуто.
PRIVATE_SUBNET_ID=$(aws ec2 create-subnet \
--vpc-id "$VPC_ID" \
--cidr-block 10.20.2.0/24 \
--availability-zone us-east-1b \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=delivery-private},{Key=Project,Value=parcel}]' \
--query 'Subnet.SubnetId' \
--output text)
Используйте серверный фильтр, чтобы выбрать только подсети вашей VPC. В Name=vpc-id,Values=... поле Name обозначает фильтр, а Values содержит подходящий ID VPC:
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$VPC_ID" \
--query 'Subnets[].{ID:SubnetId,CIDR:CidrBlock,Zone:AvailabilityZone}' \
--output table
Две строки показывают следующий план. Созданные ID и порядок строк могут отличаться:
| Назначение | CIDR | Зона доступности |
|---|---|---|
| Публичный сервис | 10.20.1.0/24 |
us-east-1a |
| Внутренние рабочие процессы | 10.20.2.0/24 |
us-east-1b |
Попробуйте добавить 10.20.1.128/25, чтобы проверить границу пересечения. Этот меньший диапазон уже входит в delivery-public и не может стать другой подсетью этой VPC:
aws ec2 create-subnet \
--vpc-id "$VPC_ID" \
--cidr-block 10.20.1.128/25 \
--availability-zone us-east-1a
Ожидаемая ошибка содержит InvalidSubnet.Conflict. Третья подсеть не создаётся. Сохраните два корректных диапазона /24.
Сравните те же диапазоны и зоны в AWS View. Ни у одной подсети пока нет маршрута в Интернет. Раздельные диапазоны позволяют отдельно применять маршруты и правила доступа в следующих работах.

Пример результата: оба CIDR подсетей входят в диапазон VPC, каждая подсеть показывает свою зону. ID ресурсов в вашей среде отличаются.
Удаление учебной сети
На этом шаге вы удалите свои две подсети и VPC, сохранив существующую эталонную сеть.
У ресурсов есть зависимости: нельзя удалить VPC, пока в ней остаются ваши подсети. Удаляйте только сохранённые ID подсетей. Успешная команда удаления не выводит ничего:
aws ec2 delete-subnet --subnet-id "$PUBLIC_SUBNET_ID"
aws ec2 delete-subnet --subnet-id "$PRIVATE_SUBNET_ID"
Теперь удалите пустую VPC:
aws ec2 delete-vpc --vpc-id "$VPC_ID"
Прочитайте полный список VPC ещё раз, не полагаясь на изменяемый тег как доказательство удаления:
aws ec2 describe-vpcs --query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock}' --output table
VPC 10.20.0.0/16 отсутствует. Эталонная сеть 10.99.0.0/16 и остальные существующие сети сохранены. Ошибка запроса списка не доказывает очистку. AWS View показывает отсутствие VPC приложения.
Выполните проверку завершения этого шага.
Следующая работа начинается в новой среде со своим подготовленным приложением. Вы узнаете, как интернет-шлюз, маршрут и публичный адрес позволяют внешнему запросу достичь приложения.
Итоги
Вы создали диапазон VPC, разделили его на две непересекающиеся подсети приложения и разместили каждую в зоне доступности. Проверили родительские связи с помощью CLI и AWS View, затем удалили только свою учебную сеть.
Продолжайте работу «Подключение публичной подсети к Интернету», чтобы превратить адресный план в рабочий путь к приложению.



