Wie behebe ich häufige Fehler bei API-Aufrufen in Amazon ECS?

Lesedauer: 8 Minute
0

Ich möchte häufige Fehler bei API-Aufrufen in Amazon Elastic Container Service (Amazon ECS) beheben.

Kurzbeschreibung

Die Amazon-ECS-APIs schlagen möglicherweise mit einem der folgenden Fehler fehl:

  • AccessDeniedException
  • ClientException
  • ClusterNotFoundException
  • InvalidParameterException
  • ServerException
  • ServiceNotActiveException
  • PlatformTaskDefinitionIncompatibilityException
  • PlatformUnknownException
  • ServiceNotFoundException
  • UnsupportedFeatureException

Möglicherweise treten auch API-Probleme mit der Anwendung auf, die in Ihren Amazon-ECS-Aufgaben ausgeführt wird

Auflösung

Ihre API-Anforderungen werden in AWS CloudTrail als Ereignisse aufgezeichnet. Wenn in Amazon ECS Aktivitäten auftreten, wird diese Aktivität zusammen mit anderen AWS-Serviceereignissen in einem CloudTrail-Ereignis im Ereignisverlauf aufgezeichnet. Sie können aktuelle Ereignisse in Ihrem AWS-Konto anzeigen, suchen und herunterladen.

Gehen Sie wie folgt vor, um den CloudTrail-Ereignisverlauf anzuzeigen und die API-Fehler zu finden:

  1. Öffnen Sie die AWS-CloudTrail-Konsole.
  2. Wählen Sie im Navigationsbereich Event history (Ereignisverlauf) aus.
  3. Wählen Sie das Zahnradsymbol.
  4. Wählen Sie unter Select visible columns (Sichtbare Spalten auswählen) die Option Error code (Fehlercode) aus.
  5. Wählen Sie Confirm (Bestätigen).
  6. Wählen Sie auf der Seite Event history (Ereignisverlauf) für Lookup attributes (Suchattribute) die Option Event name (Ereignisname) aus.
  7. Geben Sie für Enter an event name (Ereignisnamen eingeben) die Aktion ein, die fehlgeschlagen ist.
    Hinweis: Wenn Sie den Ereignisnamen nicht kennen, gehen Sie wie folgt vor:
    Wählen Sie für Lookup-Attributes (Suchattribute) Event source (Ereignisquelle) aus.
    Wählen Sie für Enter an event source (Ereignisquelle eingeben) die Option ecs.amazonaws.com aus, um alle Ereignisse im Zusammenhang mit Ihrem ECS-Service zu filtern.
  8. Wählen Sie aus der Ergebnisliste die Ereignisse mit den Fehlercodes Ihrer Wahl aus, um die Ereignisdetails anzuzeigen.

AccessDeniedException

Dieser Fehler wird protokolliert, wenn der Benutzer oder die Rolle von AWS Identity and Access Management (IAM), die den API-Aufruf ausführt, nicht über die erforderlichen Berechtigungen zum Ausführen der angeforderten Aktion verfügt.

Der AccessDeniedException-Fehler sieht etwa wie folgt aus:

An error occurred (AccessDeniedException) when calling the CreateCluster operation: User: arn:aws:sts::123456789012:assumed-role/test-role/test-session is not authorized to perform: ecs:CreateCluster on resource: * because no identity-based policy allows the ecs:CreateCluster action

Sie können die folgenden Details im zugehörigen CloudTrail-Ereignisdatensatz anzeigen:

  • Benutzerinformationen:
"type": "AssumedRole",
"principalId": "AROAZEPPWYLQU45ZDJY6V:test-session",
"arn": "arn:aws:sts::123456789012:assumed-role/test-role/test-session"
  • Ereignisname:
"eventName": "CreateCluster"
  • Fehlermeldung:
"errorMessage": "User: arn:aws:sts::123456789012:assumed-role/test-role/test-session is not authorized to perform: ecs:CreateCluster on resource: * because no identity-based policy allows the ecs:CreateCluster action"

Um eine Richtlinie zu testen, die nicht an einen Benutzer, eine Benutzergruppe oder eine Rolle angefügt ist, verwenden Sie den IAM-Richtliniensimulator.

Gehen Sie zur Behebung dieses Fehlers folgendermaßen vor:

  1. Öffnen Sie die IAM-Konsole.
  2. Wählen Sie im Navigationsbereich je nach der Benutzeridentität Roles (Rollen) oder Users (Benutzer) aus.
  3. Filtern Sie die Rolle oder den Benutzer mithilfe des Suchfilters.
  4. Wählen Sie die Rolle oder den Benutzer.
  5. Wählen Sie die Registerkarte Permissions (Berechtigungen).
  6. Erweitern Sie die Berechtigungsrichtlinie, um die mit dem Benutzer verknüpften Berechtigungen anzuzeigen.
  7. Stellen Sie sicher, dass die Richtlinie ecs:your-event-name in der Liste der Aktionen enthält und Allow (Erlauben) für Effect (Effekt). Wenn die Richtlinie diese Parameter nicht enthält, aktualisieren Sie die Richtlinie, sodass sie diese Änderungen enthält. Oder erstellen Sie eine neue Richtlinie, die die erwähnte Aktion erlaubt, und fügen Sie die Richtlinie an die IAM-Rolle oder den Benutzer an. Weitere Informationen finden Sie unter Bearbeiten von kundenverwalteten Richtlinien (Konsole).

ClientException

Dieser Fehler wird protokolliert, wenn der ECS-Client eine Kennung oder Ressource angibt, die nicht gültig ist oder nicht existiert. Wenn Sie beispielsweise versuchen, eine Aufgabe mit der RunTask- oder StartTask-API zu starten und auf eine falsche Aufgabendefinition verweisen, wird dieser Fehler angezeigt:

$ aws ecs run-task --cluster example-cluster --task-definition centos --region ap-southeast-2
An error occurred (ClientException) when calling the RunTask operation: TaskDefinition not found.
$ aws ecs start-task --cluster example-cluster --task-definition centos --container-instances 765936fadbdd46b5991a4bd70c2a43d4 --region ap-southeast-2
An error occurred (ClientException) when calling the StartTask operation: TaskDefinition not found.

Um diesen Fehler zu verhindern, stellen Sie sicher, dass die im Befehl genannten Ressourcen sowie Ihr Code oder Ihre API-Aufrufe vorhanden und gültig sind.

ClusterNotFoundException

Dieser Fehler wird protokolliert, wenn der angegebene Cluster nicht gefunden wurde.

Beispiel:

$ aws ecs run-task --task-definition CentOS --cluster example-cluster --region ap-southeast-2
An error occurred (ClusterNotFoundException) when calling the StartTask operation: Cluster not found.

Um diesen Fehler zu vermeiden, stellen Sie sicher, dass der Clustername, den Sie im Befehl übergeben, Ihr Code oder Ihre API-Aufrufe korrekt sind. Sie können den folgenden Befehl ausführen, um die vorhandenen ECS-Cluster aufzulisten. Mit der zurückgegebenen Liste können Sie überprüfen, ob der im API-Aufruf erwähnte Cluster vorhanden ist.

$ aws ecs list-clusters --region example-region
{
    "clusterArns": [
        "arn:aws:ecs:ap-southeast-2:123456789012:cluster/my-cluster",
        "arn:aws:ecs:ap-southeast-2:123456789012:cluster/my-private-cluster"
    ]
}

InvalidParameterException

Dieser Fehler wird protokolliert, wenn der im Befehl übergebene Parameter nicht gültig ist. Angenommen, Sie haben eine Version der Aufgabendefinition erwähnt, die nicht existiert:

$ aws ecs run-task --task-definition CentOS:3 --cluster example-cluster --region ap-southeast-2

Dann sieht der Fehler wie folgt aus:

An error occurred (InvalidParameterException) when calling the RunTask operation: TaskDefinition not found.

Um diesen Fehler zu vermeiden, stellen Sie sicher, dass die im Befehl übergebenen Parameter gültig sind.

ServerException

Dieser Fehler wird protokolliert, wenn ein Serverfehler im Zusammenhang mit dem API-Aufruf vorliegt. ServerException wird normalerweise durch den HTTP-Fehlercode 500 verursacht. Diese Ausnahme tritt auf, wenn ein Problem mit dem ECS-Service in der AWS-Region vorliegt. Dieser Fehler ist normalerweise vorübergehend und nachfolgende Versuche, die API auszuführen, sollten erfolgreich sein. Wenn das Problem jedoch lange andauert, wenden Sie sich an den AWS Support.

ServiceNotActiveException

Dieser Fehler tritt auf, wenn der ECS-Service, der aktualisiert wird, nicht aktiv ist. Stellen Sie sicher, dass der ECS-Service, der aktualisiert wird, im ECS-Cluster vorhanden ist und sich im aktiven Zustand befindet.

Führen Sie den folgenden AWS Command Line Interface (AWS CLI)-Befehl aus, um alle Services im Cluster aufzulisten:

$ aws ecs list-services --cluster example-cluster

Prüfen Sie in der Ausgabe, ob der Service, der gerade aktualisiert wird, angezeigt wird.

Hinweis: Wenn beim Ausführen von AWS-CLI-Befehlen Fehler gemeldet werden, stellen Sie sicher, dass Sie die neueste Version der AWS CLI verwenden.

Führen Sie anschließend den folgenden Befehl aus, um zu überprüfen, ob sich der Service im aktiven Zustand befindet.

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

Die Ausgabe könnte so aussehen:

{
    "services": [{
        "serviceArn": "arn:aws:ecs:ap-southeast-2:111122223333:service/my-cluster/example-service",
        "serviceName": "example-service",
        "clusterArn": "arn:aws:ecs:ap-southeast-2:111122223333:cluster/example-cluster",
        "loadBalancers": [],
        "serviceRegistries": [],
        "status": "ACTIVE",
        ......
    }]
}

PlatformTaskDefinitionIncompatibilityException

Dieser Fehler tritt auf, wenn eine Aufgabe auf einer Plattform gelauncht wird, die die in der Aufgabendefinition erforderlichen Funktionen nicht erfüllt. Angenommen, Sie versuchen, einen Service mit einem Amazon-EFS-Volume zu erstellen, das an Plattformversion 1.3.0 angefügt ist:

$ aws ecs create-service \
    --cluster example-cluster \
    --task-definition Test-fargate-EFS \
    --launch-type FARGATE \
    --service-name example-service \
    --desired-count 1 \
    --network-configuration="awsvpcConfiguration={subnets=["subnet-ed7d31b5","subnet-833ef1cb"],securityGroups=["sg-eeb28aa1"]}" \
    --platform-version 1.3.0

Dann wird der folgende Fehler angezeigt:

An error occurred (PlatformTaskDefinitionIncompatibilityException) when calling the CreateService operation: One or more of the requested capabilities are not supported.

Um dieses Problem zu beheben, verwenden Sie unbedingt die Plattformversion, die die Funktionsanforderungen in der Aufgabendefinition unterstützt. Informationen zu den unterstützten Funktionen in den verschiedenen Plattformversionen finden Sie unter AWS-Fargate-Plattformversionen.

PlatformUnknownException

Dieser Fehler tritt auf, wenn Sie beim Launchen einer Aufgabe eine unbekannte oder falsche Plattformversion angeben. Angenommen, Sie geben eine falsche Plattformversion 1.3 anstelle von Version 1.3.0 an:

$ aws ecs create-service \
    --cluster example-cluster\
    --task-definition example-task \
    --launch-type FARGATE\
    --enable-execute-command \
    --service-name example-service\
    --desired-count 1 \
    --network-configuration="awsvpcConfiguration={subnets=["subnet-ed7d31b5","subnet-833ef1cb"],securityGroups=["sg-eeb28aa1"]}"\
    --platform-version 1.3

Dann wird der folgende Fehler angezeigt:

An error occurred (PlatformUnknownException) when calling the CreateService operation: The specified platform does not exist.

Weitere Informationen finden Sie unter Linux-Plattformversionen und Windows-Plattformversionen.

ServiceNotFoundException

Dieser Fehler tritt auf, wenn der ECS-Service, der in Ihrem Befehl oder Code angegeben ist, nicht existiert. Stellen Sie sicher, dass der Servicename in Ihrem Befehl oder Code korrekt ist und der Service im Cluster vorhanden ist.

Führen Sie den folgenden Befehl aus, um alle Services im Cluster anzuzeigen:

$ aws ecs list-services --cluster example-cluster

UnsupportedFeatureException

Dieser Fehler tritt auf, wenn eine ECS-Funktion in einer bestimmten Region nicht verfügbar ist. Beispielsweise ist die AWS-Fargate-Funktion möglicherweise nicht sofort in einer neu gelaunchten Region verfügbar. Wenn eine Fargate-Aufgabe in dieser Region gelauncht wird, wird der Fehler UnsupportedFeatureException angezeigt.

API-Probleme der Anwendung

Im Folgenden sind einige der am häufigsten auftretenden HTTP-5xx-Fehler aufgeführt, die auftreten können, wenn Sie auf eine Anwendung zugreifen, die in einer ECS-Aufgabe gehostet ist:

500 – Interner Serverfehler: Dieser Fehler tritt auf, wenn die Anwendung auf eine unerwartete Bedingung stößt. Dieser Fehler kann aufgrund einer falschen Konfiguration der Anwendung oder eines Fehlers mit der Anwendung auftreten.

503 – Service nicht verfügbar: Dieser Fehler tritt unter den folgenden Bedingungen auf:

  • Die ECS-Aufgabe ist stark ausgelastet und kann die Anforderung nicht bearbeiten.
  • Die in Ihrer Aufgabe ausgeführte Anwendung ist wegen Wartungsarbeiten nicht verfügbar.

Gehen Sie wie folgt vor, um diese Fehler zu beheben:

Analysieren Sie die Anwendungsprotokolle für die ECS-Aufgaben in Amazon CloudWatch Logs. Informationen zur Protokollgruppe finden Sie in der Aufgabendefinition. Jede Aufgabe ist mit einem einzelnen Protokollstream verknüpft, der die Anwendungsprotokolle der Aufgabe enthält.

Führen Sie den folgenden Befehl aus, um die Protokollgruppe und den Protokollstream für Ihre Aufgabe anzuzeigen:

$ aws ecs describe-task-definition —task-definition example-taskdefinition

Die Ausgabe sieht ähnlich aus wie die folgende:

...
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "/ecs/example-task",
                        "awslogs-region": "ap-southeast-2",
                        "awslogs-stream-prefix": "ecs"
                    }
                }
...

Relevante Informationen

Gründe für API-Fehler

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren