Balanceadores de Carga AWS
¿Qué es un Load Balancer?
Un Load Balancer (balanceador de carga) distribuye el tráfico entrante entre varios servidores para mejorar la disponibilidad y el rendimiento.
┌─────────────────────────────────────────────────────────────┐
│ LOAD BALANCER - CONCEPTO │
├─────────────────────────────────────────────────────────────┤
│ │
│ Usuarios │
│ (1000 solicitudes) │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Load Balancer│ │
│ │ │ │
│ │ Distribuye │ │
│ │ el tráfico │ │
│ └──────┬───────┘ │
│ │ │
│ ┌─────────────┼─────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Server │ │ Server │ │ Server │ │
│ │ 1 │ │ 2 │ │ 3 │ │
│ │ ~333 │ │ ~333 │ │ ~333 │ │
│ │ req │ │ req │ │ req │ │
│ └────────┘ └────────┘ └────────┘ │
│ │
│ Ventajas: │
│ ✅ Distribución de carga │
│ ✅ Alta disponibilidad │
│ ✅ Escalado horizontal │
│ ✅ Health checks automáticos │
│ │
└─────────────────────────────────────────────────────────────┘
Tipos de Load Balancers AWS
Comparación
┌─────────────────────────────────────────────────────────────┐
│ TIPOS DE LOAD BALANCERS AWS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ALB (Application) NLB (Network) │ │
│ │ ───────────────── ─────────────── │ │
│ │ Capa 7 (HTTP) Capa 4 (TCP/UDP) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ HTTP/HTTPS │ │ TCP/UDP │ │ │
│ │ │ │ │ │ │ │
│ │ │ Routing por │ │ Ultra-rápido│ │ │
│ │ │ path │ │ millones │ │ │
│ │ │ │ │ req/seg │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ Casos de uso: Casos de uso: │ │
│ │ • Sitios web • Gaming │ │
│ │ • APIs REST • IoT │ │
│ │ • Microservicios • VoIP │ │
│ │ • TCP puro │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ GWLB (Gateway) CLB (Classic) │ │
│ │ ────────────── ───────────── │ │
│ │ Capa 3 (IP) Legado │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Appliances │ │ ANTIGUO │ │ │
│ │ │ virtuales │ │ A evitar │ │ │
│ │ │ │ │ │ │ │
│ │ │ Firewalls │ │ Use │ │ │
│ │ │ IDS/IPS │ │ ALB/NLB │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Tabla Comparativa
| Característica | ALB | NLB | GWLB | CLB |
|---|---|---|---|---|
| Capa OSI | 7 | 4 | 3 | 4/7 |
| Protocolos | HTTP, HTTPS, gRPC | TCP, UDP, TLS | IP | TCP, SSL, HTTP |
| Rendimiento | Bueno | Ultra | Muy bueno | Medio |
| IP estática | No | Sí | Sí | No |
| WebSocket | Sí | Sí | No | Sí |
| Routing avanzado | Sí | No | No | No |
| Precio | $$ | $$$ | $$$ | $ |
| Recomendado | ✅ Web | ✅ TCP | Firewalls | ❌ Legado |
Application Load Balancer (ALB)
Arquitectura ALB
┌─────────────────────────────────────────────────────────────┐
│ ARQUITECTURA ALB │
├─────────────────────────────────────────────────────────────┤
│ │
│ Internet │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ ALB │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ LISTENERS │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ Puerto 80 │ │ Puerto 443 │ │ │ │
│ │ │ │ HTTP │ │ HTTPS │ │ │ │
│ │ │ └─────┬──────┘ └─────┬──────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ └────────┼──────────────────┼─────────────────────┘ │ │
│ │ │ │ │ │
│ │ ┌────────┼──────────────────┼─────────────────────┐ │ │
│ │ │ │ RULES │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ IF path=/api/* IF path=/images/* │ │ │
│ │ │ │ │ │ │ │
│ │ └────────┼──────────────────┼─────────────────────┘ │ │
│ │ │ │ │ │
│ └───────────┼──────────────────┼─────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌───────────────────┐ ┌───────────────────┐ │
│ │ TARGET GROUP │ │ TARGET GROUP │ │
│ │ "api-servers" │ │ "image-servers" │ │
│ │ │ │ │ │
│ │ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │ │
│ │ │EC2 │ │EC2 │ │ │ │EC2 │ │EC2 │ │ │
│ │ └────┘ └────┘ │ │ └────┘ └────┘ │ │
│ └───────────────────┘ └───────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Componentes ALB
| Componente | Descripción | Ejemplo |
|---|---|---|
| Listener | Punto de entrada (puerto) | HTTP:80, HTTPS:443 |
| Rule | Condición de routing | IF path=/api/* THEN... |
| Target Group | Grupo de servidores destino | EC2, IP, Lambda |
| Target | Servidor individual | i-xxx en puerto 8080 |
Routing Avanzado ALB
┌─────────────────────────────────────────────────────────────┐
│ REGLAS DE ROUTING ALB │
├─────────────────────────────────────────────────────────────┤
│ │
│ Condiciones disponibles: │
│ │
│ • Path : /api/*, /images/*, /static/* │
│ • Host : api.example.com, www.example.com │
│ • Headers : X-Custom-Header = value │
│ • Query : ?version=v2 │
│ • Source IP : 10.0.0.0/8 │
│ • HTTP Method : GET, POST │
│ │
│ Ejemplo de reglas: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Rule 1: IF path = /api/* │ │
│ │ THEN forward to tg-api-servers │ │
│ │ │ │
│ │ Rule 2: IF host = admin.example.com │ │
│ │ THEN forward to tg-admin │ │
│ │ │ │
│ │ Rule 3: IF query = ?v2 │ │
│ │ THEN forward to tg-api-v2 │ │
│ │ │ │
│ │ Default: forward to tg-web-servers │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Configuración ALB
Vía AWS CLI
# 1. Crear el Target Group
aws elbv2 create-target-group \
--name tg-web-servers \
--protocol HTTP \
--port 80 \
--vpc-id vpc-xxx \
--target-type instance \
--health-check-path /health \
--health-check-interval-seconds 30
# 2. Crear el ALB
aws elbv2 create-load-balancer \
--name my-alb \
--subnets subnet-1a subnet-1b subnet-1c \
--security-groups sg-alb \
--scheme internet-facing \
--type application
# 3. Crear el Listener HTTP
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:...:my-alb \
--protocol HTTP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=arn:aws:...:tg-web-servers
# 4. Registrar los targets
aws elbv2 register-targets \
--target-group-arn arn:aws:...:tg-web-servers \
--targets Id=i-server1 Id=i-server2
Security Group para ALB
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUPS ALB + EC2 │
├─────────────────────────────────────────────────────────────┤
│ │
│ sg-alb (para el Load Balancer) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Inbound: │ │
│ │ HTTP (80) from 0.0.0.0/0 │ │
│ │ HTTPS (443) from 0.0.0.0/0 │ │
│ │ │ │
│ │ Outbound: │ │
│ │ HTTP (80) to sg-web-servers │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ sg-web-servers (para los EC2) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Inbound: │ │
│ │ HTTP (80) from sg-alb ← SOLO desde ALB │ │
│ │ SSH (22) from sg-bastion │ │
│ │ │ │
│ │ Outbound: │ │
│ │ Todo el tráfico a 0.0.0.0/0 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ Los EC2 solo aceptan tráfico HTTP DESDE el ALB │
│ → No es posible acceder directamente a los EC2 │
│ │
└─────────────────────────────────────────────────────────────┘
Network Load Balancer (NLB)
¿Cuándo usar NLB?
┌─────────────────────────────────────────────────────────────┐
│ ¿CUÁNDO USAR NLB? │
├─────────────────────────────────────────────────────────────┤
│ │
│ ✅ USE NLB PARA: │
│ │
│ • Rendimiento extremo (millones de solicitudes/seg) │
│ • Latencia ultra-baja (< 100 μs) │
│ • Protocolos TCP/UDP puros (no HTTP) │
│ • Necesidad de IP estática │
│ • Gaming, IoT, streaming │
│ • Aplicaciones que no soportan proxy │
│ │
│ ❌ NO USE NLB PARA: │
│ │
│ • Sitios web estándar (use ALB) │
│ • APIs REST (use ALB) │
│ • Necesidad de routing por path/host │
│ │
│ Características NLB: │
│ • Preserva la IP fuente del cliente │
│ • IP estática o Elastic IP posible │
│ • Aislamiento zonal (failover por AZ) │
│ • Cross-zone load balancing (opcional) │
│ │
└─────────────────────────────────────────────────────────────┘
Costos de los Load Balancers
┌─────────────────────────────────────────────────────────────┐
│ ESTIMACIÓN DE COSTOS (us-east-1) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ALB: │
│ • $0.0225 / hora ≈ $16 / mes (fijo) │
│ • $0.008 / LCU-hora (uso) │
│ • Estimación típica: $20-50 / mes │
│ │
│ NLB: │
│ • $0.0225 / hora ≈ $16 / mes (fijo) │
│ • $0.006 / NLCU-hora (uso) │
│ • Estimación típica: $20-100 / mes │
│ │
│ LCU (Load Balancer Capacity Unit): │
│ Basado en: │
│ • Nuevas conexiones / segundo │
│ • Conexiones activas │
│ • Datos procesados │
│ │
└─────────────────────────────────────────────────────────────┘
Resumen
| Aspecto | ALB | NLB |
|---|---|---|
| Capa | 7 (HTTP) | 4 (TCP) |
| Casos de uso | Web, API | TCP puro, gaming |
| Routing avanzado | ✅ Sí | ❌ No |
| IP estática | ❌ No | ✅ Sí |
| Rendimiento | Bueno | Extremo |
| Recomendación | 90% de los casos | Casos especiales |
Próxima sección: Health Checks