Wie behebe ich Service Connect-Probleme in Amazon ECS?

Lesedauer: 6 Minute
0

Meine Amazon Elastic Container Service (Amazon ECS)-Services können keine Verbindung zu einem anderen Service herstellen.

Behebung

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 der AWS CLI verwendest.

Fehlkonfigurationen oder Netzwerkprobleme führen zu Problemen bei der Kommunikation zwischen Services. Gehe wie folgt vor, um diese Probleme zu beheben.

Überprüfung der Service Connect-Konfiguration

Überprüfen, ob du Service Connect aktiviert hast

Voraussetzungen: Um Amazon ECS Service Connect verwenden zu können, stelle sicher, dass du die Service Connect-Anforderungen erfüllst.

Um zu überprüfen, ob du Service Connect für die Amazon ECS-Services aktiviert hast, führe den folgenden AWS CLI-Befehl describe-services aus:

aws ecs describe-services --cluster cluster-name --services service-name

Hinweis: Ersetze cluster-name durch deinen Cluster-Namen und service-name durch deinen Service-Namen.

Beispielausgabe:

"serviceConnectConfiguration": {

"enabled": true,

Hinweis: Wenn der Amazon ECS-Service Netzwerkdatenverkehr von anderen Services zulassen muss, stelle sicher, dass du die Service Connect-Konfiguration als client-server service festlegst. Um nach dieser Konfiguration zu suchen, überprüfe die Befehlsausgabe für „services“ unter „serviceConnectionConfiguration“.

Prüfen des Namespace deiner Services

Um Service Connect verwenden zu können, musst du die Amazon ECS-Services im gleichen Namespace konfigurieren. Stelle außerdem sicher, dass sich der Client-Service und der Client-Server-Service im gleichen Namespace befinden. Führe den folgenden Befehl describe-services aus, um den Namespace der Services zu überprüfen:

aws ecs describe-services --cluster cluster-name --services service-name | grep namespace

Hinweis: Ersetze cluster-name durch deinen Cluster-Namen und service-name durch deinen Service-Namen.

Überprüfe in der Ausgabe den Wert für namespace. Um den Namespace für einen Service zu aktualisieren, verwende die Amazon ECS-Konsole, um die Einstellung Service Connect-Konfiguration zu aktualisieren. Oder führe den folgenden update-service-Befehl aus:

aws ecs update-service --cluster cluster-name --service service-name --service-connect-configuration enabled=true,namespace=Namespace-name --force-new-deployment

Hinweis: Ersetze cluster-name durch deinen Cluster-Namen, service-name durch deinen Service-Namen und Namespace-name durch deinen Namespace.

Wenn der Client-Service das Client-Server-Service-DNS nicht auflösen kann, erhältst du eine der folgenden Fehlermeldungen:

  • „server can't find DNS: NXDOMAIN“
  • „server can't find example.core.staging.local: NXDOMAIN“

Um dieses Problem zu beheben, führe den folgenden Befehl get-namespace aus, um zu überprüfen, ob du den Namespace in AWS Cloud Map registriert hast:

aws servicediscovery get-namespace --id namespace

Hinweis: Ersetze namespace durch deine Namespace-ID.

Überprüfe die Ausgabe des Befehls, um die verfügbaren Namespaces in deinem AWS-Konto und deiner AWS-Region anzuzeigen.

Gehe wie folgt vor, um dich zu vergewissern, dass du die Aufgaben im Instance-Namespace registriert hast:

  1. Um die Namespace-ID abzurufen, führe den folgenden Befehl list-namespaces aus:

    aws servicediscovery list-namespaces
  2. Verwende die AWS Cloud Map-Konsole oder die AWS CLI, um die Services im Namespace aufzulisten.

  3. Führe den folgenden Befehl list-instances aus, um die registrierten Instances des Service anzuzeigen:

    aws servicediscovery list-instances --service-id srv-serviceID

    Hinweis: Ersetze serviceID durch deine Service-ID.

  4. Wenn du die Instance nicht registriert hast, führe den folgenden Befehl update-service aus, um die Aufgaben erneut bereitzustellen:

    aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment

    Hinweis: Ersetze cluster-name durch deinen Cluster-Namen, service-name durch deinen Service-Namen und region-name durch deine Region.
    Oder verwende die Amazon ECS-Konsole, um den Service zu aktualisieren, und wähle Neue Bereitstellung erzwingen.

Überprüfung deiner Port-Zuordnungsnamen

Wenn du den Port-Zuordnungsnamen nicht in der Aufgabendefinition festlegst, erhältst du die folgende Fehlermeldung:

„No port aliases found. Select a different task definition family and revision that has port mappings configured to use client and server mode.“

Um dieses Problem zu beheben, aktualisiere die Aufgabendefinition und füge einen Wert für den Parameter name unter portMappings hinzu.

Beispiel für eine Aufgabendefinition:

"portMappings": [ { "name": "portmappingnameexample", "containerPort": 3000, "hostPort": 3000, "protocol": "tcp" }

Überprüfung der Einstellungen deiner Netzwerk-ACL und Sicherheitsgruppe

Stelle sicher, dass die Netzwerk-Zugriffssteuerungsliste (Netzwerk-ACL) und die Sicherheitsgruppen die folgenden Konfigurationen verwenden:

  • Der Client-Service ermöglicht ausgehenden Datenverkehr zum Port der Sicherheitsgruppe für den Client-Server-Service.
  • Die Sicherheitsgruppe für den Client-Server-Service lässt eingehenden Datenverkehr auf dem Port des Client-Service zu.
  • Die Netzwerk-ACLs für virtuelle private Netzwerke (VPC) ermöglichen den Datenverkehr auf den Ports containerPort und ingressPortOverride.
  • Wenn die Serviceaufgaben in verschiedenen VPCs ausgeführt werden, muss deine VPC-Peering-Verbindung oder das Transit-Gateway den Datenverkehr zwischen den VPCs zulassen.

Überprüfung der Konnektivität zwischen den Serviceaufgaben

Gehe wie folgt vor:

  1. Wenn du Aufgaben auf AWS Fargate ausführst, aktiviere ECS Exec. Wenn du Aufgaben in Amazon Elastic Compute Cloud (Amazon EC2) ausführst, fahre mit Schritt 3 fort.

  2. Führe den folgenden Befehl execute-command aus, um eine Fernverbindung zum Container herzustellen:

    aws ecs execute-command --cluster cluster-name \
    --task task-id \
    --container container-name \
    --interactive \
    --command "/bin/sh"

    Hinweis: Ersetze cluster-name durch deinen Cluster-Namen, task-id durch deine Aufgaben-ID und container-name durch deine Container-Instance.

  3. Um sicherzustellen, dass die Verbindung den Service Connect-Proxy verwendet, führe den folgenden Befehl aus:

    curl -I http://$IPaddress:portnumber/healthcheck

    Hinweis: Ersetze IPaddress durch die private IP-Adresse der Aufgabe, portnumber durch den Container-Instance-Port und healthcheck durch den Pfad zur Container-Zustandsprüfung.

    Überprüfe die Ausgabe des Befehls für den Header server: envoy, um dich zu vergewissern, dass die Verbindung den Proxy verwendet. Wenn die Verbindung den Proxy nicht verwendet, stelle sicher, dass die Service Connect-Konfiguration korrekt ist.

  4. Führe den folgenden Befehl aus, um die Datei /etc/hosts zu öffnen:

    cat /etc/hosts

    Überprüfe die Ausgabe des Befehls, um dich zu vergewissern, dass du die Endpunkte anderer Services sehen kannst. Wenn du die Service-Endpunkte nicht siehst, stelle sicher, dass deine Service Connect-Konfiguration korrekt ist.

  5. Wenn du die Service Connect-Konfiguration änderst, führe den folgenden Befehl update-service aus, um die Aufgaben erneut bereitzustellen:

    aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment

    Hinweis: Ersetze cluster-name durch deinen Cluster-Namen, service-name durch deinen Service-Namen und region-name durch deine Region.
    Oder verwende die Amazon ECS-Konsole, um den Service zu aktualisieren, und wähle Neue Bereitstellung erzwingen.

Client-Service-Aufgaben erneut bereitstellen

Wenn du die Fehlermeldung „Could not resolve host“ erhältst, können die Aufgaben die Service-Endpunkte nicht auflösen. Stattdessen erhältst du möglicherweise die Fehlermeldung „ping: bad address 'DNS'“.

Um diese Probleme zu beheben, stelle die vorhandenen Client-Serviceaufgaben erneut bereit.

Überprüfung deiner Anwendungsprotokolle

Überprüfe die Anwendungsprotokolle auf Verbindungs- oder Laufzeitfehler. Amazon ECS exportiert Protokolle auf der Grundlage des Protokolltreibers an verschiedene Ziele. Wenn du den awslogs-Treiber verwendest, exportiert Amazon ECS die Protokolle nach Amazon CloudWatch.

Ähnliche Informationen

Amazon ECS Service Connect-Komponenten

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Monaten