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.
Umgang mit ECS Amazon-Events
Amazon ECS sendet Ereignisse mindestens einmal. Das bedeutet, dass Sie möglicherweise mehrere Kopien einer bestimmten Veranstaltung erhalten. Außerdem werden Ereignisse eventuell nicht in der Reihenfolge, in der sie stattgefunden haben, an Ihre Ereignis-Listener übermittelt.
Damit Ereignisse richtig geordnet werden können, enthält der detail
-Abschnitt der einzelnen Ereignisse eine Eigenschaftversion
. Jedes Mal, wenn sich der Status einer Ressource ändert, erhöht sich diese version
. Doppelte Ereignisse haben im detail
-Objekt die gleiche version
. Wenn Sie Ihre ECS Amazon-Container-Instance und den Aufgabenstatus mit replizieren EventBridge, können Sie die Version einer von Amazon gemeldeten Ressource ECS APIs mit der version
gemeldeten Ressource vergleichen, um zu überprüfen, ob die Version in Ihrem Ereignis-Stream aktuell ist. EventBridge Ereignisse mit einer höheren Versionseigenschaftsnummer sind später einzuordnen, als Ereignisse mit niedrigeren Versionsnummern.
Beispiel: Behandlung von Ereignissen in einer AWS Lambda -Funktion
Das folgende Beispiel zeigt eine in Python 3.9 geschriebene Lambda-Funktion, die sowohl Statusänderungsereignisse von Aufgaben als auch von Container-Instance-Zustand erfasst und in einer von zwei Amazon-DynamoDB-Tabellen speichert:
-
ECSCtrInstanceState— Speichert den neuesten Status für eine Container-Instance. Die Tabellen-ID ist der
containerInstanceArn
-Wert der Container-Instance. -
ECSTaskState— Speichert den neuesten Status einer Aufgabe. Die Tabellen-ID ist der
taskArn
-Wert der Aufgabe.
import json import boto3 def lambda_handler(event, context): id_name = "" new_record = {} # For debugging so you can see raw event format. print('Here is the event:') print((json.dumps(event))) if event["source"] != "aws.ecs": raise ValueError("Function only supports input from events with a source type of: aws.ecs") # Switch on task/container events. table_name = "" if event["detail-type"] == "ECS Task State Change": table_name = "ECSTaskState" id_name = "taskArn" event_id = event["detail"]["taskArn"] elif event["detail-type"] == "ECS Container Instance State Change": table_name = "ECSCtrInstanceState" id_name = "containerInstanceArn" event_id = event["detail"]["containerInstanceArn"] else: raise ValueError("detail-type for event is not a supported type. Exiting without saving event.") new_record["cw_version"] = event["version"] new_record.update(event["detail"]) # "status" is a reserved word in DDB, but it appears in containerPort # state change messages. if "status" in event: new_record["current_status"] = event["status"] new_record.pop("status") # Look first to see if you have received a newer version of an event ID. # If the version is OLDER than what you have on file, do not process it. # Otherwise, update the associated record with this latest information. print("Looking for recent event with same ID...") dynamodb = boto3.resource("dynamodb", region_name="us-east-1") table = dynamodb.Table(table_name) saved_event = table.get_item( Key={ id_name : event_id } ) if "Item" in saved_event: # Compare events and reconcile. print(("EXISTING EVENT DETECTED: Id " + event_id + " - reconciling")) if saved_event["Item"]["version"] < event["detail"]["version"]: print("Received event is a more recent version than the stored event - updating") table.put_item( Item=new_record ) else: print("Received event is an older version than the stored event - ignoring") else: print(("Saving new event - ID " + event_id)) table.put_item( Item=new_record )
Das folgende Beispiel von Fargate zeigt eine in Python 3.9 geschriebene Lambda-Funktion, die Aufgabenstatusänderungsereignisse erfasst und in der folgenden Amazon-DynamoDB-Tabelle speichert:
import json import boto3 def lambda_handler(event, context): id_name = "" new_record = {} # For debugging so you can see raw event format. print('Here is the event:') print((json.dumps(event))) if event["source"] != "aws.ecs": raise ValueError("Function only supports input from events with a source type of: aws.ecs") # Switch on task/container events. table_name = "" if event["detail-type"] == "ECS Task State Change": table_name = "ECSTaskState" id_name = "taskArn" event_id = event["detail"]["taskArn"] else: raise ValueError("detail-type for event is not a supported type. Exiting without saving event.") new_record["cw_version"] = event["version"] new_record.update(event["detail"]) # "status" is a reserved word in DDB, but it appears in containerPort # state change messages. if "status" in event: new_record["current_status"] = event["status"] new_record.pop("status") # Look first to see if you have received a newer version of an event ID. # If the version is OLDER than what you have on file, do not process it. # Otherwise, update the associated record with this latest information. print("Looking for recent event with same ID...") dynamodb = boto3.resource("dynamodb", region_name="us-east-1") table = dynamodb.Table(table_name) saved_event = table.get_item( Key={ id_name : event_id } ) if "Item" in saved_event: # Compare events and reconcile. print(("EXISTING EVENT DETECTED: Id " + event_id + " - reconciling")) if saved_event["Item"]["version"] < event["detail"]["version"]: print("Received event is a more recent version than the stored event - updating") table.put_item( Item=new_record ) else: print("Received event is an older version than the stored event - ignoring") else: print(("Saving new event - ID " + event_id)) table.put_item( Item=new_record )