Введение
Приватное приложение доставки читает манифест S3 через NAT. Ему нужен путь к сервису без общего доступа в Internet. Вы создадите шлюзовую конечную точку S3, сравните реальные запросы, исследуете неверную связь с таблицей маршрутов и восстановите предоставленную сеть.
Сначала завершите Give a Private Subnet Outbound Access. Новая среда независимо предоставляет приложение, объект S3, публичную и приватную подсети, NAT и правила безопасности. CLI настроен. Сохраните эти ресурсы и справочную сеть; создайте и удалите только свою конечную точку, восстановив временно удалённый приватный маршрут NAT по умолчанию.
Связь с сертификацией
Лаборатория даёт базовую практику по следующим темам:
- Cloud Practitioner (CLF-C02) · Задача 3.5: Роли шлюзов VPC и приватных соединений.
- Solutions Architect – Associate (SAA-C03) · Задача 1.2: Базовый доступ приватных приложений через конечные точки сервисов и таблицы маршрутов.
- CloudOps Engineer – Associate (SOA-C03) · Задачи 5.1 и 5.3: Настройка конечной точки и диагностика связи с таблицами.
- Advanced Networking – Specialty (ANS-C01) · Задача 3.1: Основы сопровождения сервисных маршрутов и проверки приватной связности.
Создайте шлюзовую конечную точку S3
Проверьте исходный путь NAT, определите диапазоны S3 и создайте конечную точку для приватной таблицы.
Работайте в Terminal, рядом откройте AWS View. Адрес приложения остаётся 10.20.2.10. Предоставленный бакет parcel-delivery-storage содержит message.txt с текстом Parcel manifest ready.
cd /home/labex/project
Выберите VPC по тегу Name. Фильтры выбирают ресурсы, запрос извлекает ID, а $(...) сохраняет его:
VPC_ID=$(aws ec2 describe-vpcs \
--filters Name=tag:Name,Values=application-network \
--query 'Vpcs[0].VpcId' \
--output text)
Сохраните ID приватной и публичной таблиц. Их связи с подсетями уже верны:
PRIVATE_RT_ID=$(aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=private-routes \
--query 'RouteTables[0].RouteTableId' \
--output text)
PUBLIC_RT_ID=$(aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=public-routes \
--query 'RouteTables[0].RouteTableId' \
--output text)
Прочитайте маршруты и связи:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
--query 'RouteTables[].{ID:RouteTableId,Routes:Routes,Associations:Associations}' \
--output json
Приватный 0.0.0.0/0 ведёт к NAT, публичный — к Internet gateway. Обе таблицы сохраняют local. Сохраните ID NAT для восстановления:
NAT_ID=$(aws ec2 describe-nat-gateways \
--filter "Name=vpc-id,Values=$VPC_ID" Name=state,Values=available \
--query 'NatGateways[0].NatGatewayId' \
--output text)
Посмотрите адреса для сравнения с запросами:
aws ec2 describe-nat-gateways \
--nat-gateway-ids "$NAT_ID" \
--query 'NatGateways[].{State:State,Addresses:NatGatewayAddresses}' \
--output json
В AWS View нажмите Read storage object: получите Success и манифест. Source address показывает публичный адрес NAT. Request outbound service также успешен с этим адресом. Это исходное поведение нужно восстановить в конце.
Список префиксов под управлением AWS объединяет диапазоны сервиса в регионе. Шлюзовая конечная точка S3 добавляет маршрут к списку в связанные таблицы, не выдавая приложению публичный адрес и общий доступ в Internet. Выберите список S3 и его диапазоны IPv4:
PREFIX_ID=$(aws ec2 describe-prefix-lists \
--filters Name=prefix-list-name,Values=com.amazonaws.us-east-1.s3 \
--query 'PrefixLists[0].PrefixListId' \
--output text)
aws ec2 get-managed-prefix-list-entries \
--prefix-list-id "$PREFIX_ID" \
--query 'Entries[].Cidr' \
--output json
Создайте конечную точку S3 для us-east-1, связанную только с приватной таблицей. --vpc-endpoint-type Gateway выбирает маршрутный тип, --service-name — региональный сервис, --route-table-ids — таблицу приложения. Теги обозначают ваш учебный ресурс:
ENDPOINT_ID=$(aws ec2 create-vpc-endpoint \
--vpc-id "$VPC_ID" \
--vpc-endpoint-type Gateway \
--service-name com.amazonaws.us-east-1.s3 \
--route-table-ids "$PRIVATE_RT_ID" \
--tag-specifications 'ResourceType=vpc-endpoint,Tags=[{Key=Name,Value=parcel-s3-endpoint},{Key=Project,Value=parcel}]' \
--query 'VpcEndpoint.VpcEndpointId' \
--output text)
Прочитайте состояние и связь:
aws ec2 describe-vpc-endpoints \
--vpc-endpoint-ids "$ENDPOINT_ID" \
--query 'VpcEndpoints[].{ID:VpcEndpointId,State:State,Type:VpcEndpointType,Service:ServiceName,Tables:RouteTableIds}' \
--output json
Продолжайте при State: available. Иначе подождите несколько секунд и повторите тот же запрос. Тип — Gateway, сервис — S3, таблица — только приватная. Оставьте Terminal открытым для сохранения переменных.
Снова нажмите Read storage object. Текст прежний, источник теперь 10.20.2.10. Префиксный маршрут S3 конкретнее маршрута NAT по умолчанию: S3 использует конечную точку, остальные исходящие запросы — NAT.
Сохраните доступ к S3 без маршрута NAT по умолчанию
Удалите общий исходящий путь и проверьте отдельный путь к сервису.
Удалите только приватный маршрут NAT по умолчанию. Сохраните сам NAT, адрес, публичный маршрут и конечную точку:
aws ec2 delete-route --route-table-id "$PRIVATE_RT_ID" --destination-cidr-block 0.0.0.0/0
Успешное удаление не выводит результат. Прочитайте маршруты:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" \
--query 'RouteTables[].Routes' \
--output json
Остаются local и S3 DestinationPrefixListId, но не маршрут по умолчанию. GatewayId сервиса — ID конечной точки, состояние active. Эти маршруты управляются связями конечной точки; не редактируйте их обычными командами маршрутов.
Новый Read storage object возвращает Parcel manifest ready от 10.20.2.10. Request outbound service не проходит: 198.51.100.20:9000 вне списка S3, а маршрута по умолчанию нет. Request private application from outside тоже не проходит. Конечная точка даёт приватный S3, без публичного адреса и маршрутов к другим интернет-сервисам.

Пример: в приватной таблице есть local и префикс S3, но нет 0.0.0.0/0. Реальный ответ содержит исходный манифест и источник 10.20.2.10. NAT доступен, но не участвует в этом пути. Сгенерированные ID и адреса могут отличаться.
Наблюдайте неверную связь с таблицей
Перенесите конечную точку из таблицы приложения и выясните, почему доступный ресурс может быть недостижим.
Связь конечной точки с таблицей отличается от связи подсети с таблицей. Измените только первую:
aws ec2 modify-vpc-endpoint \
--vpc-endpoint-id "$ENDPOINT_ID" \
--add-route-table-ids "$PUBLIC_RT_ID" \
--remove-route-table-ids "$PRIVATE_RT_ID"
Ответ сообщает Return: true. Прочитайте конечную точку:
aws ec2 describe-vpc-endpoints \
--vpc-endpoint-ids "$ENDPOINT_ID" \
--query 'VpcEndpoints[].{State:State,Tables:RouteTableIds}' \
--output json
Она всё ещё available, но указана только публичная таблица. Прочитайте обе:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
--query 'RouteTables[].{ID:RouteTableId,Routes:Routes,Associations:Associations}' \
--output json
Автоматический маршрут S3 переместился в публичную таблицу. В приватной осталось только local. Связи подсетей не изменились. Общая VPC не делает один маршрут конечной точки доступным всем подсетям.
Когда AWS View покажет изменение, нажмите Read storage object. Новый запрос вернёт Connection failed и Storage unavailable: таблица приложения не имеет пути S3. Request outbound service тоже не проходит. Предыдущий успех — исторический результат. Оставьте неисправность для проверки этого шага; исправление будет следующим.
Восстановите приватный сервисный маршрут
Исправьте связь без пересоздания конечной точки, публичного адреса и восстановления маршрута NAT.
Верните ту же конечную точку в приватную таблицу и отключите публичную:
aws ec2 modify-vpc-endpoint \
--vpc-endpoint-id "$ENDPOINT_ID" \
--add-route-table-ids "$PRIVATE_RT_ID" \
--remove-route-table-ids "$PUBLIC_RT_ID"
Прочитайте связь:
aws ec2 describe-vpc-endpoints \
--vpc-endpoint-ids "$ENDPOINT_ID" \
--query 'VpcEndpoints[].{State:State,Tables:RouteTableIds}' \
--output json
Должна быть только приватная таблица. Проверьте маршруты:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
--query 'RouteTables[].{ID:RouteTableId,Routes:Routes}' \
--output json
Приватный маршрут S3 возвращается автоматически, а из публичной таблицы исчезает. Публичный маршрут Internet сохранён; приватного маршрута по умолчанию нет.
Новый Read storage object возвращает исходный манифест от 10.20.2.10. Request outbound service остаётся неуспешным: конечная точка S3 не даёт общего доступа в Internet. Request private application from outside также блокируется. Приватный адрес и предоставленные правила сохранены.
Удалите конечную точку и восстановите NAT
Удалите свою конечную точку, проверьте исчезновение автоматических маршрутов и верните приватный маршрут к предоставленному NAT.
Удалите только свою конечную точку:
aws ec2 delete-vpc-endpoints --vpc-endpoint-ids "$ENDPOINT_ID"
Unsuccessful должен быть пуст. Прочитайте полный список, не фильтруя по удаляемым тегам:
aws ec2 describe-vpc-endpoints \
--query 'VpcEndpoints[].{ID:VpcEndpointId,State:State,Tables:RouteTableIds}' \
--output json
Может остаться запись deleted, но не активная учебная конечная точка. Запись об удалении не передаёт трафик. При deleting подождите несколько секунд и повторите запрос. Прочитайте таблицы:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" "$PUBLIC_RT_ID" \
--query 'RouteTables[].{ID:RouteTableId,Routes:Routes}' \
--output json
Ни одна не должна содержать префикс S3. Read storage object не проходит, пока в приватной таблице только local: скрытого альтернативного пути нет.
Восстановите маршрут по умолчанию через сохранённый ID NAT. Не удаляйте NAT, адрес, приложение и его данные S3:
aws ec2 create-route \
--route-table-id "$PRIVATE_RT_ID" \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id "$NAT_ID"
Прочитайте восстановленные маршруты:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" \
--query 'RouteTables[].Routes' \
--output json
local и активный NAT соответствуют исходной таблице. Ошибка получения списка не доказывает удаление: аутентифицированный запрос должен успешно подтвердить отсутствие или deleted и удалённые автоматические маршруты.
Снова нажмите Read storage object: исходный манифест придёт через NAT, а Source address будет его публичным адресом. Request outbound service успешен с тем же адресом; Request private application from outside остаётся заблокированным. Сохраните VPC, подсети, NAT, правила, объект S3 и справочную сеть.
Выполните проверку завершения этого шага.
Итог
Вы создали конечную точку S3 и проверили реальные чтения с приватным источником. Без маршрута NAT по умолчанию S3 работал, другие направления блокировались. Неверная публичная связь прервала доступ; приватная связь восстановила его без изменения приложения и правил.
Вы удалили конечную точку и её маршруты, восстановили NAT.



