Behandlung von Ereignissen - Amazon ECS

Behandlung von Ereignissen

Amazon ECS sendet Ereignisse mindestens einmal. Dies bedeutet, dass Sie möglicherweise mehrere Kopien eines bestimmten Ereignisses 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 die Eigenschaft version. 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 den Aufgabenstatus mit EventBridge replizieren, können Sie die Version einer von Amazon ECS-APIs gemeldeten Ressource mit der in EventBridge gemeldeten version für die Ressource vergleichen, um zu überprüfen, ob die Version in Ihrem Ereignis-Stream aktuell ist. 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 2.7 geschriebene Lambda-Funktion, die Aufgabenstatusänderungsereignisse erfasst und in der folgenden Amazon DynamoDB-Tabelle speichert:

  • ECSTaskState: Speichert den neuesten Status für eine 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"] 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 )