Conecta la red con sus usuarios

AWSBeginner
Practicar Ahora

Introducción

Una aplicación puede tener una instancia en ejecución y una dirección pública y, aun así, resultar inaccesible. Definirás la ruta que falta y una regla de grupo de seguridad de alcance limitado con Terraform y, después, probarás tanto las conexiones permitidas como las bloqueadas.

Debes conocer las referencias a recursos de Terraform, las VPC, las subredes, las rutas a Internet y los grupos de seguridad. Este entorno independiente proporciona una aplicación de destino, otra aplicación de referencia en funcionamiento y valores de entrada de Terraform preparados. Solo gestionarás los nuevos recursos de conexión.

Relación con las certificaciones

Certificación Tarea del examen Práctica
Solutions Architect – Associate (SAA-C03) Tarea 1.2 Conectar una subred de VPC mediante una puerta de enlace de Internet y restringir el acceso de red de una aplicación por origen y puerto.

Vista general del laboratorio

Resumen conceptual: un cliente autorizado llega a la subred de la aplicación mediante su puerta de enlace de Internet y su ruta predeterminada, mientras un grupo de seguridad limita el puerto de la aplicación.

Crea la ruta a Internet

En este paso, conectarás una puerta de enlace de Internet a la VPC de la aplicación y asociarás explícitamente una tabla de rutas con su subred.

Abre Terminal y AWS View. Las redes de la aplicación y de referencia son independientes. application-server ya tiene una dirección pública porque su subred asigna IP públicas al lanzar instancias. Una dirección pública por sí sola no crea una ruta a Internet ni un permiso de entrada.

En AWS View, selecciona application-server, User · 198.51.100.10 y Application · 8081 y haz clic en Send request. Debes ver Blocked. Selecciona reference-server con el mismo cliente y puerto de aplicación, envía otra solicitud y confirma que la aplicación de referencia responde. Mantén esa aplicación de referencia en funcionamiento durante todo el laboratorio.

Entra en el directorio de trabajo preparado:

cd /home/labex/project/application-access

El archivo terraform.tfvars.json suministrado contiene los ID de la VPC, la subred y el grupo de seguridad de este entorno nuevo. Terraform carga automáticamente estos valores de entrada. Léelos antes de usar las variables correspondientes:

cat terraform.tfvars.json

La configuración preparada del proveedor selecciona el entorno del curso. No necesitas copiar ID de una VM anterior ni introducir credenciales personales. Guarda y muestra el ID de la instancia de destino suministrada para inspeccionarla más adelante. $(...) captura la salida de un comando y --output text devuelve el ID como texto sin formato.

TARGET_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=application-server Name=instance-state-name,Values=running \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)
echo "$TARGET_ID"

Una puerta de enlace de Internet se conecta a una VPC. Una tabla de rutas envía a su puerta de enlace el tráfico dirigido a un destino, y una asociación de subred determina qué tabla rige la subred. Sin una asociación explícita, una subred usa la tabla de rutas principal de su VPC. Deja sin cambios esa tabla principal suministrada. El destino 0.0.0.0/0 coincide con las direcciones IPv4 que no tienen una ruta más específica; no concede permiso a través de un grupo de seguridad.

Crea routing.tf. El heredoc entre comillas escribe literalmente el HCL. Las referencias a recursos conectan la ruta con su tabla y su puerta de enlace y conectan la asociación de subred con la misma tabla.

cat > routing.tf <<'HCL'
resource "aws_internet_gateway" "application" {
  vpc_id = var.vpc_id
}

resource "aws_route_table" "application" {
  vpc_id = var.vpc_id
}

resource "aws_route" "internet" {
  route_table_id         = aws_route_table.application.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.application.id
}

resource "aws_route_table_association" "application" {
  subnet_id      = var.subnet_id
  route_table_id = aws_route_table.application.id
}

output "route_table_id" {
  value = aws_route_table.application.id
}

output "subnet_id" {
  value = var.subnet_id
}
HCL

Inicializa la configuración, dale formato y valídala:

terraform init
terraform fmt
terraform validate

Si init muestra Incomplete lock file information for providers, se refiere a las sumas de comprobación para otras plataformas. Esta VM preparada usa linux_amd64; continúa cuando la inicialización y la validación terminen correctamente.

Revisa las cuatro incorporaciones: la puerta de enlace, la tabla, la ruta y la asociación. La instancia suministrada y la red de referencia no deben aparecer como recursos que se vayan a sustituir o eliminar.

terraform plan

Aplica los cambios e introduce yes cuando se solicite:

terraform apply

Guarda y muestra el ID de la tabla nueva y el ID de la subred suministrada:

TABLE_ID=$(terraform output -raw route_table_id)
echo "$TABLE_ID"
SUBNET_ID=$(terraform output -raw subnet_id)
echo "$SUBNET_ID"

Consulta la tabla de rutas de forma independiente. Localiza el destino predeterminado, la puerta de enlace igw-... y la asociación con el ID de tu subred. La ruta local de la VPC también se conserva.

aws ec2 \
  describe-route-tables \
  --route-table-ids "$TABLE_ID" \
  --query 'RouteTables[].{Routes:Routes[].{Destination:DestinationCidrBlock,Gateway:GatewayId},Subnets:Associations[].SubnetId}'

Confirma la asignación de IP públicas en la subred suministrada:

aws ec2 \
  describe-subnets \
  --subnet-ids "$SUBNET_ID" \
  --query 'Subnets[].{CIDR:CidrBlock,PublicIPOnLaunch:MapPublicIpOnLaunch}'

PublicIPOnLaunch es true. Ese ajuste controla las instancias nuevas que se lanzan; cambiarlo no permite asignar retroactivamente una dirección a una instancia existente. AWS View muestra ahora la puerta de enlace real y la tabla de rutas efectiva. Vuelve a enviar la solicitud User/8081 de la aplicación: sigue mostrando Blocked porque todavía no hay ninguna regla de entrada que la permita.

Permite el cliente previsto y prueba los límites

En este paso, permitirás que el cliente User llegue al puerto de la aplicación y comprobarás que otro cliente y otro puerto sigan bloqueados.

Un grupo de seguridad es un límite de red con estado asociado a la interfaz de red de una instancia. El enrutamiento hace que exista un camino disponible; el grupo sigue decidiendo qué conexiones entrantes se permiten. El grupo de la aplicación suministrado no tiene por ahora reglas de entrada.

Crea un recurso de regla de entrada independiente para ese grupo. cidr_ipv4 = "198.51.100.10/32" selecciona la única dirección IPv4 del cliente User. Establecer ambos puertos en 8081 permite únicamente el servicio de escucha de la aplicación. La aplicación de referencia usa su propio grupo de seguridad.

cat > access.tf <<'HCL'
resource "aws_vpc_security_group_ingress_rule" "application" {
  security_group_id = var.security_group_id
  ip_protocol       = "tcp"
  from_port         = 8081
  to_port           = 8081
  cidr_ipv4         = "198.51.100.10/32"
}

output "security_group_id" {
  value = var.security_group_id
}
HCL

Da formato a la configuración, valídala y revisa el plan. Debe añadirse una regla de entrada y no debe sustituirse ninguna instancia.

terraform fmt
terraform validate
terraform plan

Aplica la regla y confirma con yes:

terraform apply

Guarda y muestra el ID del grupo existente y, después, lee su permiso de entrada real:

GROUP_ID=$(terraform output -raw security_group_id)
echo "$GROUP_ID"
aws ec2 \
  describe-security-groups \
  --group-ids "$GROUP_ID" \
  --query 'SecurityGroups[].{Group:GroupId,Ingress:IpPermissions}'

El permiso debe describir el puerto TCP 8081 desde 198.51.100.10/32. Confirma que Terraform ha convergido:

terraform plan

Debes ver No changes. Ahora realiza las tres pruebas en AWS View, seleccionando application-server en cada una:

Selecciona User · 198.51.100.10 y Application · 8081. Haz clic en Send request. Debes ver Connected · 200 y el mensaje Application network connected.

Punto de comprobación en ejecución: la red de destino real, el origen seleccionado y el puerto de la aplicación producen una respuesta correcta. Los ID de recursos son ejemplos. Cambia el origen a Unrelated · 198.51.100.20, mantén el puerto 8081 y envía otra solicitud. Debes ver Blocked. Vuelve al origen User, elige SSH · 22 y envía otra solicitud. Debes ver Blocked. Una solicitud correcta a la aplicación no autoriza el acceso al servicio de escucha SSH independiente de la instancia.

El resultado identifica el origen real, la instancia de destino y el puerto. Request service unavailable es un error del entorno, no una prueba de un rechazo de red previsto. Evita ampliar la regla a 0.0.0.0/0: hacerlo expondría el mismo servicio de escucha de la aplicación al cliente ajeno.

La documentación de reglas de entrada del proveedor de AWS describe los campos del recurso. La CLI, la correspondencia de Terraform y los resultados reales de las solicitudes deben coincidir.

Elimina los recursos de conexión y conserva las aplicaciones

En este paso, eliminarás únicamente los recursos de conexión gestionados por Terraform y confirmarás que las aplicaciones suministradas permanecen intactas.

Este directorio de trabajo gestiona cinco recursos: una puerta de enlace de Internet, una tabla de rutas, una ruta predeterminada, una asociación de subred y una regla de entrada. La VPC, la subred, la tabla de rutas principal, la instancia de destino y la aplicación de referencia se suministraron de forma independiente. Quedan fuera de este estado y deben conservarse.

Revisa el plan de destrucción:

terraform plan -destroy

Debes ver cinco recursos para destruir. Después, ejecuta la eliminación e introduce yes:

terraform destroy

Confirma que el estado no contiene direcciones de recursos gestionados:

terraform state list

La instancia de destino suministrada debe seguir en ejecución con el mismo ID:

aws ec2 \
  describe-instances \
  --instance-ids "$TARGET_ID" \
  --query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Subnet:SubnetId}'

En AWS View, vuelve a enviar la solicitud User/8081 al destino. Debe mostrar Blocked porque has eliminado sus recursos de conexión. Después, selecciona reference-server, User y el puerto 8081 y envía una solicitud. La aplicación de referencia debe seguir devolviendo Connected · 200 y Reference application.

Tus archivos HCL siguen disponibles para revisarlos. Un plan ordinario posterior propondría volver a crear los recursos eliminados; conservar esa configuración es normal después de terraform destroy.

Resumen

Has usado referencias de Terraform para conectar una puerta de enlace de Internet, definir una ruta predeterminada y asociar una tabla de rutas con la subred de una aplicación. Después, has añadido una regla de entrada de alcance limitado, probado los límites reales de origen y puerto, confirmado la convergencia y eliminado únicamente tus recursos de conexión conservando las aplicaciones suministradas.