Aplicación web estilo Twitter desplegada en AWS ECS con pipeline CI/CD automatizado, alta disponibilidad y Service Discovery.
- Frontend: Aplicación PHP 8.0 con Apache
- Backend: MySQL 8.0 con almacenamiento persistente (EFS)
- Infraestructura: AWS ECS (EC2 launch type)
- CI/CD: CodePipeline + CodeBuild
- Networking: ALB + Route53 + Service Discovery
- Seguridad: Security Groups + IAM Roles + Parameter Store
┌─────────────┐
│ Route53 │ (lab2.appesce.ownboarding.teratest.net)
└──────┬──────┘
│
▼
┌─────────────┐
│ ALB │ (HTTPS - Puerto 443)
└──────┬──────┘
│
▼
┌──────────────────────────────────────┐
│ ECS Cluster (lab2-ecs) │
│ ┌────────────────┐ ┌──────────────┐│
│ │ Frontend │ │ Database ││
│ │ (2 tasks) │ │ (1 task) ││
│ │ lab2-frontend- │ │ MySQL 8.0 ││
│ │ container │ │ + EFS ││
│ └────────┬───────┘ └──────┬───────┘│
│ │ │ │
│ └──Service Discovery───────┘│
│ lab2-tf-database-service. │
│ database-name-space │
└───────────────────────────────────────┘
│
▼
┌──────────────┐
│ Parameter │
│ Store │
└──────────────┘
✅ Alta disponibilidad: 2 instancias del frontend en diferentes AZs
✅ CI/CD automatizado: Deploy automático con cada push a main
✅ Service Discovery: Comunicación interna mediante DNS privado
✅ Almacenamiento persistente: Base de datos con EFS
✅ HTTPS: Certificado SSL/TLS configurado
✅ Gestión de secretos: Credenciales en Parameter Store
| Componente | Tecnología | Versión |
|---|---|---|
| Frontend | PHP + Apache | 8.0 |
| Base de datos | MySQL | 8.0 |
| Orquestación | AWS ECS | - |
| CI/CD | CodePipeline + CodeBuild | - |
| Source Control | GitHub | - |
| Container Registry | Amazon ECR | - |
| Load Balancer | Application Load Balancer | - |
| DNS | Route 53 | - |
| Secrets | AWS Systems Manager Parameter Store | - |
El frontend utiliza las siguientes variables (definidas en Parameter Store):
DATABASE_HOST: Hostname del servicio MySQL via Service DiscoveryDATABASE_NAME: Nombre de la base de datosDATABASE_USER: Usuario de la base de datosDATABASE_PASSWORD: Contraseña (encriptada)
- Source: Detecta cambios en GitHub (branch
main) - Build: CodeBuild construye imagen Docker y la sube a ECR
- Deploy: ECS actualiza el servicio con la nueva imagen
- ECS Cluster:
lab2-ecs - Auto Scaling Group: 4 instancias EC2 t2.micro
- Task Definitions:
lab2-frontend-final:1,lab2-tf-database:X
- VPC:
lab2-vpc - Subnets: 2 privadas, 2 públicas
- ALB:
lab2-alb - Target Group:
lab2-tg - Security Groups: frontend, database, ALB
- EFS: Para persistencia de MySQL
- ECR:
frontend-lab2
- CodePipeline:
codepipeline-lab2 - CodeBuild:
codebuild-lab2
- Aplicación: https://lab2.appesce.ownboarding.teratest.net
- ALB: http://lab2-alb-346733634.us-east-1.elb.amazonaws.com
La aplicación incluye 4 usuarios precargados:
- Princess Leia (@Princess_Leia)
- Luke Skywalker (@Luke)
- Obi-Wan Kenobi (@Obi-Wan)
- Anakin Skywalker (@Darth_Vader)
- Credenciales almacenadas en Parameter Store (encriptadas)
- Security Groups con reglas restrictivas
- IAM Roles con permisos mínimos necesarios
- HTTPS habilitado con certificado válido
- Base de datos en subnet privada (sin acceso público)
- Frontend: 2 tasks (puede escalar a más)
- Database: 1 task (master único)
- EC2: 4 instancias (puede escalar automáticamente)
- Implementar Auto Scaling basado en CPU/memoria
- Migrar a Fargate para reducir gestión de infraestructura
- Implementar réplicas de lectura para MySQL
# Clonar repositorio
git clone <repo-url>
cd lab2
# Construir imagen
docker build -t lab2-frontend .
# Ejecutar con docker-compose
docker-compose up -d- Autoloading de clases PHP: Requerió configurar
auto_prepend_fileen Apache - Service Discovery: Configuración de DNS privado para comunicación interna
- Variables de entorno: Integración correcta con Parameter Store y ECS
- Memoria insuficiente: Escalado de instancias EC2 para soportar deployments
- EC2 vs Fargate: Elegimos EC2 por costo y control granular
- EFS vs RDS: EFS permite MySQL containerizado con persistencia
- Monorepo: Todo el código en un repositorio simplifica CI/CD
Agustín Pesce
Laboratorio 2 - Cloud/DevOps/Infraestructura
Fecha: Noviembre 2025
Versión: 1.0 (Producción)
---
## 📊 2. Diagrama de arquitectura detallado
Te recomiendo crear un diagrama visual. Puedes usar:
### **Opción A: draw.io (recomendado)**
1. Ve a https://app.diagrams.net/
2. Crea un diagrama con los componentes
3. Exporta como PNG/PDF
### **Opción B: AWS Architecture Icons**
1. Descarga iconos oficiales: https://aws.amazon.com/architecture/icons/
2. Usa PowerPoint o similar
3. Crea el diagrama
### **Componentes a incluir:**
Internet ↓ Route 53 (lab2.appesce.ownboarding.teratest.net) ↓ Application Load Balancer (lab2-alb) ↓ ┌─────────────────────────────────────────┐ │ ECS Cluster (lab2-ecs) │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ Frontend │ │ Database │ │ │ │ Service │───▶│ Service │ │ │ │ (2 tasks) │ │ (1 task) │ │ │ └──────────────┘ └──────────────┘ │ │ ↓ ↓ │ │ Target Group EFS Volume │ └─────────────────────────────────────────┘ ↓ ↓ Parameter Store CloudWatch Logs
GitHub → CodePipeline → CodeBuild → ECR → ECS
Decisión: EC2 launch type
Razones:
- ✅ Menor costo para cargas pequeñas
- ✅ Mayor control sobre las instancias
- ✅ Aprendizaje de gestión de infraestructura
- ❌ Requiere gestión de Auto Scaling Group
- ❌ Mayor complejidad operativa
Alternativa considerada: Fargate (serverless)
- Mayor costo
- Menor control
- Más simple de operar
Decisión: MySQL containerizado con EFS
Razones:
- ✅ Parte del ejercicio de containerización
- ✅ Control total sobre configuración
- ✅ Menor costo
- ❌ Requiere gestión de persistencia (EFS)
- ❌ Sin alta disponibilidad automática
Alternativa considerada: Amazon RDS
- Mayor costo
- Alta disponibilidad built-in
- Backups automáticos
- Menor control
Decisión: AWS Cloud Map (Service Discovery)
Razones:
- ✅ Desacoplamiento de servicios
- ✅ DNS privado automático
- ✅ Escalabilidad futura
- ✅ No requiere cambiar código al escalar
Alternativa considerada: IPs/DNS hardcoded
- Más simple inicialmente
- Frágil ante cambios
- No escalable
Decisión: AWS Systems Manager Parameter Store
Razones:
- ✅ Encriptación de secretos
- ✅ Gestión centralizada
- ✅ Rotación de credenciales sin rebuild
- ✅ Auditoría con CloudTrail
Alternativa considerada: Environment variables directas
- Menos seguro
- Credenciales en texto plano
- Más difícil rotar
Decisión: Monorepo (todo en un repositorio)
Razones:
- ✅ Simplicidad para proyecto pequeño
- ✅ Un solo pipeline
- ✅ Cambios atómicos
Alternativa considerada: Repos separados frontend/infra
- Mayor complejidad
- Múltiples pipelines
- Mejor para equipos grandes
- La aplicación carga en HTTPS
- Se muestran los 4 usuarios
- Al hacer click en un usuario se ven sus tweets
- La navegación entre usuarios funciona
- No hay errores 500
- Hay 2 tasks del frontend corriendo
- Target Group muestra 2 targets healthy
- Si se detiene 1 task, el ALB enruta al otro
- Un push a
maindispara el pipeline - El pipeline completa exitosamente (verde)
- La nueva versión se despliega automáticamente
- El tiempo de deployment es ~10 minutos
- Los datos de MySQL persisten entre reinicios
- EFS está montado correctamente
- Credenciales en Parameter Store (encriptadas)
- Security Groups permiten solo tráfico necesario
- Base de datos en subnet privada
- HTTPS configurado correctamente
- Logs visibles en CloudWatch
- Métricas de ECS disponibles
- Historial de deployments en CodePipeline