View a markdown version of this page

Sicherstellung der Idempotenz - Amazon Elastic Container Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Sicherstellung der Idempotenz

Wenn Sie einen Mutationsvorgang durchführen, wird möglicherweise eine Ausnahme angezeigt, die auf Timeouts oder Serverprobleme zurückzuführen ist, die nach der Mutation der Ressourcen auftreten. Dies kann es schwierig machen, festzustellen, ob die Mutation aufgetreten ist, und kann zu mehreren Wiederholungsversuchen führen. Wenn der ursprüngliche Vorgang und die nachfolgenden Wiederholungen die Mutationen jedoch tatsächlich durchgeführt haben, haben Sie möglicherweise Stacking-Änderungen vorgenommen oder mehr Ressourcen erstellt, als Sie beabsichtigt hatten. Idempotenz stellt sicher, dass eine Operation Ressourcen nicht öfter als einmal mutiert. Wenn bei einer idempotenten Anfrage die ursprüngliche Anfrage erfolgreich mutiert wurde, werden alle nachfolgenden Versuche erfolgreich abgeschlossen, ohne dass eine weitere Mutation durchgeführt wird.

Idempotenz in Amazon ECS

Die folgenden API-Aktionen unterstützen optional Idempotenz mithilfe eines Client-Tokens. Die entsprechenden AWS CLI Befehle unterstützen auch Idempotenz mithilfe eines Client-Tokens. Ein Client-Token ist eine eindeutige Zeichenfolge, bei der Groß- und Kleinschreibung beachtet wird. Um mit einer dieser Aktionen eine idempotente API-Anfrage zu stellen, geben Sie in der Anfrage ein Client-Token an. Sie sollten dasselbe Client-Token nicht für andere API-Anfragen wiederverwenden. Wenn Sie eine Anfrage, die erfolgreich abgeschlossen wurde, mit demselben Client-Token und denselben Parametern erneut versuchen, ist die Wiederholung erfolgreich, ohne dass weitere Aktionen ausgeführt werden.

Ich bin impotent, wenn ein Client-Token verwendet wird
  • CreateService

    Das Client-Token kann bis zu 36 ASCII-Zeichen im Bereich von 33—126 (einschließlich) enthalten.

  • CreateTaskSet

    Das Client-Token kann bis zu 36 ASCII-Zeichen im Bereich von 33—126 (einschließlich) enthalten.

  • RunTask

    Das Client-Token kann bis zu 64 ASCII-Zeichen im Bereich von 33—126 (einschließlich) enthalten.

Arten von Idempotenz
  • Cluster — Anfragen mit demselben Token im selben Cluster sind idempotent. Beispielsweise kann ClientToken A nur einmal als Anforderungsparameter für RunTask Anfragen in Cluster X verwendet werden. RunTask Anfragen an andere Cluster werden als separate Anfrage betrachtet. Daher können Sie ClientToken A für eine RunTask Anfrage für Cluster Y verwenden.

Idempotenz für RunTask

Die RunTask API unterstützt Idempotenz mithilfe eines Client-Tokens. Ein Client-Token ist eine eindeutige Zeichenfolge, die Sie beim Senden einer API-Anforderung angeben. Wenn Sie eine API-Anforderung mit demselben Client-Token und denselben Anforderungsparametern wiederholen, nachdem sie erfolgreich abgeschlossen wurde, wird das Ergebnis der ursprünglichen Anforderung zurückgegeben. Wenn Sie eine erfolgreiche Anfrage mit demselben Client-Token erneut versuchen, aber einer oder mehrere der Parameter anders sind als die Region oder Availability Zone, schlägt der erneute Versuch mit einem fehl. ConflictException Wenn Sie kein eigenes Client-Token angeben, generiert das AWS SDK AWS Command Line Interface automatisch ein Client-Token für die Anfrage, um sicherzustellen, dass sie idempotent ist. Ein Client-Token kann eine beliebige Zeichenfolge sein, die bis zu 64 ASCII-Zeichen im Bereich von 33—126 (einschließlich) enthält.

Die Gültigkeitsdauer (TTL) für das RunTask Client-Token beträgt 24 Stunden. Sie sollten dasselbe Client-Token nicht für verschiedene Anfragen wiederverwenden. Die maximale TTL des Client-Tokens ist gültig, je nachdem, welcher der beiden folgenden Werte niedriger ist:

  • 24 Stunden

  • Die Lebensdauer der Ressource plus eine Stunde

    Die Lebensdauer einer Ressource entspricht dem Zeitstempel, zu dem die Aufgabe erstellt wurde, und dem Zeitstempel, zu dem der letzte Status (lastStatus) übergegangen ist. STOPPED Wenn Sie RunTask mehr als eine Aufgabe starten, entspricht die Lebensdauer der Ressource der Lebensdauer der letzten Aufgabe, zu der gewechselt wurde. STOPPED

RunTask Regeln und Antworten erneut versuchen

Wenn Sie eine Anfrage erneut versuchen, weil Sie eine 5xx-Ausnahme erhalten haben, enthält die wiederholte erfolgreiche Antwort normalerweise alle Informationen, die bei der ursprünglichen Anfrage zurückgegeben worden wären. Aufgaben, die für weniger als eine Stunde angehalten wurden, enthalten nur den ARN der Aufgabe, den letzten Status und den gewünschten Status.

Im Folgenden finden Sie ein Beispiel für die Antwort auf einen erneuten Versuch, wenn eine Aufgabe ausgeführt, eine Aufgabe gestoppt wurde und eine Aufgabe nicht gestartet werden konnte.

{ "failures": [ { "arn": "arn:aws:ecs:us-east-1:123456789012:container/4df26bb4-f057-467b-a079-961675296e64", "reason": "RESOURCE:MEMORY" } ], "tasks": [ { "desiredStatus": "RUNNING", "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/default/fdf2c302-468c-4e55-b884-5331d816e7fb", ... }, { "taskArn": "arn:aws:ecs:us-east-1:123456789012:task/default/fdf2c302-468c-4e55-b884-5331d819999", "lastStatus": "STOPPED", ... } ] }

Fehler, die älter als eine Stunde sind, beinhalten nur die Anzahl der fehlgeschlagenen Aufgaben.

Beispiele

AWS CLI Beispiele für Befehle

Um einen AWS CLI Befehl idempotent zu machen, fügen Sie die --client-token Option hinzu.

Beispiel: create-service

Der folgende Befehl create-service verwendet Idempotenz, da er ein Client-Token enthält.

aws ecs create-service \ --cluster MyCluster \ --service MyService \ --task-definition MyTaskDefinition:2 \ --desired-count 2 \ --launch-type FARGATE \ --platform-version LATEST \ --network-configuration "awsvpcConfiguration={subnets=["subnet-12344321"],securityGroups=["sg-12344321"],assignPublicIp="ENABLED"}" \ --client-token 550e8400-e29b-41d4-a716-44665544
Beispiel: create-task-set

Der folgende Befehl create-task-set verwendet Idempotenz, da er ein Client-Token enthält.

aws ecs create-task-set \ --cluster MyCluster \ --service MyService \ --task-definition MyTaskDefinition:2 \ --network-configuration "awsvpcConfiguration={subnets=["subnet-12344321"],securityGroups=["sg-12344321"]}" \ --client-token 550e8400-e29b-41d4-a716-44665544
Beispiel: run-task

Der folgende Run-Task-Befehl verwendet Idempotenz, da er ein Client-Token enthält.

aws ecs run-task \ --cluster MyCluster \ --task-definition MyTaskDefinition:2 \ --client-token 550e8400-e29b-41d4-a716-446655440000

Beispiele für API-Anfragen

Um eine API-Anfrage idempotent zu machen, fügen Sie den clientToken Parameter hinzu.

Beispiel: CreateService

Die folgende CreateServiceAPI-Anfrage verwendet Idempotenz, da sie ein Client-Token enthält.

POST / HTTP/1.1 Host: ecs.us-east-1.amazonaws.com Accept-Encoding: identity Content-Length: 87 X-Amz-Target: AmazonEC2ContainerServiceV20141113.CreateService X-Amz-Date: 20150429T170125Z Content-Type: application/x-amz-json-1.1 Authorization: AUTHPARAMS { "serviceName": "MyService", "taskDefinition": "MyTaskDefinition:2", "desiredCount": 10, "capacityProviderStrategy": [ { "base": "number", "capacityProvider": "FARGATE", "weight": 1 } ], "capacityProviderStrategy": [ { "base": "number", "capacityProvider": "FARGATE_SPOT", "weight": 1 } ], "clientToken": "550e8400-e29b-41d4-a716-44665544" }
Beispiel: CreateTaskSet

Die folgende CreateTaskSetAPI-Anfrage verwendet Idempotenz, da sie ein Client-Token enthält.

POST / HTTP/1.1 Host: ecs.us-east-1.amazonaws.com Accept-Encoding: identity Content-Length: 87 X-Amz-Target: AmazonEC2ContainerServiceV20141113.CreateTaskSet X-Amz-Date: 20150429T170125Z Content-Type: application/x-amz-json-1.1 Authorization: AUTHPARAMS { "serviceName": "MyService", "taskDefinition": "mytask:1", "desiredCount": 1, "capacityProviderStrategy": [ { "base": "number", "capacityProvider": "FARGATE", "weight": 1 } ], "capacityProviderStrategy": [ { "base": "number", "capacityProvider": "FARGATE_SPOT", "weight": 1 } ], "clientToken": "550e8400-e29b-41d4-a716-44665544" }
Beispiel: RunTask

Die folgende RunTaskAPI-Anfrage verwendet Idempotenz, da sie ein Client-Token enthält.

POST / HTTP/1.1 Host: ecs.us-east-1.amazonaws.com Accept-Encoding: identity Content-Length: 45 X-Amz-Target: AmazonEC2ContainerServiceV20141113.RunTask X-Amz-Date: 20161121T215740Z User-Agent: aws-cli/1.11.13 Python/2.7.12 Darwin/16.1.0 botocore/1.4.66 Content-Type: application/x-amz-json-1.1 Authorization: AUTHPARAMS { "count": 1, "taskDefinition": "mytask:1", "clientToken": "550e8400-e29b-41d4-a716-446655440000" }

Die folgende Tabelle zeigt einige häufig vorkommende Antworten, die Sie auf idempotente API-Anfragen erhalten könnten, und stellt Empfehlungen zu Wiederholungsversuchen bereit.

Antwort Empfehlung Kommentare

200 (OK)

Nicht erneut versuchen

Die ursprüngliche Anfrage wurde erfolgreich abgeschlossen. Alle nachfolgenden Wiederholungsversuche werden als erfolgreich zurückgegeben.

Antwortcodes der Serie 400 (Client-Fehler)

Nicht erneut versuchen

Es liegt eins der folgenden Probleme mit der Anfrage vor:

  • Sie enthält einen Parameter oder eine Parameterkombination, der/die nicht gültig ist.

  • Sie verwendet eine Aktion oder Ressource, für die Sie keine Berechtigungen haben.

  • Sie verwendet eine Ressource, deren Status sich gerade ändert.

Wenn die Anfrage eine Ressource umfasst, deren Status sich gerade ändert, könnte ein erneuter Anfrageversuch möglicherweise erfolgreich sein.

Antwortcodes der Serie 500 (Serverfehler)

Erneut versuchen

Der Fehler wird durch ein AWS serverseitiges Problem verursacht und ist im Allgemeinen vorübergehend. Wiederholen Sie die Anfrage mit einer geeigneten Back-off-Strategie.