Implementar Balanceo de Carga y Auto Scaling Groups

Lectura
30 min~6 min lectura

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

  1. Puedo explicar la diferencia entre un Application Load Balancer y un Network Load Balancer.
  2. He configurado un ALB con listeners HTTP y HTTPS (usando ACM para SSL).
  3. Se crear un launch template con user-data para automatizar el despliegue de aplicaciones.
  4. He definido politicas de escalado para un ASG basadas en metricas de CloudWatch.
  5. Puedo solucionar problemas de health checks entre el ALB y las instancias EC2.
  6. He implementado una arquitectura multi-AZ para alta disponibilidad.
  7. 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:

  1. Prepara el entorno: Crea un directorio para tu proyecto Terraform y un archivo main.tf. Configura el provider de AWS con tu region preferida.
  2. Define la red: Usa el modulo aws_vpc o 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.
  3. 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.
  4. 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.
  5. 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.
  6. Despliega y prueba: Ejecuta terraform apply. Una vez completado, accede a la URL del ALB en tu navegador para ver la aplicacion. Usa curl o una herramienta similar para simular trafico y verificar que el balanceo funcione.
  7. Limpia: Al finalizar, ejecuta terraform destroy para eliminar todos los recursos y evitar costos innecesarios.
Pistas
  • 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.