Concepto clave
El balanceo de carga y los Auto Scaling Groups son dos componentes fundamentales para construir infraestructura escalable en AWS. Imagina que tienes una tienda en línea: el balanceador de carga actúa como el recepcionista que distribuye a los clientes entre diferentes cajeros (instancias EC2) para evitar colas. Los Auto Scaling Groups son como un gerente que contrata o despide cajeros automaticamente segun la afluencia de clientes.
En AWS, el Application Load Balancer (ALB) es el servicio recomendado para aplicaciones web, ya que opera en la capa 7 (HTTP/HTTPS) y puede enrutar trafico basado en contenido. Los Auto Scaling Groups (ASG) gestionan un grupo de instancias EC2 que se escalan horizontalmente segun metricas como uso de CPU o solicitudes por instancia. Juntos, garantizan alta disponibilidad y tolerancia a fallos: si una instancia falla, el ALB deja de enviarle trafico y el ASG la reemplaza.
Como funciona en la practica
Vamos a desplegar una aplicacion web simple con Terraform. Primero, defines una VPC con subredes publicas y privadas. Luego, creas un ALB en las subredes publicas para recibir trafico de internet. El ALB se conecta a un grupo objetivo que apunta a las instancias EC2. Finalmente, configuras un ASG que lanza instancias en las subredes privadas y las registra automaticamente en el grupo objetivo del ALB.
Paso a paso: 1) Configura la red (VPC, subredes, Internet Gateway). 2) Crea un ALB con listeners HTTP/HTTPS. 3) Define un launch template con la AMI y user-data para la aplicacion. 4) Configura el ASG con politicas de escalado basadas en CloudWatch. 5) Prueba accediendo a la URL del ALB y simula carga con herramientas como Apache Bench.
Codigo en accion
A continuacion, un ejemplo funcional de Terraform para un ALB y ASG basico. Nota: asume que ya tienes una VPC configurada.
# resources.tf - ALB y ASG para aplicacion web
resource "aws_lb" "web_alb" {
name = "web-alb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb_sg.id]
subnets = var.public_subnet_ids
enable_deletion_protection = false
}
resource "aws_lb_target_group" "web_tg" {
name = "web-tg"
port = 80
protocol = "HTTP"
vpc_id = var.vpc_id
health_check {
path = "/"
interval = 30
timeout = 5
healthy_threshold = 2
unhealthy_threshold = 2
}
}
resource "aws_lb_listener" "web_listener" {
load_balancer_arn = aws_lb.web_alb.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.web_tg.arn
}
}
resource "aws_launch_template" "web_lt" {
name_prefix = "web-lt-"
image_id = "ami-0c55b159cbfafe1f0" # Amazon Linux 2
instance_type = "t3.micro"
user_data = base64encode(<<-EOF
#!/bin/bash
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "Hola desde $(hostname -f)
" > /var/www/html/index.html
EOF
)
network_interfaces {
associate_public_ip_address = false
security_groups = [aws_security_group.instance_sg.id]
}
}
resource "aws_autoscaling_group" "web_asg" {
name_prefix = "web-asg-"
vpc_zone_identifier = var.private_subnet_ids
target_group_arns = [aws_lb_target_group.web_tg.arn]
health_check_type = "ELB"
desired_capacity = 2
min_size = 2
max_size = 5
launch_template {
id = aws_launch_template.web_lt.id
version = "$Latest"
}
tag {
key = "Name"
value = "web-instance"
propagate_at_launch = true
}
}
Refactorizacion: antes, podrias haber usado aws_instance directamente, pero con aws_launch_template y aws_autoscaling_group, obtienes escalado automatico y actualizaciones sin interrupcion. Por ejemplo, para actualizar la AMI, modifica el launch template y Terraform creara nuevas instancias gradualmente.
Errores comunes
- Configurar health checks incorrectos: Si el path o puerto no coinciden con tu aplicacion, el ALB marcara las instancias como unhealthy. Solucion: Verifica que el endpoint de health check responda con 200 OK.
- Olvidar security groups: Sin reglas adecuadas, el ALB no podra comunicarse con las instancias. Solucion: Asegurate de que el security group del ALB permita trafico al puerto de las instancias y viceversa.
- No usar subredes multi-AZ: Desplegar todo en una sola zona de disponibilidad crea un punto unico de fallo. Solucion: Distribuye instancias y el ALB en al menos dos AZs.
- Ignorar politicas de escalado Dejar el ASG con configuraciones por defecto puede llevar a sobrecosto o baja performance. Solucion: Define metricas personalizadas como CPUUtilization o RequestCountPerTarget.
- Errores en user-data Scripts mal formados pueden evitar que las instancias se inicialicen correctamente. Solucion: Prueba el user-data en una instancia manualmente antes de integrarlo en Terraform.
Checklist de dominio
- Puedo explicar la diferencia entre un Application Load Balancer y un Network Load Balancer.
- He configurado un ALB con listeners HTTP y HTTPS (usando ACM para SSL).
- Se crear un launch template con user-data para automatizar el despliegue de aplicaciones.
- He definido politicas de escalado para un ASG basadas en metricas de CloudWatch.
- Puedo solucionar problemas de health checks entre el ALB y las instancias EC2.
- He implementado una arquitectura multi-AZ para alta disponibilidad.
- Se actualizar un ASG sin tiempo de inactividad usando launch templates.
Despliega una aplicacion web escalable con ALB y ASG usando Terraform
En este ejercicio, implementaras una infraestructura completa en AWS que incluya un Application Load Balancer y un Auto Scaling Group para una aplicacion web simple. Sigue estos pasos:
- Prepara el entorno: Crea un directorio para tu proyecto Terraform y un archivo
main.tf. Configura el provider de AWS con tu region preferida. - Define la red: Usa el modulo
aws_vpco crea recursos manualmente para una VPC con al menos dos subredes publicas y dos privadas en diferentes AZs. Asegurate de incluir un Internet Gateway y tablas de ruta. - Configura el ALB: Crea un Application Load Balancer en las subredes publicas. Define un target group con health checks en el puerto 80 y un listener HTTP.
- Crea el launch template: Define un launch template que use una AMI de Amazon Linux 2 e incluya user-data para instalar Apache y servir una pagina HTML basica.
- Implementa el ASG: Configura un Auto Scaling Group que use el launch template, se despliegue en las subredes privadas, y se registre automaticamente en el target group del ALB. Establece capacidad deseada en 2, minima en 1, y maxima en 3.
- Despliega y prueba: Ejecuta
terraform apply. Una vez completado, accede a la URL del ALB en tu navegador para ver la aplicacion. Usacurlo una herramienta similar para simular trafico y verificar que el balanceo funcione. - Limpia: Al finalizar, ejecuta
terraform destroypara eliminar todos los recursos y evitar costos innecesarios.
- Recuerda que el ALB debe estar en subredes publicas con acceso a internet, mientras que las instancias del ASG pueden estar en subredes privadas.
- Usa la salida de Terraform (output) para obtener la URL del ALB facilmente despues del despliegue.
- Si las instancias no pasan los health checks, revisa los security groups y asegurate de que el user-data este ejecutandose correctamente.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.