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.
Amazon ECS sendet Ereignisse mindestens einmal. Das 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 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 Amazon ECS-Container-Instance und den Aufgabenstatus mit replizieren EventBridge, können Sie die vom Amazon ECS gemeldete Version einer Ressource APIs mit der EventBridge für die Ressource version
gemeldeten Version vergleichen, um zu überprüfen, ob die Version in Ihrem Event-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 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 einer Container-Instance. Die Tabellen-ID ist der
containerInstanceArn
-Wert der Container-Instance. -
ECSTaskStatus — 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 Fargate-Beispiel zeigt eine in Python 3.9 geschriebene Lambda-Funktion, die Ereignisse zur Änderung des Aufgabenstatus 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
)