Wie verwende ich getrennte Lastenausgleichsmodule für Frontend und Backend in ECS?

Wie verwende ich getrennte Lastenausgleichsmodule für Frontend und Backend in ECS?

Ich habe die folgende Terraform-Konfiguration für einen in ECS AWS ausgeführten Load Balancer für meinen in ECS bereitgestellten Django-App-Container:

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
}

Ich habe eine fast identische Datei für den React-Frontend-Container. Die einzigen Unterschiede sind der Ersatz des Wortes „API“ durch „Frontend“, der Zielgruppenport (der im Fall des Frontend-Load Balancers 80 ist) und der Integritätsprüfpfad (nur „/“ für Frontend).

Wenn ich nur die API bereitstelle, kann ich normalerweise im Browser auf die Anwendung zugreifen. Wenn ich jedoch den Frontend-Load Balancer hinzufüge, kann ich im Browser nicht auf das Frontend zugreifen (Fehler „503 Service Temporarily Unavailable“). Die Django-Anwendung funktionierte zwar weiterhin, fiel aber nach einer Weile ebenfalls aus.

Ich schaue mir die ECS-Benutzeroberfläche an und stelle fest, dass der Cluster, die Aufgabe und die Container ohne Probleme laufen. Aber ich erhalte immer wieder Fehler bei den Integritätsprüfungen. Ich denke, dieser Fehler hängt wahrscheinlich mit der Portzuordnung zusammen. Aber die Zuordnungen stimmen mit denContainerdefinitionenDatei.

Was ist der mögliche Grund dafür?

verwandte Informationen