⚖️

Load Balancing y Auto Scaling

Balanceadores de carga y escalado automático

⏱️ Tiempo estimado de lectura: 20 minutos

Elastic Load Balancer - Introducción

Los load balancers distribuyen el tráfico entrante entre múltiples targets (instancias EC2, containers, IPs) en una o más Availability Zones.

Tipos de ELB:
- Application Load Balancer (ALB): Capa 7 (HTTP/HTTPS), routing basado en contenido
- Network Load Balancer (NLB): Capa 4 (TCP/UDP/TLS), ultra alto rendimiento
- Gateway Load Balancer (GWLB): Capa 3 (IP), para appliances virtuales
- Classic Load Balancer (CLB): Legacy, capa 4 y 7 (no recomendado)

Beneficios:
- Alta disponibilidad automática multi-AZ
- Health checks para detectar instancias no saludables
- SSL/TLS termination
- Separación de tráfico público/privado
- Escalado automático de capacidad
- Integración con servicios AWS (Auto Scaling, CloudWatch, Route53)

Puntos Clave

  • Load Balancers son managed por AWS (HA, scaling automático)
  • ALB para HTTP/HTTPS, NLB para TCP/UDP extremo rendimiento
  • Health checks determinan si target puede recibir tráfico
  • ELB solo funciona en una región (no cross-region)
  • Targets pueden estar en múltiples AZ (recomendado)

Application Load Balancer (ALB)

ALB opera en la capa 7 (HTTP/HTTPS) y permite routing avanzado basado en contenido.

Características:
- Target Groups: Agrupa targets (EC2, ECS, Lambda, IP)
- Routing rules: Basado en path, hostname, query strings, headers
- Soporte HTTP/2 y WebSocket
- Redirects: HTTP a HTTPS automático
- Fixed response: Respuestas estáticas sin backend

Routing avanzado:
- Path-based: /api/* → Target Group A, /images/* → Target Group B
- Hostname-based: api.example.com → TG A, www.example.com → TG B
- Query string: ?platform=mobile → TG Mobile
- Headers: User-Agent: iPhone → TG iOS

Casos de uso:
- Microservicios y aplicaciones basadas en containers
- Lambda functions como targets
- Múltiples aplicaciones en mismas instancias (diferentes paths)
- Routing inteligente basado en contenido de request

Puntos Clave

  • ALB puede routear a múltiples target groups
  • Health checks se configuran a nivel de target group
  • Soporta SSL/TLS termination con certificados ACM
  • Connection draining evita requests fallidos durante scaling
  • X-Forwarded-For header contiene IP original del cliente

Network Load Balancer (NLB)

NLB opera en capa 4 (TCP/UDP/TLS) y está diseñado para manejar millones de requests por segundo con latencia ultra-baja.

Características:
- Ultra alto rendimiento: Millones RPS, latencia <100μs
- IP estática: Una IP elástica por AZ
- Preserva IP origen: Targets ven IP real del cliente
- Protocolos: TCP, UDP, TLS
- Zonal isolation: Fallo de AZ no afecta otras AZ

Diferencias con ALB:
- NLB = Capa 4 (no ve contenido HTTP)
- ALB = Capa 7 (routing basado en HTTP)
- NLB tiene latencia mucho menor
- NLB preserva IP origen (ALB usa X-Forwarded-For)
- NLB soporta IP estática (ALB solo DNS)

Casos de uso:
- Gaming (baja latencia crítica)
- IoT (millones de conexiones TCP)
- Aplicaciones que requieren IP estática
- Tráfico extremo no-HTTP (ej: bases de datos)

Puntos Clave

  • NLB para rendimiento extremo y latencia ultra-baja
  • ALB para routing inteligente HTTP/HTTPS
  • NLB tiene IP estática, ideal para whitelisting
  • Security Groups no se aplican a NLB (solo en targets)
  • NLB puede routear a targets fuera de AWS (on-prem via IP)

SSL/TLS en Load Balancers

Los Load Balancers pueden terminar SSL/TLS, descifrando tráfico HTTPS y enviando HTTP a targets.

SSL Termination:
- Listener HTTPS: LB descifra tráfico entrante
- Backend HTTP: Tráfico LB → Targets sin cifrar (red AWS privada)
- Backend HTTPS: End-to-end encryption (más CPU)

Gestión de certificados:
- AWS Certificate Manager (ACM): Certificados gratuitos, renovación automática
- Import: Subir certificado de terceros
- SNI (Server Name Indication): Múltiples certificados SSL en mismo listener

SNI (Server Name Indication):
- Permite múltiples sitios HTTPS con diferentes certificados
- Cliente indica hostname en SSL handshake
- LB selecciona certificado correcto
- Soportado por: ALB, NLB, CloudFront (NO Classic LB)

Políticas SSL:
- Defines qué protocolos y cifrados se permiten
- Recomendado: TLS 1.2+, deshabilitar SSL 3.0, TLS 1.0, TLS 1.1

Puntos Clave

  • SSL termination reduce carga CPU en instancias backend
  • ACM proporciona certificados gratuitos con renovación automática
  • SNI permite múltiples dominios con diferentes certificados
  • Classic LB: un certificado por LB (sin SNI)
  • ALB/NLB: múltiples certificados con SNI

Auto Scaling Groups (ASG)

Auto Scaling Groups automáticamente ajustan el número de instancias EC2 según demanda.

Componentes:
- Launch Template/Configuration: Define qué lanzar (AMI, tipo, storage, SG)
- Min/Max/Desired Capacity: Límites de escalado
- Scaling Policies: Cuándo y cómo escalar
- Health Checks: EC2 (default) o ELB (recomendado)

Tipos de Scaling:

Manual Scaling:
- Cambiar desired capacity manualmente

Scheduled Scaling:
- Basado en patrones predecibles (ej: aumentar a las 9am)

Dynamic Scaling:
- Target Tracking: Mantener métrica en valor target (ej: CPU 50%)
- Step Scaling: Escalar en pasos según alarmas CloudWatch
- Simple Scaling: Legacy, un cambio por alarma con cooldown

Predictive Scaling:
- ML predice tráfico futuro
- Provisiona instancias proactivamente

Puntos Clave

  • ASG es gratis, solo pagas por instancias lanzadas
  • Launch Template es más nuevo y flexible que Launch Configuration
  • ELB health checks reemplazan instancias que fallan health check
  • Cooldown period previene escalado excesivo (default 300s)
  • Target Tracking es el más simple y recomendado

💻 Creación de Auto Scaling Group

# Crear Launch Template
aws ec2 create-launch-template \n  --launch-template-name mi-template \n  --version-description v1 \n  --launch-template-data '{
    "ImageId": "ami-0c55b159cbfafe1f0",
    "InstanceType": "t3.micro",
    "SecurityGroupIds": ["sg-0123456789abcdef0"]
  }'

# Crear Auto Scaling Group
aws autoscaling create-auto-scaling-group \n  --auto-scaling-group-name mi-asg \n  --launch-template LaunchTemplateName=mi-template \n  --min-size 1 --max-size 5 --desired-capacity 2 \n  --vpc-zone-identifier "subnet-aaa,subnet-bbb" \n  --target-group-arns arn:aws:elasticloadbalancing:...