¿Cómo utilizar balanceadores de carga separados para frontend y backend en ECS?

¿Cómo utilizar balanceadores de carga separados para frontend y backend en ECS?

Tengo la siguiente configuración de terraform para un balanceador de carga que se ejecuta en ECS AWS para mi contenedor de aplicaciones Django implementado en ECS:

resource "aws_lb" "api" {
  name               = "${local.prefix}-api"
  load_balancer_type = "application"
  subnets = [
    aws_subnet.public_a.id,
    aws_subnet.public_b.id
  ]

  security_groups = [aws_security_group.lb_api.id]

  tags = local.common_tags
}

resource "aws_lb_target_group" "api" {
  name        = "${local.prefix}-api"
  protocol    = "HTTP"
  vpc_id      = aws_vpc.main.id
  target_type = "ip"
  port        = 8000

  health_check {
    path = "/admin/login/"
  }
}

resource "aws_lb_listener" "api" {
  load_balancer_arn = aws_lb.api.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

resource "aws_lb_listener" "api_https" {
  load_balancer_arn = aws_lb.api.arn
  port              = 443
  protocol          = "HTTPS"

  certificate_arn = aws_acm_certificate_validation.cert.certificate_arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.api.arn
  }
}


resource "aws_security_group" "lb_api" {
  description = "Allow access to Application Load Balancer"
  name        = "${local.prefix}-lb-api"
  vpc_id      = aws_vpc.main.id

  ingress {
    protocol    = "tcp"
    from_port   = 80
    to_port     = 80
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    protocol    = "tcp"
    from_port   = 443
    to_port     = 443
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    protocol    = "tcp"
    from_port   = 8000
    to_port     = 8000
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = local.common_tags
}

Tengo un archivo casi idéntico para el contenedor frontend de reacción. Las únicas diferencias son el reemplazo de la palabra "api" por "frontend", el puerto del grupo objetivo (que es 80 en el caso del balanceador de carga de frontend) y la ruta de verificación de estado (solo "/" para frontend)

Cuando implemento solo la API, normalmente puedo acceder a la aplicación en el navegador. Sin embargo, cuando agrego el balanceador de carga de la interfaz, no puedo acceder a la interfaz en el navegador (error "Servicio 503 no disponible temporalmente"). La aplicación Django siguió funcionando pero después de un tiempo también dejó de funcionar.

Miro la UI de ECS y noto que el cluster, la tarea y los contenedores se están ejecutando sin problemas. Pero sigo recibiendo errores en los controles de salud. Creo que este error probablemente esté relacionado con la asignación de puertos. Pero las asignaciones son consistentes con ladefiniciones de contenedoresarchivo.

¿Cuál es la posible razón de esto?

información relacionada