Verworfene Datensätze für eine DynamoDB-Ereignisquelle in Lambda aufbewahren
Die Fehlerbehandlung für DynamoDB-Zuordnungen von Ereignisquellen hängt davon ab, ob der Fehler vor dem Aufruf der Funktion oder während des Funktionsaufrufs auftritt:
-
Vor dem Aufruf: Wenn eine Lambda-Zuordnung von Ereignisquellen die Funktion aufgrund von Drosselung oder anderen Problemen nicht aufrufen kann, versucht sie es erneut, bis die Datensätze ablaufen oder das in der Zuordnung von Ereignisquellen konfigurierte Höchstalter (MaximumRecordAgeInSeconds) überschreiten.
-
Während des Aufrufens: Wenn die Funktion aufgerufen wird, aber einen Fehler zurückgibt, versucht Lambda so lange, bis die Datensätze ablaufen, das maximale Alter (MaximumRecordAgeInSeconds) überschreiten oder das konfigurierte Wiederholungskontingent erreicht haben (MaximumRetryAttempts). Bei Funktionsfehlern können Sie auch BisectBatchOnFunctionError konfigurieren. Dadurch wird ein fehlgeschlagener Batch in zwei kleinere Batches aufgeteilt, um fehlerhafte Datensätze zu isolieren und Timeouts zu vermeiden. Durch das Aufteilen von Batches wird die Quote für Wiederholungen nicht verbraucht.
Wenn die Fehlerbehandlungsmaßnahmen fehlschlagen, verwirft Lambda die Datensätze und setzt die Verarbeitung von Batches aus dem Stream fort. Bei den Standardeinstellungen bedeutet dies, dass ein fehlerhafter Datensatz die Verarbeitung auf dem betroffenen Shard für bis zu einen Tag blockieren kann. Um dies zu vermeiden, konfigurieren Sie die Ereignisquellenzuordnung Ihrer Funktion mit einer angemessenen Anzahl von Wiederholungen und einem maximalen Datensatzalter, das zu Ihrem Anwendungsfall passt.
Konfigurieren von Zielen für fehlgeschlagene Aufrufe
Um Datensätze zu fehlgeschlagenen Aufrufen zur Zuordnung von Ereignisquellen beizubehalten, fügen Sie der Zuordnung von Ereignisquellen Ihrer Funktion ein Ziel hinzu. Jeder an das Ziel gesendete Datensatz ist ein JSON-Dokument mit Metadaten über den fehlgeschlagenen Aufruf. Bei Amazon S3-Zielen sendet Lambda auch den gesamten Aufrufdatensatz zusammen mit den Metadaten. Sie können jedes Amazon SNS-Thema, jede Amazon SQS-Warteschlange oder jeden S3-Bucket als Ziel konfigurieren.
Bei Amazon-S3-Zielen können Sie das Feature Amazon S3 Event Notifications verwenden, um Benachrichtigungen zu erhalten, wenn Objekte in Ihren S3-Ziel-Bucket hochgeladen werden. Sie können S3-Ereignisbenachrichtigungen auch so konfigurieren, dass sie eine andere Lambda-Funktion aufrufen, um eine automatische Verarbeitung für fehlgeschlagene Stapel durchzuführen.
Ihre Ausführungsrolle muss über Berechtigungen für das Ziel verfügen:
-
Für SQS-Ziele: sqs:SendMessage
-
Für SNS-Ziele: sns:Publish
-
Für S3-Bucket-Ziele: s3:PutObject and s3:ListBucket
Wenn Sie die Verschlüsselung mit Ihrem eigenen KMS-Schlüssel für ein S3-Ziel aktiviert haben, muss die Ausführungsrolle Ihrer Funktion auch die Berechtigung haben, kms:GenerateDataKey aufzurufen. Wenn sich der KMS-Schlüssel und das S3-Bucket-Ziel in einem anderen Konto als Ihre Lambda-Funktion und Ausführungsrolle befinden, konfigurieren Sie den KMS-Schlüssel so, dass er der Ausführungsrolle vertraut, um „kms:GenerateDataKey“ zuzulassen.
Gehen Sie folgendermaßen vor, um ein Ausfallziel mit der Konsole zu konfigurieren:
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie eine Funktion aus.
-
Wählen Sie unter Function overview (Funktionsübersicht) die Option Add destination (Ziel hinzufügen).
-
Wählen Sie als Quelle die Option Aufruf der Zuordnung von Ereignisquellen aus.
-
Wählen Sie für die Zuordnung von Ereignisquellen eine Ereignisquelle aus, die für diese Funktion konfiguriert ist.
-
Wählen Sie für Bedingung die Option Bei Ausfall aus. Für Aufrufe zur Zuordnung von Ereignisquellen ist dies die einzig akzeptierte Bedingung.
-
Wählen Sie unter Zieltyp den Zieltyp aus, an den Lambda Aufrufdatensätze sendet.
-
Wählen Sie unter Destination (Ziel) eine Ressource aus.
-
Wählen Sie Speichern.
Sie können mit der AWS Command Line Interface auch ein Ausfallziel konfigurieren (AWS CLI). Mit dem folgenden Befehl create-event-source-mappingMyFunction hinzugefügt:
aws lambda create-event-source-mapping \ --function-name "MyFunction" \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \ --destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
Der folgende update-event-source-mapping
aws lambda update-event-source-mapping \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --maximum-retry-attempts 2 \ --maximum-record-age-in-seconds 3600 \ --destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'
Aktualisierte Einstellungen werden asynchron angewendet und werden erst nach Abschluss des Vorgangs in der Ausgabe berücksichtigt. Verwenden Sie den get-event-source-mapping
Um ein Ziel zu entfernen, geben Sie eine leere Zeichenfolge als Argument für den destination-config-Parameter an:
aws lambda update-event-source-mapping \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --destination-config '{"OnFailure": {"Destination": ""}}'
Bewährte Methoden für die Sicherheit in Amazon S3-Zielen
Das Löschen eines S3-Buckets, der als Ziel konfiguriert ist, ohne das Ziel aus der Konfiguration Ihrer Funktion zu entfernen, kann ein Sicherheitsrisiko darstellen. Wenn ein anderer Benutzer den Namen Ihres Ziel-Buckets kennt, kann er den Bucket in seinem AWS-Konto neu erstellen. Aufzeichnungen über fehlgeschlagene Aufrufe werden an den entsprechenden Bucket gesendet, wodurch möglicherweise Daten aus Ihrer Funktion verfügbar gemacht werden.
Warnung
Um sicherzustellen, dass Aufrufdatensätze von Ihrer Funktion nicht an einen S3-Bucket in einem anderen AWS-Konto gesendet werden können, fügen Sie der Ausführungsrolle Ihrer Funktion eine Bedingung hinzu, die s3:PutObject-Berechtigungen auf Buckets in Ihrem Konto beschränkt.
-Das folgende Beispiel zeigt eine IAM-Richtlinie, die die s3:PutObject-Berechtigungen Ihrer Funktion auf Buckets in Ihrem Konto beschränkt. Diese Richtlinie gibt Lambda auch die s3:ListBucket-Erlaubnis, einen S3-Bucket als Ziel zu verwenden.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3BucketResourceAccountWrite", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::*/*", "arn:aws:s3:::*" ], "Condition": { "StringEquals": { "s3:ResourceAccount":"111122223333"} } } ] }
Um der Ausführungsrolle Ihrer Funktion mithilfe der AWS-Managementkonsole oder AWS CLI eine Berechtigungsrichtlinie hinzuzufügen, lesen Sie die Anweisungen in den folgenden Verfahren:
Beispiel für einen Amazon SNS- und Amazon SQS-Aufrufsatz
Das folgende Beispiel zeigt einen Aufrufsatz, den Lambda an ein SQS- oder SNS-Ziel für einen DynamoDB-Stream sendet.
{ "requestContext": { "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81", "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:13:49.717Z", "DDBStreamBatchInfo": { "shardId": "shardId-00000001573689847184-864758bb", "startSequenceNumber": "800000000003126276362", "endSequenceNumber": "800000000003126276362", "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z", "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z", "batchSize": 1, "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388" } }
Sie können diese Informationen verwenden, um die betroffenen Datensätze aus dem Stream für die Fehlersuche abzurufen. Die tatsächlichen Datensätze sind nicht enthalten, daher müssen Sie diesen Datensatz verarbeiten und aus dem Stream abrufen, bevor sie ablaufen und verloren gehen.
Beispiel eines Amazon S3-Aufrufdatensatzes
Das folgende Beispiel zeigt einen Aufrufsatz, den Lambda für einen DynamoDB-Stream an einen S3-Bucket sendet. Zusätzlich zu allen Feldern aus dem vorherigen Beispiel für SQS- und SNS-Ziele enthält das Feld payload den ursprünglichen Aufrufdatensatz als maskierte JSON-Zeichenfolge.
{ "requestContext": { "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81", "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:13:49.717Z", "DDBStreamBatchInfo": { "shardId": "shardId-00000001573689847184-864758bb", "startSequenceNumber": "800000000003126276362", "endSequenceNumber": "800000000003126276362", "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z", "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z", "batchSize": 1, "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388" }, "payload": "<Whole Event>" // Only available in S3 }
Das S3-Objekt, das den Aufrufdatensatz enthält, verwendet die folgende Namenskonvention:
aws/lambda/<ESM-UUID>/<shardID>/YYYY/MM/DD/YYYY-MM-DDTHH.MM.SS-<Random UUID>