Como usar balanceadores de carga separados para frontend e backend no ECS?

Como usar balanceadores de carga separados para frontend e backend no ECS?

Eu tenho a seguinte configuração do terraform para um balanceador de carga em execução no ECS AWS para meu contêiner de aplicativo Django implantado no 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
}

Eu tenho um arquivo quase idêntico para o contêiner de frontend react. As únicas diferenças são a substituição da palavra "api" por "frontend", a porta do grupo de destino (que é 80 no caso do balanceador de carga frontend) e o caminho da verificação de integridade (apenas "/" para frontend)

Quando implanto apenas a API, normalmente consigo acessar o aplicativo no navegador. No entanto, quando adiciono o balanceador de carga do frontend, não consigo acessar o frontend no navegador (erro "503 Serviço temporariamente indisponível"). O aplicativo Django continuou funcionando, mas depois de um tempo também caiu.

Olho para a UI do ECS e noto que o cluster, a tarefa e os contêineres estão funcionando sem problemas. Mas continuo recebendo erros nas verificações de saúde. Acho que esse erro provavelmente está relacionado ao mapeamento de portas. Mas os mapeamentos são consistentes com odefinições de contêinerarquivo.

Qual é a possível razão para isso?

informação relacionada