Agregar un Load Balancer a ECS
🎯 ¿Por qué usar un Load Balancer?
Al desplegar aplicaciones en ECS, un balanceador de carga (Load Balancer) proporciona numerosos beneficios en comparación con el acceso directo a los contenedores a través de sus direcciones IP:
- Punto de enlace estable que no cambia cuando los contenedores se reinician.
- Escalado automático a través de múltiples tareas.
- Health checks (controles de salud) para dirigir el tráfico solo a contenedores sanos.
- Alta disponibilidad al distribuir el tráfico en múltiples Zonas de Disponibilidad (Availability Zones).
📊 Load Balancer vs. Acceso por IP Directa
| Característica | Con Load Balancer | Acceso por IP Directa (Tarea única) |
|---|---|---|
| Estabilidad del punto de acceso | ✅ Nombre DNS estable que nunca cambia | ❌ La IP cambia cuando las tareas se reinician |
| Escalado | ✅ Distribuye el tráfico en múltiples tareas | ❌ Limitado a la capacidad de una sola tarea |
| Alta Disponibilidad | ✅ Sigue funcionando si tareas individuales fallan | ❌ Servicio no disponible si la tarea falla |
| Health Checks | ✅ Monitoreo automático y eliminación de tareas fallidas | ❌ Sin controles de salud; requiere monitoreo manual |
| Distribución de Tráfico | ✅ Enrutamiento inteligente (round-robin, etc.) | ❌ Sin distribución; todo el tráfico va a una tarea |
| Terminación SSL/TLS | ✅ Gestión centralizada de certificados e HTTPS | ❌ Debe implementarse TLS en cada contenedor |
| Seguridad | ✅ Integración con WAF y grupos de seguridad | ❌ Controles de seguridad necesarios en cada tarea |
🔄 Arquitectura con Load Balancer
📚 Entendiendo cada Componente
1. Application Load Balancer (ALB)
Un servicio que distribuye el tráfico entrante de aplicaciones entre múltiples destinos.
- Función: Punto de entrada para todo el tráfico de usuarios.
- Beneficio: Proporciona un nombre DNS estable para acceder a tu aplicación.
2. Target Group
Un grupo de destinos (tareas de ECS) a los que el balanceador de carga dirige el tráfico.
- Función: Define qué tareas reciben tráfico y cómo se comprueba su salud.
- Configuración: Ajustes de health check, protocolos y puertos.
3. Servicio ECS con Integración de Load Balancer
El servicio de ECS configurado para registrar tareas automáticamente con el Target Group.
- Función: Mantiene el conteo de tareas y las registra/elimina del Target Group.
- Beneficio: Maneja automáticamente las tareas que no están sanas.
📝 Pasos de Implementación
Usa VS Code Server para ejecutar estos comandos:
1️⃣ Crear un Target Group
# Obtener ID de la VPC por defecto
VPC_ID=$(aws ec2 describe-vpcs \
--filters Name=isDefault,Values=true \
--query 'Vpcs[0].VpcId' \
--output text)
# Crear el target group
aws elbv2 create-target-group \
--name rent-a-room-tg \
--protocol HTTP \
--port 80 \
--vpc-id $VPC_ID \
--target-type ip \
--health-check-path / \
--health-check-interval-seconds 30 \
--health-check-timeout-seconds 5 \
--healthy-threshold-count 2 \
--unhealthy-threshold-count 22️⃣ Crear un Application Load Balancer
# Crear grupo de seguridad para el ALB
ALB_SG_ID=$(aws ec2 create-security-group \
--group-name rent-a-room-alb-sg \
--description "Security group for Rent-A-Room ALB" \
--vpc-id $VPC_ID \
--query 'GroupId' \
--output text)
# Permitir HTTP entrante desde cualquier lugar
aws ec2 authorize-security-group-ingress \
--group-id $ALB_SG_ID \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
# Obtener el ID del grupo de seguridad del servicio ECS
ECS_SG_ID=$(aws ec2 describe-security-groups \
--filters Name=group-name,Values=ecs-rent-a-room-sg \
--query 'SecurityGroups[0].GroupId' \
--output text)
# Actualizar el grupo de seguridad de ECS para permitir tráfico desde el ALB
aws ec2 authorize-security-group-ingress \
--group-id $ECS_SG_ID \
--protocol tcp \
--port 80 \
--source-group $ALB_SG_ID
# Obtener IDs de las subredes
SUBNET_IDS=$(aws ec2 describe-subnets \
--filters Name=vpc-id,Values=$VPC_ID \
--query 'Subnets[*].SubnetId' \
--output json | tr -d '[:space:]')
# Crear el load balancer
aws elbv2 create-load-balancer \
--name rent-a-room-alb \
--subnets $(echo $SUBNET_IDS | sed 's/\[//g' | sed 's/\]//g' | sed 's/,/ /g' | sed 's/"//g') \
--security-groups $ALB_SG_ID
# Almacenar el ARN del ALB
ALB_ARN=$(aws elbv2 describe-load-balancers \
--names rent-a-room-alb \
--query 'LoadBalancers[0].LoadBalancerArn' \
--output text)
# Obtener el ARN del target group
TG_ARN=$(aws elbv2 describe-target-groups \
--names rent-a-room-tg \
--query 'TargetGroups[0].TargetGroupArn' \
--output text)
# Crear el listener
aws elbv2 create-listener \
--load-balancer-arn $ALB_ARN \
--protocol HTTP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=$TG_ARN3️⃣ Actualizar el Servicio ECS para usar el Load Balancer
# Obtener el ARN del target group
TG_ARN=$(aws elbv2 describe-target-groups \
--names rent-a-room-tg \
--query 'TargetGroups[0].TargetGroupArn' \
--output text)
# Actualizar el servicio para usar el balanceador de carga
aws ecs update-service \
--cluster rent-a-room-cluster \
--service rent-a-room-service \
--load-balancers "targetGroupArn=$TG_ARN,containerName=rent-a-room,containerPort=80" \
--force-new-deployment4️⃣ Acceder a tu Aplicación a través del Load Balancer
Usando la Consola de AWS:
- Ve a Load Balancers en la Consola de EC2.
- Selecciona tu balanceador rent-a-room-alb.
- Copia el DNS name.
- Accede a tu aplicación:
http://[DNS_NAME]. - NOTA: Esto tardará unos minutos en propagarse mientras el servicio se despliega.
Usando la CLI de AWS:
# Obtener el nombre DNS del load balancer
ALB_DNS=$(aws elbv2 describe-load-balancers \
--names rent-a-room-alb \
--query 'LoadBalancers[0].DNSName' \
--output text)
echo "Tu aplicación está disponible en: http://$ALB_DNS"🔄 ¿Qué sucede cuando las tareas cambian de IP?
Uno de los beneficios clave es manejar los cambios de IP de forma transparente:
- Registro Automático: Cuando una tarea inicia, ECS registra su IP en el Target Group. El balanceador comienza los health checks y, si pasan, le envía tráfico.
- Drenado de Conexiones (Connection Draining): Cuando una tarea se detiene, se desregistra. El balanceador deja de enviarle solicitudes nuevas pero permite que las existentes terminen (por defecto: 300 segundos).
- Estabilidad DNS: El nombre DNS del balanceador nunca cambia. Los clientes siempre usan el mismo punto de enlace.
🔍 Verificando tu Configuración
- Check Target Health: En EC2 → Target Groups → Selecciona el tuyo → Targets. El estado debe ser "healthy".
- Check Load Balancer Listener: En EC2 → Load Balancers → Select ALB → Listeners. Debe haber un listener en el puerto 80 redirigiendo al Target Group.
IMPORTANTE
Si tus objetivos (targets) permanecen como "unhealthy", verifica que hayas actualizado el grupo de seguridad de ECS para permitir tráfico desde el balanceador de carga.
📈 Escalado de tu Aplicación
Con el balanceador en su lugar, ahora puedes escalar:
# Actualizar el servicio para aumentar el número de tareas a 3
aws ecs update-service \
--cluster rent-a-room-cluster \
--service rent-a-room-service \
--desired-count 3¡El balanceador distribuirá automáticamente el tráfico entre las tareas sanas!
🚀 Configuraciones Avanzadas
- Soporte HTTPS: Agrega un certificado en AWS Certificate Manager.
- Auto Scaling: Configura el servicio para escalar basado en métricas de CPU/memoria:
# Habilitar auto scaling del servicio
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--resource-id service/rent-a-room-cluster/rent-a-room-service \
--scalable-dimension ecs:service:DesiredCount \
--min-capacity 1 \
--max-capacity 5
# Crear política de escalado basada en uso de CPU
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--resource-id service/rent-a-room-cluster/rent-a-room-service \
--scalable-dimension ecs:service:DesiredCount \
--policy-name cpu-scaling-policy \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{
"TargetValue": 70.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
}
}'🎯 Puntos Clave
- Los balanceadores de carga son esenciales para aplicaciones en producción en ECS.
- Proporcionan un punto de enlace estable, controles de salud y capacidades de escalado.
- Los usuarios no experimentan tiempo de inactividad cuando las IPs de los contenedores cambian.
🚀 Próximos Pasos
Ahora que has:
- ✅ Agregado un balanceador de carga a tu servicio ECS.
- ✅ Creado un punto de enlace estable.
- ✅ Configurado auto scaling.
- ✅ Verificado que múltiples tareas están funcionando.
✨ ¡Continúa con la configuración del pipeline de CI/CD! ▶️
