Lab : Publicación de un Servicio Web
Objetivo del Lab
En este laboratorio, usted va a diseñar y documentar el despliegue de un servicio web completo en AWS. Analizará las diferentes opciones de arquitectura y producirá un plan de despliegue.
Este laboratorio está enfocado en el diseño y documentación. Utilizará los comandos CLI para simular con LocalStack si está disponible.
Contexto
Usted está encargado de desplegar la aplicación BlogPro, una plataforma de blogging para empresas.
Requisitos Funcionales
┌─────────────────────────────────────────────────────────────┐
│ REQUISITOS BLOGPRO │
├─────────────────────────────────────────────────────────────┤
│ │
│ APLICACIÓN │
│ • Sitio web accesible vía HTTPS │
│ • API backend (Node.js o Python) │
│ • Base de datos MySQL │
│ • Almacenamiento de imágenes (S3) │
│ │
│ RENDIMIENTO │
│ • Tiempo de respuesta < 500ms │
│ • Soporte para 1000 usuarios simultáneos │
│ │
│ DISPONIBILIDAD │
│ • 99.9% uptime (máx. 8h de inactividad/año) │
│ • Cero downtime durante los despliegues │
│ │
│ SEGURIDAD │
│ • Certificado SSL/TLS │
│ • Base de datos no accesible desde Internet │
│ • Cumplimiento de buenas prácticas AWS │
│ │
│ PRESUPUESTO │
│ • Aproximadamente $200-300/mes │
│ │
└─────────────────────────────────────────────────────────────┘
Parte 1 : Diseño de la Arquitectura
Ejercicio 1.1 : Elección de la Arquitectura
Analice las siguientes tres opciones y elija la mejor para BlogPro:
Opción A : Arquitectura Simple
Internet → IGW → EC2 (pública) → RDS (privada)
Opción B : Arquitectura con ALB
Internet → IGW → ALB → EC2 (privada) → RDS (privada)
Opción C : Arquitectura Serverless
Internet → CloudFront → API Gateway → Lambda → RDS/DynamoDB
Su análisis:
| Criterio | Opción A | Opción B | Opción C |
|---|---|---|---|
| Costo estimado | ? | ? | ? |
| Alta disponibilidad | ? | ? | ? |
| Escalabilidad | ? | ? | ? |
| Complejidad | ? | ? | ? |
| ¿Adecuado para BlogPro? | ? | ? | ? |
💡 Solución sugerida
| Criterio | Opción A | Opción B | Opción C |
|---|---|---|---|
| Costo estimado | ~$50/mes | ~$200/mes | Variable |
| Alta disponibilidad | ❌ No | ✅ Sí | ✅ Sí |
| Escalabilidad | ❌ Limitada | ✅ Buena | ✅✅ Excelente |
| Complejidad | ⭐ Simple | ⭐⭐ Media | ⭐⭐⭐ Compleja |
| ¿Adecuado para BlogPro? | ❌ | ✅ | ❌ (over-engineering) |
Recomendación: Opción B
- Cumple con los requisitos de alta disponibilidad y rendimiento
- Costo dentro del presupuesto
- Complejidad razonable para el equipo
Ejercicio 1.2 : Esquema de Arquitectura
Dibuje la arquitectura completa con todos los componentes:
Plantilla:
┌─────────────────────────────────────────────────────────────────────────┐
│ ARQUITECTURA BLOGPRO │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ INTERNET │
│ │ │
│ [Su esquema aquí] │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
💡 Esquema solución
┌─────────────────────────────────────────────────────────────────────────┐
│ ARQUITECTURA BLOGPRO │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Usuarios / Internet │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Route 53 │ blog.example.com │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ CloudFront │ CDN + SSL │
│ └────────┬────────┘ │
│ │ │
│ ┌─────────────────────────┼─────────────────────────────────┐ │
│ │ VPC │ (10.0.0.0/16) │ │
│ │ │ │ │
│ │ ┌──────────▼──────────┐ │ │
│ │ │ IGW │ │ │
│ │ └──────────┬──────────┘ │ │
│ │ │ │ │
│ │ ┌─────────────────────┼─────────────────────────┐ │ │
│ │ │ SUBREDES PÚBLICAS │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────────┐ ┌─────▼─────┐ ┌─────────┐ │ │ │
│ │ │ │ NAT GW │ │ ALB │ │ NAT GW │ │ │ │
│ │ │ │ 1a │ │ │ │ 1b │ │ │ │
│ │ │ └────┬────┘ └─────┬─────┘ └────┬────┘ │ │ │
│ │ └───────┼─────────────┼─────────────┼──────────┘ │ │
│ │ │ │ │ │ │
│ │ ┌───────┼─────────────┼─────────────┼──────────┐ │ │
│ │ │ SUBREDES PRIVADAS │ │ │ │
│ │ │ │ ┌────┴────┐ │ │ │ │
│ │ │ ┌────────▼────┤ ├────▼────────┐ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │ │
│ │ │ │ │ EC2 │ │ │ │ EC2 │ │ │ │ │
│ │ │ │ │ App 1 │ │ │ │ App 2 │ │ │ │ │
│ │ │ │ └───┬───┘ │ │ └───┬───┘ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ └──────┼──────┘ └──────┼──────┘ │ │ │
│ │ └─────────┼───────────────────────┼───────────┘ │ │
│ │ │ │ │ │
│ │ ┌─────────┼───────────────────────┼───────────┐ │ │
│ │ │ SUBREDES DB │ │ │ │
│ │ │ │ ┌──────────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌────▼────▼────┐ │ │ │
│ │ │ │ RDS │ │ │ │
│ │ │ │ Multi-AZ │ │ │ │
│ │ │ │ MySQL │ │ │ │
│ │ │ └──────────────┘ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ S3 Bucket │ │ │
│ │ │ (imágenes/assets) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────┘
Parte 2 : Plan de Direccionamiento IP
Ejercicio 2.1 : Definir los CIDR
Complete el plan de direccionamiento:
| Recurso | CIDR | IPs Utilizables | Uso |
|---|---|---|---|
| VPC | 10.0.0.0/16 | 65,531 | - |
| Subred Pública 1a | ? | ? | ALB, NAT |
| Subred Pública 1b | ? | ? | ALB, NAT |
| Subred Privada 1a | ? | ? | Servidores de aplicación |
| Subred Privada 1b | ? | ? | Servidores de aplicación |
| Subred DB 1a | ? | ? | RDS |
| Subred DB 1b | ? | ? | RDS |
💡 Solución
| Recurso | CIDR | IPs Utilizables | Uso |
|---|---|---|---|
| VPC | 10.0.0.0/16 | 65,531 | - |
| Subred Pública 1a | 10.0.1.0/24 | 251 | ALB, NAT |
| Subred Pública 1b | 10.0.2.0/24 | 251 | ALB, NAT |
| Subred Privada 1a | 10.0.11.0/24 | 251 | Servidores de aplicación |
| Subred Privada 1b | 10.0.12.0/24 | 251 | Servidores de aplicación |
| Subred DB 1a | 10.0.21.0/24 | 251 | RDS |
| Subred DB 1b | 10.0.22.0/24 | 251 | RDS |
Parte 3 : Configuración de Seguridad
Ejercicio 3.1 : Security Groups
Defina las reglas para cada Security Group:
sg-alb :
Inbound:
- Tipo: ?, Puerto: ?, Origen: ?
- Tipo: ?, Puerto: ?, Origen: ?
Outbound:
- Tipo: ?, Puerto: ?, Destino: ?
sg-app :
Inbound:
- Tipo: ?, Puerto: ?, Origen: ?
- Tipo: ?, Puerto: ?, Origen: ?
Outbound:
- Tipo: ?, Puerto: ?, Destino: ?
- Tipo: ?, Puerto: ?, Destino: ?
sg-db :
Inbound:
- Tipo: ?, Puerto: ?, Origen: ?
Outbound:
- Tipo: ?, Puerto: ?, Destino: ?
💡 Solución
sg-alb :
Inbound:
- Tipo: HTTPS, Puerto: 443, Origen: 0.0.0.0/0
- Tipo: HTTP, Puerto: 80, Origen: 0.0.0.0/0 (redirección a HTTPS)
Outbound:
- Tipo: HTTP, Puerto: 80, Destino: sg-app
sg-app :
Inbound:
- Tipo: HTTP, Puerto: 80, Origen: sg-alb
- Tipo: SSH, Puerto: 22, Origen: sg-bastion (o IP admin)
Outbound:
- Tipo: MySQL, Puerto: 3306, Destino: sg-db
- Tipo: HTTPS, Puerto: 443, Destino: 0.0.0.0/0 (APIs, actualizaciones)
sg-db :
Inbound:
- Tipo: MySQL, Puerto: 3306, Origen: sg-app
Outbound:
- (Ninguna regla explícita necesaria - stateful)
Parte 4 : Plan de Validación
Ejercicio 4.1 : Pruebas End-to-End
Liste las pruebas a realizar para validar el despliegue:
| Prueba | Comando/Acción | Resultado Esperado |
|---|---|---|
| Resolución DNS | ? | ? |
| HTTPS accesible | ? | ? |
| Health check | ? | ? |
| Conexión DB | ? | ? |
| Failover AZ | ? | ? |
💡 Solución
| Prueba | Comando/Acción | Resultado Esperado |
|---|---|---|
| Resolución DNS | nslookup blog.example.com | Devuelve IP ALB |
| HTTPS accesible | curl -I https://blog.example.com | HTTP 200 OK |
| Health check | curl https://blog.example.com/health | status: healthy |
| Conexión DB | Log de la aplicación | Database connected |
| Failover AZ | Detener instancia AZ-a | Sitio sigue accesible |
| Balanceo de carga | Varias peticiones | Respuestas de ambas instancias |
| Certificado SSL | Verificación en navegador | Certificado válido |
Parte 5 : Documentación
Entregable Final
Produzca un documento que contenga:
-
Esquema de arquitectura (con todos los componentes)
-
Tabla de direccionamiento IP
-
Matriz de Security Groups
-
Plan de pruebas de validación
-
Estimación de costos:
| Servicio | Configuración | Costo Mensual |
|---|---|---|
| EC2 (x2) | t3.medium | ~$60 |
| RDS | db.t3.small Multi-AZ | ~$50 |
| ALB | + transferencia de datos | ~$30 |
| NAT Gateway (x2) | + datos | ~$70 |
| Route 53 | 1 zona hospedada | ~$1 |
| Total | ~$211/mes |
- Riesgos identificados y mitigaciones
Criterios de Evaluación
| Criterio | Puntos |
|---|---|
| Arquitectura correcta y completa | /25 |
| Plan de direccionamiento coherente | /15 |
| Security Groups bien configurados | /20 |
| Pruebas de validación pertinentes | /15 |
| Estimación de costos realista | /10 |
| Calidad de la documentación | /15 |
| Total | /100 |
Bonus : Script de Despliegue
Si tiene acceso a LocalStack, pruebe estos comandos:
#!/bin/bash
# deploy-blogpro.sh
ENDPOINT="--endpoint-url=http://localhost:4566"
# 1. Crear el VPC
VPC_ID=$(aws $ENDPOINT ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--query 'Vpc.VpcId' --output text)
echo "VPC creado: $VPC_ID"
# 2. Crear las subredes públicas
SUBNET_PUB_1A=$(aws $ENDPOINT ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.1.0/24 \
--availability-zone us-east-1a \
--query 'Subnet.SubnetId' --output text)
echo "Subred pública 1a: $SUBNET_PUB_1A"
# ... continuar con los demás recursos
Próxima sección : Pruebas y Validación