Saltar al contenido principal

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.

Formato del Lab

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:

CriterioOpción AOpción BOpción C
Costo estimado???
Alta disponibilidad???
Escalabilidad???
Complejidad???
¿Adecuado para BlogPro????
💡 Solución sugerida
CriterioOpción AOpción BOpción C
Costo estimado~$50/mes~$200/mesVariable
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:

RecursoCIDRIPs UtilizablesUso
VPC10.0.0.0/1665,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
RecursoCIDRIPs UtilizablesUso
VPC10.0.0.0/1665,531-
Subred Pública 1a10.0.1.0/24251ALB, NAT
Subred Pública 1b10.0.2.0/24251ALB, NAT
Subred Privada 1a10.0.11.0/24251Servidores de aplicación
Subred Privada 1b10.0.12.0/24251Servidores de aplicación
Subred DB 1a10.0.21.0/24251RDS
Subred DB 1b10.0.22.0/24251RDS

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:

PruebaComando/AcciónResultado Esperado
Resolución DNS??
HTTPS accesible??
Health check??
Conexión DB??
Failover AZ??
💡 Solución
PruebaComando/AcciónResultado Esperado
Resolución DNSnslookup blog.example.comDevuelve IP ALB
HTTPS accesiblecurl -I https://blog.example.comHTTP 200 OK
Health checkcurl https://blog.example.com/healthstatus: healthy
Conexión DBLog de la aplicaciónDatabase connected
Failover AZDetener instancia AZ-aSitio sigue accesible
Balanceo de cargaVarias peticionesRespuestas de ambas instancias
Certificado SSLVerificación en navegadorCertificado válido

Parte 5 : Documentación​

Entregable Final​

Produzca un documento que contenga:

  1. Esquema de arquitectura (con todos los componentes)

  2. Tabla de direccionamiento IP

  3. Matriz de Security Groups

  4. Plan de pruebas de validación

  5. Estimación de costos:

ServicioConfiguraciónCosto Mensual
EC2 (x2)t3.medium~$60
RDSdb.t3.small Multi-AZ~$50
ALB+ transferencia de datos~$30
NAT Gateway (x2)+ datos~$70
Route 531 zona hospedada~$1
Total~$211/mes
  1. Riesgos identificados y mitigaciones

Criterios de Evaluación​

CriterioPuntos
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