Introducción
Una aplicación de reparto funciona en una subred privada y necesita contactar con un servicio externo sin recibir una dirección pública. Crearás una puerta de enlace NAT pública, añadirás su ruta de salida y usarás solicitudes HTTP reales para observar la traducción de origen y el límite frente a conexiones entrantes no solicitadas.
Completa primero Control Application Access with Security Groups. Este entorno nuevo proporciona su propia aplicación, subredes pública y privada, ruta pública a Internet y reglas de seguridad. La CLI ya está configurada. Conserva estos recursos y la red de referencia ajena al ejercicio; crea y después elimina solo tu NAT, su Elastic IP y la ruta predeterminada privada.
Relación con las certificaciones
Este laboratorio permite practicar los siguientes temas de examen.
- Cloud Practitioner (CLF-C02) · Tarea 3.5: Funciones de las subredes y puertas de enlace en una VPC.
- Solutions Architect – Associate (SAA-C03) · Tarea 1.2: Segmentación básica entre subredes públicas y privadas con tablas de rutas y NAT.
- CloudOps Engineer – Associate (SOA-C03) · Tareas 5.1 y 5.3: Configuración de NAT y diagnóstico de una ruta ausente en la subred privada.
- Advanced Networking – Specialty (ANS-C01) · Tarea 3.1: Práctica básica de mantenimiento de una ruta VPC estática y comprobación de su efecto en la conectividad.
Inspeccionar la aplicación privada y asignar una dirección NAT
En este paso inspeccionarás la red suministrada, observarás que falta la ruta de salida y asignarás una dirección para la futura puerta de enlace NAT.
Ejecuta los comandos CLI en Terminal y abre AWS View a su lado. La vista consulta el mismo estado de recursos. La aplicación usa la dirección IPv4 privada 10.20.2.10 en private-subnet, no en public-subnet.
cd /home/labex/project
Selecciona la VPC de la aplicación por su etiqueta Name. --filters limita los resultados, --query selecciona el ID y $(...) lo guarda en una variable de shell:
VPC_ID=$(aws ec2 describe-vpcs \
--filters Name=tag:Name,Values=application-network \
--query 'Vpcs[0].VpcId' \
--output text)
Selecciona la subred pública de esa VPC. Allí la puerta de enlace NAT tendrá una ruta hacia Internet:
PUBLIC_SUBNET_ID=$(aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=public-subnet \
--query 'Subnets[0].SubnetId' \
--output text)
Selecciona la tabla de rutas existente de la subred privada. Cambiarás su ruta predeterminada sin modificar la asociación a la subred:
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)
Inspecciona ambas tablas suministradas. La proyección después de []. selecciona campos legibles para cada tabla:
aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=$VPC_ID" \
--query 'RouteTables[].{Name:Tags[?Key==`Name`].Value|[0],Routes:Routes,Associations:Associations}' \
--output json
Ambas tablas con nombre tienen la ruta local de la VPC. También puede aparecer una tabla principal sin nombre; déjala intacta. Las tablas con nombre tienen asociaciones explícitas a las subredes, por lo que usarás la tabla seleccionada private-routes. La tabla pública también dirige 0.0.0.0/0 a una puerta de enlace de Internet; la privada no tiene ruta predeterminada. Una subred privada no tiene ruta directa a la puerta de enlace de Internet. Una puerta de enlace NAT pública permite que las aplicaciones privadas inicien conexiones IPv4 con la dirección pública de la puerta de enlace. Debe estar en la subred pública, cuya ruta propia a Internet ya está configurada.
En AWS View, pulsa Request outbound service. La solicitud HTTP de la aplicación devuelve Connection failed: no tiene ruta al servicio externo 198.51.100.20:9000. Pulsa Request private application from outside; esta solicitud HTTP no solicitada a 10.20.2.10:80 también falla. La aplicación conserva su dirección privada.
Una dirección Elastic IP es una dirección IPv4 pública asignada. Asigna una en el dominio VPC y etiquétala para identificar el recurso del ejercicio. El valor entre comillas de --tag-specifications es un solo argumento que describe el tipo de recurso y sus etiquetas:
ALLOCATION_ID=$(aws ec2 allocate-address \
--domain vpc \
--tag-specifications 'ResourceType=elastic-ip,Tags=[{Key=Name,Value=parcel-nat-address},{Key=Project,Value=parcel}]' \
--query 'AllocationId' \
--output text)
Consulta la dirección asignada:
aws ec2 describe-addresses \
--allocation-ids "$ALLOCATION_ID" \
--query 'Addresses[].{Allocation:AllocationId,PublicIP:PublicIp,Domain:Domain}' \
--output table
El resultado incluye un ID de asignación, una dirección IPv4 pública y el dominio vpc. Anota la dirección pública para compararla después con el tráfico. Pertenece a la futura NAT; no la asocies a la aplicación. Mantén esta Terminal abierta para conservar los ID guardados.
Crear una puerta de enlace NAT pública
En este paso colocarás NAT en la subred pública y comprobarás que crearla no configura por sí solo la ruta de la aplicación privada.
NAT necesita dos recursos existentes: la subred pública y la Elastic IP asignada. --subnet-id elige su ubicación, --allocation-id su dirección pública y --connectivity-type public una puerta de enlace para tráfico hacia Internet. El tipo de recurso natgateway aplica las etiquetas de propiedad. Guarda su ID generado:
NAT_ID=$(aws ec2 create-nat-gateway \
--subnet-id "$PUBLIC_SUBNET_ID" \
--allocation-id "$ALLOCATION_ID" \
--connectivity-type public \
--tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=parcel-nat},{Key=Project,Value=parcel}]' \
--query 'NatGateway.NatGatewayId' \
--output text)
La creación puede devolver una respuesta antes de que la puerta de enlace esté lista. Un waiter de la CLI consulta repetidamente su estado hasta alcanzar la condición indicada. Espera a available antes de añadir una ruta:
aws ec2 wait nat-gateway-available --nat-gateway-ids "$NAT_ID"
El waiter termina sin salida cuando tiene éxito. Consulta el estado, la subred y la asociación de direcciones:
aws ec2 describe-nat-gateways \
--nat-gateway-ids "$NAT_ID" \
--query 'NatGateways[].{ID:NatGatewayId,State:State,Subnet:SubnetId,Addresses:NatGatewayAddresses}' \
--output json
State es available, Subnet coincide con la subred pública y NatGatewayAddresses contiene tu ID de asignación y dirección pública. Su PrivateIp pertenece al rango público 10.20.1.0/24; es la dirección privada de la interfaz NAT, distinta de su Elastic IP y de la dirección de la aplicación. NAT es un recurso separado: la aplicación privada no ha recibido esa dirección.
AWS View muestra ahora NAT. Pulsa de nuevo Request outbound service. Sigue fallando porque la tabla privada no tiene ruta predeterminada. Crear la puerta de enlace proporciona un posible siguiente salto, pero no lo selecciona automáticamente para la subred privada. La ruta pública existente hacia la puerta de enlace de Internet permanece intacta.
Enrutar el tráfico de salida privado a través de NAT
En este paso añadirás la ruta predeterminada privada y compararás la dirección privada de la aplicación con el origen observado por el servicio externo.
Una ruta selecciona el siguiente salto para un rango de destinos. 0.0.0.0/0 coincide con destinos IPv4 que no coinciden con una ruta más específica. --nat-gateway-id selecciona tu NAT en lugar de la puerta de enlace de Internet. Añade esta ruta solo a la tabla privada guardada:
aws ec2 create-route \
--route-table-id "$PRIVATE_RT_ID" \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id "$NAT_ID"
La respuesta indica que la creación se realizó correctamente. Consulta las rutas de la tabla privada:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" \
--query 'RouteTables[].Routes' \
--output json
La ruta local se conserva. La nueva ruta predeterminada tiene tu NatGatewayId y estado active. Los paquetes siguen ahora: aplicación privada → NAT en la subred pública → puerta de enlace de Internet → servicio externo.
Cuando AWS View muestre la ruta predeterminada privada, pulsa Request outbound service. Devuelve Success. El cuerpo de respuesta contiene la dirección IPv4 de origen observada realmente por el servicio HTTP externo. Compárala con tu dirección pública asignada:
aws ec2 describe-addresses \
--allocation-ids "$ALLOCATION_ID" \
--query 'Addresses[0].PublicIp' \
--output text
Las dos direcciones coinciden. La traducción de direcciones de red (NAT) sustituye la dirección privada de origen por la dirección pública de la puerta de enlace y mantiene el estado de la conexión para devolver la respuesta a quien la inició. La dirección propia de la aplicación sigue siendo 10.20.2.10.

Ejemplo de AWS View: la aplicación sigue en 10.20.2.10, la ruta privada predeterminada selecciona NAT disponible y el cuerpo HTTP muestra la dirección pública asignada. Los ID y direcciones generados pueden variar.
Pulsa Request private application from outside. Sigue devolviendo Connection failed. La conectividad de salida y su tráfico de retorno no crean una ruta pública de entrada a la aplicación privada. NAT no acepta una conexión de Internet no solicitada para esa aplicación.
Diagnosticar y restaurar una ruta privada ausente
En este paso eliminarás una ruta, observarás el fallo y restaurarás la conectividad sin volver a crear NAT.
La puerta de enlace puede estar disponible mientras su cliente carece de una ruta utilizable. Elimina solo la ruta predeterminada privada y conserva NAT y la ruta pública a Internet:
aws ec2 delete-route --route-table-id "$PRIVATE_RT_ID" --destination-cidr-block 0.0.0.0/0
La eliminación correcta no produce salida. Inspecciona la tabla privada:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" \
--query 'RouteTables[].Routes' \
--output json
Solo queda la ruta local de la VPC. AWS View sigue mostrando NAT disponible, pero sin ruta predeterminada privada. Pulsa Request outbound service; una solicitud nueva falla. El éxito anterior es información histórica, no el resultado de esta nueva solicitud.
Restaura la misma ruta hacia la misma puerta de enlace:
aws ec2 create-route \
--route-table-id "$PRIVATE_RT_ID" \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id "$NAT_ID"
Vuelve a consultar las rutas:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" \
--query 'RouteTables[].Routes' \
--output json
Vuelve a aparecer la ruta predeterminada activa. Envía una nueva Request outbound service en AWS View; funciona y muestra la misma dirección pública NAT. Request private application from outside sigue fallando. Estas observaciones distinguen una puerta de enlace disponible de una ruta completa para el cliente.
Eliminar la ruta NAT del ejercicio y liberar su dirección
En este paso eliminarás tu ruta y NAT, liberarás su dirección pública y demostrarás que la red privada suministrada sigue intacta.
Elimina la ruta predeterminada privada antes de retirar su siguiente salto. De lo contrario, la tabla puede conservar una ruta hacia una puerta de enlace eliminada:
aws ec2 delete-route --route-table-id "$PRIVATE_RT_ID" --destination-cidr-block 0.0.0.0/0
La eliminación correcta no produce salida. Elimina solo tu NAT:
aws ec2 delete-nat-gateway --nat-gateway-id "$NAT_ID"
La respuesta identifica la puerta de enlace solicitada. Usa el waiter de eliminación antes de liberar su dirección:
aws ec2 wait nat-gateway-deleted --nat-gateway-ids "$NAT_ID"
El waiter termina sin salida cuando tiene éxito. Eliminar NAT quita su interfaz de red y desasocia su Elastic IP, pero no libera la asignación. Consulta la dirección antes de liberarla:
aws ec2 describe-addresses \
--allocation-ids "$ALLOCATION_ID" \
--query 'Addresses[].{Allocation:AllocationId,PublicIP:PublicIp,Association:AssociationId}' \
--output json
La asignación y la dirección pública permanecen, mientras Association es null: la dirección está asignada pero ya no está asociada. Libera ahora ese recurso independiente:
aws ec2 release-address --allocation-id "$ALLOCATION_ID"
La liberación correcta no produce salida. Consulta el inventario completo de puertas de enlace, sin depender de etiquetas que se pueden quitar:
aws ec2 describe-nat-gateways \
--query 'NatGateways[].{ID:NatGatewayId,State:State,Subnet:SubnetId}' \
--output table
Tu puerta de enlace puede seguir apareciendo con estado deleted; no debe haber ninguna NAT del ejercicio activa. Un registro de eliminación conservado no significa que pueda reenviar tráfico. Comprueba el inventario completo de direcciones:
aws ec2 describe-addresses \
--query 'Addresses[].{Allocation:AllocationId,PublicIP:PublicIp}' \
--output table
La asignación del ejercicio ya no aparece. Consulta ahora las rutas privadas:
aws ec2 describe-route-tables \
--route-table-ids "$PRIVATE_RT_ID" \
--query 'RouteTables[].Routes' \
--output json
La ruta local de la VPC se conserva y la predeterminada ya no existe. Permanecen la aplicación, subredes, reglas de seguridad, puerta de enlace pública de Internet y red de referencia suministradas. Una consulta de inventario fallida no demuestra la eliminación.
En AWS View, pulsa Request outbound service; vuelve a fallar porque eliminaste deliberadamente su ruta NAT. Request private application from outside sigue bloqueada. Los resultados coinciden con el estado inicial de la red privada.
Ejecuta la comprobación de este paso.
Resumen
Asignaste una dirección pública, colocaste NAT en la subred pública y enrutaste a través de ella las solicitudes de salida de una aplicación privada. El servicio externo observó la dirección NAT traducida, mientras que las solicitudes entrantes no solicitadas quedaron bloqueadas. Eliminar y restaurar la ruta predeterminada privada mostró por qué la disponibilidad de la puerta de enlace no basta para establecer conectividad.
Después eliminaste tu ruta y NAT, liberaste la dirección y verificaste que se conserva el estado inicial de la red privada.



