Lambda-Ereignisquellenzuweisung - AWS Lambda

Lambda-Ereignisquellenzuweisung

Anmerkung

Wenn Sie Daten an ein anderes Ziel als eine Lambda-Funktion senden oder die Daten vor dem Senden anreichern möchten, finden Sie weitere Informationen unter Amazon-EventBridge-Pipes.

Eine Ereignisquellenzuordnung ist eine Lambda-Ressource, die aus einer Ereignisquelle liest und eine Lambda-Funktion aufruft. Sie können Ereignisquellen-Zuweisungen zum Verarbeiten von Elementen aus einem Stream oder einer Warteschlange in Services verwenden, die keine Lambda-Funktionen direkt aufrufen. Auf dieser Seite werden die Services beschrieben, die Lambda für Zuordnungen von Ereignisquellen bereitstellt, und die Feinabstimmung des Batching-Verhaltens.

Eine Ereignisquellen-Zuweisung verwendet die Berechtigungen in der Ausführungsrolle der Funktion zum Lesen und Verwalten von Elementen in der Ereignisquelle. Berechtigungen, Ereignisstruktur, Einstellungen und Abrufverhalten variieren je nach Ereignisquelle. Weitere Informationen finden Sie in dem verküpften Thema für den Service, den Sie als Ereignisquelle verwenden.

Um eine Ereignisquelle mit der AWS Command Line Interface (AWS CLI) oder einem AWS-SDK zu verwalten, können Sie die folgenden API-Operationen verwenden:

Anmerkung

Wenn Sie eine Zuordnung von Ereignisquellen für Amazon MQ, Amazon MSK, den selbstverwalteten Apache Kafka oder Amazon DocumentDB aktualisieren, deaktivieren oder löschen, kann es bis zu 15 Minuten dauern, bis Ihre Änderungen wirksam werden. Bevor dieser Zeitraum abgelaufen ist, kann Ihre Zuordnung von Ereignisquellen weiterhin Ereignisse verarbeiten und Ihre Funktion mit Ihren vorherigen Einstellungen aufrufen. Dies gilt auch dann, wenn der in der Konsole angezeigte Status der Zuordnung von Ereignisquellen darauf hinweist, dass Ihre Änderungen übernommen wurden.

Im folgenden Beispiel wird mithilfe der AWS CLI eine Funktion namens my-function einem DynamoDB-Stream zugeordnet, der durch seinen Amazon-Ressourcennamen (ARN) angegeben wird – mit einer Batchgröße von 500.

aws lambda create-event-source-mapping --function-name my-function --batch-size 500 --maximum-batching-window-in-seconds 5 --starting-position LATEST \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525

Die Ausgabe sollte folgendermaßen aussehen:

{ "UUID": "14e0db71-5d35-4eb5-b481-8945cf9d10c2", "BatchSize": 500, "MaximumBatchingWindowInSeconds": 5, "ParallelizationFactor": 1, "EventSourceArn": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1560209851.963, "LastProcessingResult": "No records processed", "State": "Creating", "StateTransitionReason": "User action", "DestinationConfig": {}, "MaximumRecordAgeInSeconds": 604800, "BisectBatchOnFunctionError": false, "MaximumRetryAttempts": 10000 }

Lambda-Ereignisquellenzuordnungen verarbeiten Ereignisse aufgrund der verteilten Natur ihrer Poller mindestens einmal. Infolgedessen kann Ihre Lambda-Funktion in seltenen Situationen doppelte Ereignisse erhalten. Folgen Sie Bewährte Methoden für die Arbeit mit AWS Lambda-Funktionen und erstellen Sie idempotente Funktionen, um Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden.

Batching-Verhalten

Ereignisquellenzuordnungen lesen Elemente aus einer Zielereignisquelle. Standardmäßig batcht eine Ereignisquellenzuordnung Datensätze in einer einzigen Nutzlast, die Lambda an Ihre Funktion sendet. Um das Batching-Verhalten zu optimieren, können Sie ein Batching-Fenster (MaximumBatchingWindowInSeconds) und eine Batch-Größe (BatchSize) konfigurieren. Ein Batch-Fenster ist die maximale Zeitspanne zur Erfassung von Datensätzen in einer einzigen Nutzlast. Eine Batch-Größe ist die maximale Anzahl von Datensätzen in einem einzigen Batch. Lambda ruft Ihre Funktion auf, wenn eines der folgenden drei Kriterien erfüllt ist:

  • Das Batching-Fenster erreicht seinen Maximalwert. Das Batch-Fensterverhalten unterscheidet sich je nach Ereignisquelle.

    • Für Kinesis-, DynamoDB- und Amazon SQS SQS-Ereignisquellen: Das Standard-Batch-Fenster beträgt 0 Sekunden. Dies bedeutet, dass Lambda Batches so schnell wie möglich an Ihre Funktion sendet. Wenn Sie ein MaximumBatchingWindowInSeconds konfigurieren, beginnt das nächste Batch-Fenster, sobald der vorherige Funktionsaufruf abgeschlossen ist.

    • Für Amazon-MSK-, selbstverwaltete Apache-Kafka-, Amazon-MQ- und Amazon-DocumentDB-Ereignisquellen: Das standardmäßige Batching-Fenster beträgt 500 ms. Sie können MaximumBatchingWindowInSeconds auf einen beliebigen Wert von 0 Sekunden bis 300 Sekunden in Sekundenschritten einstellen. Ein Batch-Fenster beginnt, sobald der erste Datensatz eintrifft.

      Anmerkung

      Da Sie MaximumBatchingWindowInSeconds nur in Sekundenschritten ändern können, können Sie nicht zu dem Standard-Batch-Fenster von 500 ms zurückkehren, nachdem Sie es geändert haben. Um das Standard-Batch-Fenster wiederherzustellen, müssen Sie eine neue Ereignisquellenzuordnung erstellen.

  • Die Batch-Größe wird erreicht. Die minimale Batch-Größe beträgt 1. Die Standard- und die maximale Batch-Größe hängen von der Ereignisquelle ab. Weitere Informationen zu diesen Werten finden Sie unter BatchSize-Spezifikation für die CreateEventSourceMapping-API-Operation.

  • Die Nutzlastgröße erreicht 6 MB. Sie können dieses Limit nicht ändern.

Das folgende Diagramm verdeutlicht diese Bedingungen. Angenommen, ein Batch-Fenster beginnt bei t = 7 Sekunden. Im ersten Szenario erreicht das Batch-Fenster sein Maximum von 40 Sekunden bei t = 47 Sekunden nach dem Erfassen von 5 Datensätzen. Im zweiten Szenario erreicht die Batch-Größe 10, bevor das Batch-Fenster abläuft, sodass das Batch-Fenster früh endet. Im dritten Szenario wird die maximale Nutzlastgröße erreicht, bevor das Batch-Fenster abläuft, sodass das Batch-Fenster frühzeitig endet.


        Ein Batch-Fenster läuft ab, wenn eines der folgenden drei Kriterien erfüllt ist: Das Batch-Fenster erreicht seinen Maximalwert, die Batch-Größe wird erreicht oder die Nutzlastgröße erreicht 6 MB.

Das folgende Beispiel zeigt eine Ereignisquellen-Zuweisung, die aus einem Kinesis-Stream liest. Wenn bei einem Batch von Ereignissen alle Verarbeitungsversuche fehlschlagen, sendet die Ereignisquellen-Zuweisung-Details über den Batch an eine SQS-Warteschlange.


        Eine Ereignisquellen-Zuweisung liest aus einem Kinesis-Stream. Sie stellt Datensätze lokal in die Warteschlange, bevor sie an die Funktion gesendet werden.

Der Ereignisbatch ist das Ereignis, das Lambda an die Funktion sendet. Es handelt sich um einen Batch von Datensätzen oder Nachrichten, die aus den Elementen kompiliert werden, die von der Ereignisquellenzuordnung bis zum Ablauf des aktuellen Batch-Fensters gelesen werden.

Bei Kinesis- und DynamoDB-Streams erstellt eine Zuordnung von Ereignisquellen einen Iterator für jeden Shard im Stream und verarbeitet die Elemente in jedem Shard der Reihe nach. Sie können die Ereignisquellen-Zuweisung so konfigurieren, dass sie nur die neuen Elemente liest, die im Stream erscheinen, oder dass sie bei älteren Elementen beginnt. Verarbeitete Elemente werden nicht aus dem Stream entfernt und können von anderen Funktionen oder Konsumenten verarbeitet werden.

Lambda wartet mit dem Senden des nächsten zu verarbeitenden Stapels nicht, bis ggf. konfigurierte Lambda-Erweiterungen abgeschlossen sind. Anders ausgedrückt: Ihre Erweiterungen werden möglicherweise weiter ausgeführt, während Lambda den nächsten Stapel von Datensätzen verarbeitet. Dies kann zu Drosselungsproblemen führen, wenn Sie gegen eine Einstellung oder gegen einen Grenzwert im Zusammenhang mit der Parallelität Ihres Kontos verstoßen. Um zu erkennen, ob möglicherweise ein Problem vorliegt, müssen Sie Ihre Funktionen überwachen sowie überprüfen, ob für Ihre Zuordnung von Ereignisquellen unerwartet hohe Parallelitätsmetriken vorliegen.

Wenn Ihre Funktion einen Fehler zurückgibt, verarbeitet die Ereignisquellenzuordnung standardmäßig das gesamte Batch erneut, bis die Funktion erfolgreich ist oder die Elemente im Batch ablaufen. Um eine ordnungsgemäße Verarbeitung zu gewährleisten, unterbricht die Ereignisquellenzuordnung die Verarbeitung für den betroffenen Shard, bis der Fehler behoben ist. Sie können die Zuordnung von Ereignisquellen so konfigurieren, dass alte Ereignisse verworfen oder mehrere Stapel parallel verarbeitet werden. Wenn Sie mehrere Batches parallel verarbeiten, ist die ordnungsgemäße Verarbeitung für jeden Partitionsschlüssel immer noch gewährleistet, aber die Ereignisquellenzuordnung verarbeitet gleichzeitig mehrere Partitionsschlüssel im selben Shard.

Für Stream-Quellen (DynamoDB und Kinesis) können Sie die maximale Anzahl von Wiederholungsversuchen von Lambda konfigurieren, wenn Ihre Funktion einen Fehler zurückgibt. Service-Fehler oder Drosselungen, bei denen der Stapel Ihre Funktion nicht erreicht, zählen nicht zu den Wiederholungsversuchen.

Sie können die Ereignisquellen-Zuweisung auch so konfigurieren, dass ein Aufrufdatensatz an einen anderen Service gesendet wird, wenn ein Ereignisbatch verworfen wird. Lambda unterstützt die folgenden Ziele für Ereignisquellen-Zuweisungen.

  • Amazon SQS – Eine SQS-Warteschlange.

  • Amazon SNS – Ein SNS-Thema.

Der Aufrufdatensatz enthält Details zum fehlgeschlagenen Ereignisbatch im JSON-Format.

Das folgende Beispiel zeigt einen Aufrufdatensatz für einen Kinesis-Stream.

Beispiel Aufrufdatensatzglauben
{ "requestContext": { "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction", "condition": "RetryAttemptsExhausted", "approximateInvokeCount": 1 }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "version": "1.0", "timestamp": "2019-11-14T00:38:06.021Z", "KinesisBatchInfo": { "shardId": "shardId-000000000001", "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722", "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186", "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z", "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z", "batchSize": 500, "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream" } }

Lambda unterstützt auch die Verarbeitung in der Reihenfolge für FIFO-Warteschlangen (First-In, First-Out), die auf die Anzahl der aktiven Nachrichtengruppen skaliert wird. Bei Standard-Warteschlangen werden Elemente nicht unbedingt der Reihe nach verarbeitet. Lambda skaliert hoch, um eine Standardwarteschlange so schnell wie möglich zu verarbeiten. Wenn ein Fehler auftritt, sendet Lambda Batches als einzelne Elemente an die Warteschlange zurück und verarbeitet sie möglicherweise in einer anderen Gruppierung als im ursprünglichen Batch. Gelegentlich kann es vorkommen, dass die Ereignisquellen-Zuweisung dasselbe Element aus der Warteschlange zweimal erhält, auch wenn kein Funktionsfehler aufgetreten ist. Lambda löscht Elemente aus der Warteschlange, nachdem sie erfolgreich verarbeitet wurden. Sie können die Ausgangswarteschlange so konfigurieren, dass Elemente an eine Warteschlange für unzustellbare Nachrichten gesendet werden, wenn Lambda sie nicht verarbeiten kann.

Weitere Informationen zu Services, die Lambda-Funktionen direkt aufrufen, finden Sie unter Verwenden von AWS Lambda mit sonstigen Services.