Este documento registra la implementación real de la infraestructura de red diseñada en S1-E1, ejecutada mediante Terraform (Infrastructure as Code) sobre AWS sa-east-1. Incluye las configuraciones de VPC, subnets, tablas de rutas, Security Groups, NAT Gateways, ALB y VPC Endpoints, junto con los resultados de las pruebas de conectividad, latencia y throughput.
Sección 1 — Configuración de la Infraestructura de Red (Terraform)¶
# network/nat.tf# Elastic IPs para NAT Gatewaysresource"aws_eip""nat_a"{domain="vpc"tags={Name="logyx-eip-nat-a"}}resource"aws_eip""nat_b"{domain="vpc"tags={Name="logyx-eip-nat-b"}}# NAT Gateways (uno por AZ para redundancia)resource"aws_nat_gateway""nat_a"{allocation_id=aws_eip.nat_a.idsubnet_id=aws_subnet.public_a.idtags={Name="logyx-nat-a"}depends_on=[aws_internet_gateway.igw]}resource"aws_nat_gateway""nat_b"{allocation_id=aws_eip.nat_b.idsubnet_id=aws_subnet.public_b.idtags={Name="logyx-nat-b"}depends_on=[aws_internet_gateway.igw]}# ─── Tablas de rutas ────────────────────────────────────# network/routing.tf# Tabla pública → Internet Gatewayresource"aws_route_table""public"{vpc_id=aws_vpc.logyx.idroute{cidr_block="0.0.0.0/0"gateway_id=aws_internet_gateway.igw.id}tags={Name="logyx-rt-public"}}# Tabla privada AZ-A → NAT-Aresource"aws_route_table""private_a"{vpc_id=aws_vpc.logyx.idroute{cidr_block="0.0.0.0/0"nat_gateway_id=aws_nat_gateway.nat_a.id}tags={Name="logyx-rt-private-a"}}# Tabla privada AZ-B → NAT-Bresource"aws_route_table""private_b"{vpc_id=aws_vpc.logyx.idroute{cidr_block="0.0.0.0/0"nat_gateway_id=aws_nat_gateway.nat_b.id}tags={Name="logyx-rt-private-b"}}# Tabla datos → solo local (sin salida a internet)resource"aws_route_table""data"{vpc_id=aws_vpc.logyx.idtags={Name="logyx-rt-data"}}# Asociacionesresource"aws_route_table_association""public_a"{subnet_id=aws_subnet.public_a.id;route_table_id=aws_route_table.public.id}resource"aws_route_table_association""public_b"{subnet_id=aws_subnet.public_b.id;route_table_id=aws_route_table.public.id}resource"aws_route_table_association""app_a"{subnet_id=aws_subnet.app_a.id;route_table_id=aws_route_table.private_a.id}resource"aws_route_table_association""app_b"{subnet_id=aws_subnet.app_b.id;route_table_id=aws_route_table.private_b.id}resource"aws_route_table_association""data_a"{subnet_id=aws_subnet.data_a.id;route_table_id=aws_route_table.data.id}resource"aws_route_table_association""data_b"{subnet_id=aws_subnet.data_b.id;route_table_id=aws_route_table.data.id}resource"aws_route_table_association""mgmt_a"{subnet_id=aws_subnet.mgmt_a.id;route_table_id=aws_route_table.private_a.id}
# network/security_groups.tf# SG para ALB — solo HTTPS desde internetresource"aws_security_group""alb"{name="logyx-sg-alb"vpc_id=aws_vpc.logyx.idingress{from_port=443to_port=443protocol="tcp"cidr_blocks=["0.0.0.0/0"]description="HTTPS desde internet"}ingress{from_port=80to_port=80protocol="tcp"cidr_blocks=["0.0.0.0/0"]description="HTTP → redirige a HTTPS"}egress{from_port=8080to_port=8080protocol="tcp"security_groups=[aws_security_group.backend.id]description="Hacia backend Quarkus"}}# SG para EC2 backendresource"aws_security_group""backend"{name="logyx-sg-backend"vpc_id=aws_vpc.logyx.idingress{from_port=8080to_port=8080protocol="tcp"security_groups=[aws_security_group.alb.id]description="Solo desde ALB"}ingress{from_port=22to_port=22protocol="tcp"security_groups=[aws_security_group.bastion.id]description="SSH solo desde Bastion"}egress{from_port=5432to_port=5432protocol="tcp"security_groups=[aws_security_group.rds.id]}egress{from_port=6379to_port=6379protocol="tcp"security_groups=[aws_security_group.redis.id]}egress{from_port=443to_port=443protocol="tcp"cidr_blocks=["0.0.0.0/0"]description="HTTPS saliente (ORS API, SUNAT, etc.)"}}# SG para RDS — solo desde backendresource"aws_security_group""rds"{name="logyx-sg-rds"vpc_id=aws_vpc.logyx.idingress{from_port=5432to_port=5432protocol="tcp"security_groups=[aws_security_group.backend.id]description="PostgreSQL solo desde backend"}}# SG para Redisresource"aws_security_group""redis"{name="logyx-sg-redis"vpc_id=aws_vpc.logyx.idingress{from_port=6379to_port=6379protocol="tcp"security_groups=[aws_security_group.backend.id]}}# SG para Bastion Hostresource"aws_security_group""bastion"{name="logyx-sg-bastion"vpc_id=aws_vpc.logyx.idingress{from_port=22to_port=22protocol="tcp"cidr_blocks=[var.team_ip_cidr] # IP fija del equipodescription="SSH solo desde IP del equipo"}egress{from_port=22to_port=22protocol="tcp"security_groups=[aws_security_group.backend.id]}}
Zona privada: logyx.internal (solo resoluble dentro de la VPC)
rds.logyx.internal → RDS endpoint (resuelve al primary activo)
redis.logyx.internal → ElastiCache cluster endpoint
wazuh.logyx.internal → 10.0.30.10
# Desde EC2 backend (SSM Session Manager)psql-hrds.logyx.internal-Ulogyx_app_user-dlogyx_db-c"\conninfo"# Resultado esperado:# You are connected to database "logyx_db" as user "logyx_app_user" # on host "logyx-rds.xxxx.sa-east-1.rds.amazonaws.com" (SSL on)
Test 3: Aislamiento — desde subnet de datos, sin acceso a internet¶
# Desde instancia en subnet data (si se abre temporalmente para test)curl--max-time5https://google.com
# Resultado esperado: connection timed out (no hay ruta a internet)
Test 4: VPC Endpoint S3 funciona sin pasar por NAT¶
# Desde EC2 backendawss3lss3://logyx-documents--regionsa-east-1
# Verificar en CloudWatch que el tráfico pasó por VPC Endpoint (no por NAT)awscloudwatchget-metric-statistics\--namespaceAWS/NATGateway\--metric-nameBytesOutToDestination\--period300--statisticsSum
# → El contador de NAT NO debe incrementar durante operaciones S3
# Paso 1: Verificar instancias activasawsautoscalingdescribe-auto-scaling-groups--auto-scaling-group-nameslogyx-asg
# Paso 2: Terminar la instancia de AZ-Aawsec2terminate-instances--instance-ids<id-ec2-az-a>
# Paso 3: Verificar que el tráfico sigue respondiendo (< 30s)whiletrue;doSTATUS=$(curl-s-o/dev/null-w"%{http_code}"https://api.logyx.pe/q/health/live)echo"$(date): $STATUS"sleep5done# Resultado esperado: 200 continuo, máximo 1-2 fallas de 5 segundos durante el failover
# iperf3 entre EC2-AZ-A y EC2-AZ-B (tráfico inter-AZ)# En EC2-AZ-B (servidor):iperf3-s-p5201# En EC2-AZ-A (cliente):iperf3-c10.0.11.10-p5201-t30-P4# Resultado esperado: > 5 Gbps (red AWS entre instancias t3.medium)
# Verificar que RDS NO es accesible desde internetnmap-p5432<RDS-endpoint-hostname>
# Esperado: filtered (no response)# Verificar que EC2 backend NO tiene IP públicaawsec2describe-instances--filters"Name=tag:Name,Values=logyx-backend-*"\--query'Reservations[].Instances[].PublicIpAddress'# Esperado: [] (vacío)# Verificar Security Group del RDSawsec2describe-security-groups--group-idssg-xxxxxxxxx\--query'SecurityGroups[].IpPermissions'# Esperado: solo 5432 desde sg-backend# Listar VPC Endpoints activosawsec2describe-vpc-endpoints--filters"Name=vpc-id,Values=vpc-xxxxxxxx"
LOGYX · S2 Entregable 1 · Implementación de Red · Competencias C1.2–C1.3 · Agosto–Noviembre 2026