Direkt zum Inhalt

Wie kann ich dafür sorgen, dass meine Amazon ECS-Aufgaben, die den Amazon EC2-Starttyp verwenden, die Application Load Balancer-Zustandsprüfung bestehen?

Lesedauer: 9 Minute
0

Ich möchte Probleme mit Application Load Balancer-Zustandsprüfungen für Amazon Elastic Container Service (Amazon ECS)-Aufgaben, die auf meinen Amazon Elastic Compute Cloud (Amazon EC2)-Instances ausgeführt werden, beheben und lösen.

Kurzbeschreibung

Wenn deine Amazon-ECS-Aufgabe die Load Balancer-Zustandsprüfung nicht besteht, erhältst du in deiner Amazon ECS-Serviceeventmeldung einen der folgenden Fehler:

  • „(service AWS-service) (port 8080) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed with these codes: [502 or 504]) or (request timeout)“
  • „(service AWS-Service) (port 8080) is unhealthy in target-group tf-20190411170 due to (reason Health checks failed)“
  • „(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)“

Möglicherweise erhältst du die folgende Fehlermeldung von deiner Amazon-ECS-Aufgaben-Konsole:

„Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)“

Informationen zu fehlgeschlagenen Container-Zustandsprüfungen findest du unter Wie behebe ich die Fehler bei der Container-Zustandsprüfung für Amazon ECS-Aufgaben?

Um zu ermitteln, warum deine Amazon ECS-Aufgabe gestoppt wurde, siehe Fehler bei gestoppten Amazon ECS-Aufgaben anzeigen und Warum wurde meine Amazon ECS-Aufgabe gestoppt?

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Verschiedene Sicherheitsgruppen konfigurieren

Es hat sich bewährt, verschiedene Sicherheitsgruppen so zu konfigurieren, dass der gesamte Datenverkehr zwischen deinen Load Balancern und Container-Instances oder der Task Elastic Network-Schnittstelle zugelassen wird. Du kannst deine Container-Instances auch so konfigurieren, dass sie Datenverkehr auf dem Port akzeptieren, der für die Aufgabe angegeben ist.

Überprüfe in deiner Konfiguration die folgenden Einstellungen:

  • Die Sicherheitsgruppe, die deinem Load Balancer zugeordnet ist, ermöglicht ausgehenden Datenverkehr zu deinen Container-Instances oder deiner Aufgaben-Netzwerkschnittstelle auf dem registrierten Port. Erlaube außerdem ausgehenden Datenverkehr zu deinen Container-Instances auf dem Health Check-Port.
  • Lasse eingehenden Datenverkehr im Port-Bereich des Aufgaben-Hosts von der Sicherheitsgruppe zu, die deinem Load Balancer zugeordnet ist.

Schalte die Availability Zone für deinen Load Balancer ein

Wenn du eine Availability Zone für deinen Load Balancer konfigurierst, erstellt Elastic Load Balancing einen Load Balancer-Knoten in der Availability Zone. Wenn du Ziele in der Availability Zone registrierst, die Availability Zone aber nicht aktivierst, erhalten die registrierten Ziele keinen Traffic. Weitere Informationen findest du unter Availability Zones und Load Balancer-Knoten.

Gehe wie folgt vor, um die Availability Zones zu ermitteln, für die dein Load Balancer konfiguriert ist:

  1. Öffne die Amazon-EC2-Konsole.
  2. Wähle im Navigationsbereich unter Lastausgleich die Option Load Balancer aus.
  3. Wähle den Load Balancer aus, den du für deinen Amazon-ECS-Dienst verwendest.
  4. Auf der Registerkarte Beschreibung kannst du die Availability Zones einsehen.

Oder führe den AWS-CLI-Befehl describe-load-balancers aus:

aws elbv2 describe-load-balancers --load-balancer-arns EXAMPLE-ALB-ARN --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'

Hinweis: Ersetze EXAMPLE-ALB-ARN durch den ARN deines Application Load Balancers.

Gehe wie folgt vor, um die Availability Zones zu ermitteln, für die deine Container-Instances konfiguriert sind:

  1. Öffne die Amazon-EC2-Konsole.
  2. Wähle im Navigationsbereich unter Auto Scaling die Option Auto-Scaling-Gruppen aus.
  3. Wähle die Auto-Scaling-Gruppe der Container-Instance aus, die deinem Cluster zugeordnet ist.
  4. Vergewissere dich auf der Registerkarte Details unter Netzwerk, dass die Availability Zones mit den Availability Zones für deinen Load Balancer übereinstimmen.

Oder führe den AWS-CLI-Befehl describe-auto-scaling-groups aus:

aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names EXAMPLE-ASG-NAME --query 'AutoScalingGroups[*].{Subnets:VPCZoneIdentifier}' --output text

Hinweis: Ersetze EXAMPLE-ASG-NAME durch den Namen deiner Auto-Scaling-Gruppe.

Gehe wie folgt vor, um die Availability Zones deines Clusters zu ändern:

  1. Öffne die AWS CloudFormation-Konsole.
  2. Wähle den CloudFormation-Stack deines Clusters aus.
  3. Aktualisiere den Stack.
  4. Aktualisiere auf der Seite Stack-Details angeben deine Subnetz-ID-Konfiguration.

Gehe wie folgt vor, um die Availability Zones zu ermitteln, für die deine Aufgabe konfiguriert ist:

  1. Öffne die Amazon-ECS-Konsole.

  2. Wähle im Navigationsbereich Cluster und dann den Cluster aus, der deinen Dienst enthält.

  3. Wähle auf der Registerkarte Dienste auf der Seite deines Clusters in der Spalte Dienstname den Dienst aus, den du überprüfen möchtest.

  4. Wähle die Registerkarte Konfiguration und Netzwerk aus.

  5. Sieh dir unter Netzwerkkonfiguration die konfigurierten Subnetze an.

  6. Öffne die Amazon Virtual Private Cloud (Amazon VPC)-Konsole, um zusätzliche Informationen anzuzeigen, die in der ECS-Konsole nicht verfügbar sind.

  7. Führe den Befehl describe-services aus, um zu überprüfen, ob die Availability Zones deiner Subnetze mit den Availability Zones deines Load Balancers übereinstimmen:

    aws ecs describe-services --cluster EXAMPLE-CLUSTER-NAME --service EXAMPLE-SERVICE-NAME --query
    'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'

    Hinweis: Ersetze EXAMPLE-CLUSTER-NAME durch den Namen deines Clusters und EXAMPLE-SERVICE-NAME durch den Namen deines Diensts.

Du kannst die Amazon ECS-Konsole nicht verwenden, um die Subnetzkonfiguration eines Amazon ECS-Service zu ändern. Führe stattdessen den AWS-CLI-Befehl update-service aus.

Konfiguriere deine Netzwerk-ACL, um den Verkehr zwischen Subnetzen zuzulassen

Die Subnetze für deinen Load Balancer und deine Container-Instance oder Task-Netzwerkschnittstelle können unterschiedlich sein.

Verwende die folgenden Konfigurationen der Netzwerk-Zugriffssteuerungsliste (Netzwerk-ACL), um den Verkehr zwischen den Subnetzen zuzulassen:

  • Die Netzwerk-ACL, die den Subnetzen deines Load Balancers zugeordnet ist, muss eingehenden Verkehr auf den kurzlebigen Ports (1024-65535) und dem Listener-Port zulassen.
  • Die Netzwerk-ACL muss ausgehenden Datenverkehr auf den Zustandsprüfungs- und Ephemeral-Anschlüssen zulassen.
  • Die Netzwerk-ACL, die den Subnetzen für deine Container-Instance oder Task-Netzwerkschnittstelle für den awsvpc zugeordnet ist, muss eingehenden Verkehr auf dem Zustandsprüfungs-Port zulassen.
  • Die Netzwerk-ACL muss ausgehenden Datenverkehr auf den ephemeren Ports zulassen.

Weitere Informationen zu Netzwerk-ACLs findest du unter Subnetzverkehr mit Netzwerkzugriffskontrolllisten steuern.

Überprüfen der Einstellungen für die Zustandsprüfung deiner Zielgruppe

Gehe wie folgt vor, um zu überprüfen, ob du die Einstellungen für die Zustandsprüfung für deine Zielgruppe korrekt konfiguriert hast:

  1. Öffne die Amazon-EC2-Konsole.
  2. Wähle im Navigationsbereich unter Load Balancing die Option Zielgruppen aus.
  3. Wähle deine Zielgruppe aus.
    Wichtig: Verwende eine neue Zielgruppe. Da Amazon ECS die ECS-Aufgabe automatisch bei der Zielgruppe registriert und deregistriert, solltest du der Zielgruppe keine Ziele manuell hinzufügen.
  4. Führe auf der Registerkarte Zustandsprüfungen die folgenden Aktionen aus:
    Vergewissere dich, dass du die Felder Port und Path korrekt konfiguriert hast.
    Hinweis: Wenn du die Felder nicht richtig konfigurierst, fordert Amazon ECS deinen Load Balancer möglicherweise auf, die Registrierung der Aufgabe aufzuheben, da die Zustandsprüfungen nicht bestanden wurden.
    Wähle für Port die Option Traffic Port aus.
    Hinweis: Wenn du Override auswählst, überprüfe, ob der Port mit dem Task-Host-Port übereinstimmt.
    Stelle für Timeout sicher, dass der Antwort-Timeout-Wert richtig ist.
    Hinweis: Wenn der Wert niedriger ist als die für eine Antwort benötigte Zeit, schlägt die Zustandsprüfung fehl.

Überprüfe den Status und die Konfiguration der Anwendung in deinem ECS-Container

Vergewissere dich, dass die Anwendung auf deine Load Balancer-Zustandsprüfung reagiert

Ergreife die folgenden Maßnahmen:

  • Vergewissere dich, dass du den Ping-Port und den Zustandsprüfungs-Pfad für die Zielgruppe korrekt konfiguriert hast.
  • Überwache die Kennzahlen zur CPU- und Speicherauslastung für den Amazon ECS-Service. Wenn deine Anwendung langsam ist oder ein Timeout auftritt, erhöhe die Ressourcenkontingente für Aufgaben, skaliere den Dienst, optimiere deine Anwendung oder verwende einen größeren Instance-Typ.
  • Lege eine Mindestkarenzzeit für Zustandsprüfungen fest, sodass der Service Scheduler die Zustandsprüfungen für einen vordefinierten Zeitraum ignoriert, nachdem du eine Aufgabe gestartet hast.
    Hinweis: Für deine Amazon ECS-Aufgabe ist möglicherweise eine längere Übergangsphase für die Zustandsprüfung erforderlich, um den Application Load Balancer zu registrieren.
  • Überprüfe die Anwendungsprotokolle auf Anwendungsfehler. Weitere Informationen findest du unter Senden von Amazon ECS-Protokollen an CloudWatch.

Bestätige, dass die Anwendung den richtigen Statuscode zurückgibt

Wenn der Load Balancer eine HTTP GET-Anfrage an den Zustandsprüfungspfad sendet, gibt die Anwendung in deinem ECS-Container den Standardstatuscode 200 OK zurück. Wenn du eine Nicht-HTTP-Fehlermeldung erhältst, hört deine Anwendung den HTTP-Verkehr nicht ab. Möglicherweise erhältst du einen HTTP-Statuscode, der sich von dem unterscheidet, den du in der Matcher-Einstellung angegeben hast. Wenn du einen weiteren Statuscode erhältst, hört deine Anwendung den HTTP-Verkehr ab, gibt aber keinen Statuscode für ein fehlerfreies Ziel zurück.

Hinweis: Wenn du einen Application Load Balancer verwendest, kannst du die Matcher-Einstellung auf einen anderen Statuscode als 200 aktualisieren. Weitere Informationen findest du unter Zustandsprüfungen für Application Load Balancer-Zielgruppen.

Gehe wie folgt vor, um zu bestätigen, dass die Anwendung in deinem ECS-Container den richtigen Statuscode zurückgibt:

  1. Verwende SSH, Session Manager, eine Funktion von AWS Systems Manager, oder EC2 Instance Connect, um eine Verbindung zu deiner Container-Instance herzustellen.

  2. (Optional) Führe den folgenden Befehl für dein Betriebssystem (OS) aus, um curl zu installieren.
    Amazon Linux und andere RPM-basierte Distributionen:

    sudo yum -y install curl

    Debian-basierte Systeme wie Ubuntu:

    sudo apt-get install curl
  3. Führe den folgenden Befehl aus, um die Container-ID abzurufen:

    docker ps

    Hinweis: Der Port für den lokalen Listener wird in der Ausgabe des Befehls unter PORTS am Ende der Sequenz angezeigt.

  4. Wenn du den BRIDGE-Netzwerkmodus verwendest, führe den Befehl docker inspect aus, um die IP-Adresse des Containers abzurufen:

    IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)

    Hinweis: Die IP-Adresse des Containers wird in IPADDR gespeichert. Ersetze 112233445566 durch die Container-ID-Nummer aus der Ausgabe des Befehls docker ps. Wenn du awsvpc verwendest, verwendest du die Aufgaben-IP-Adresse, die der Aufgaben-Netzwerkschnittstelle zugewiesen ist. Wenn du den HOST-Netzwerkmodus verwendest, verwende die IP-Adresse der Host-Container-Instance, über den die Aufgabe verfügbar gemacht wird.

  5. Um den Statuscode abzurufen, führe einen curl-Befehl aus, der IPADDR und den Port des lokalen Listeners enthält:

    curl -I http://${IPADDR}:8080/health

    Hinweis: Ersetze im vorherigen Beispielbefehl 8080 den Port deines Listeners.

Überprüfen des Status deiner Container-Instance

Wenn du die folgende Ereignismeldung von deinem Amazon ECS-Serviceereignis erhältst, überprüfe den Status deiner Container-Instance:

„(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)“

Überprüfe den Status deiner Container-Instance auf der Amazon EC2-Konsole. Wenn deine Instance die Systemstatusüberprüfungen nicht besteht, stoppe und starte deine Instance.

Aktiviere vorübergehend die Application Load Balancer-Zugriffsprotokolle

Aktiviere vorübergehend die Application Load Balancer-Zugriffsprotokolle, um nach den folgenden Problemen zu suchen:

  • Stelle fest, ob der Application Load Balancer Zustandsprüfungen an den richtigen Pfad oder Port sendet und ob die Ziele korrekt reagieren.
  • Analysiere die HTTP-Statuscodes, die die Ziele zurückgeben, um Probleme auf Anwendungsebene zu identifizieren, z. B. falsch konfigurierte Routen oder serverseitige Fehler.
  • Vergewissere dich, dass die Zustandsprüfungen das Ziel erreicht haben, um festzustellen, ob Netzwerkprobleme vorliegen.
  • Prüfe, ob die Antwortzeit das konfigurierte Timeout für die Zustandsprüfung überschreitet.

Behebe andere Ursachen

Wenn die vorhergehende Lösung dein Problem nicht behebt, finde weitere Informationen unter Problembehandlung bei Service Load Balancern in Amazon ECS.

Ähnliche Informationen

Erstelle eine Zielgruppe für deinen Application Load Balancer

Verwendung von Load Balancing, um den Amazon ECS-Service-Datenverkehr zu verteilen

HTTP 504: Gateway-Timeout

Wie behebe ich 504-Fehler, die zurückgegeben werden, wenn ich einen Application Load Balancer verwende?

AWS OFFICIALAktualisiert vor einem Jahr