Verwenden von Lambda mit Amazon SQS - AWS Lambda

Verwenden von Lambda mit Amazon SQS

Mit einer Lambda-Funktion können Sie Nachrichten in einer Amazon-SQS-Warteschlange (Amazon Simple Queue Service) verarbeiten. Lambda-Ereignisquellen-Zuweisungenen unterstützen Standardwarteschlangen und First-in-First-out-Warteschlangen (FIFO). Mit Amazon SQS können Sie Aufgaben von einer Komponente Ihrer Anwendung auslagern, indem Sie sie an eine Warteschlange senden und asynchron verarbeiten.

Lambda fragt die Warteschlange ab und ruft Ihre Lambda-Funktion synchron mit einem Ereignis auf, das Warteschlangennachrichten enthält. Lambda liest Nachrichten in Batches und ruft Ihre Funktion einmal für jeden Batch auf. Wenn Ihre Funktion einen Batch erfolgreich verarbeitet, löscht Lambda deren Nachrichten aus der Warteschlange. Das folgende Beispiel zeigt ein Ereignis für einen Batch von zwei Meldungen.

Beispiel Amazon-SQS-Nachrichtenereignis (Standardwarteschlange)

{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }

Lambda fragt standardmäßig bis zu 10 Nachrichten in Ihrer Warteschlange sofort ab und sendet diesen Batch an die Funktion. Damit die Funktion nicht mit einer kleinen Anzahl von Datensätzen aufgerufen wird, können Sie die Ereignisquelle anweisen, Datensätze bis zu 5 Minuten lang zu puffern, indem Sie ein Batch-Fenster konfigurieren. Vor dem Aufrufen der Funktion fragt Lambda weiter Nachrichten aus der SQS-Standardwarteschlange ab, bis das Batch-Fenster abläuft, das Nutzlastkontingent pro Aufruf erreicht ist oder die konfigurierte maximale Batch-Größe erreicht ist.

Anmerkung

Wenn Sie ein Batch-Fenster verwenden und Ihre SQS-Warteschlange sehr wenig Datenverkehr enthält, wartet Lambda möglicherweise bis zu 20 Sekunden, bevor Sie Ihre Funktion aufruft. Dies gilt auch, wenn Sie ein Batch-Fenster unter 20 Sekunden festlegen.

Bei FIFO-Warteschlangen enthalten Datensätze zusätzliche Attribute, die mit der Deduplizierung und Sequenzierung zusammenhängen.

Beispiel Amazon-SQS-Nachrichtenereignis (FIFO-Warteschlange)

{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774", "SequenceNumber": "18849496460467696128", "MessageGroupId": "1", "SenderId": "AIDAIO23YVJENQZJOL4VO", "MessageDeduplicationId": "1", "ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }

Wenn Lambda einen Batch liest, bleiben die Nachrichten in der Warteschlange, werden aber für die Dauer der Zeitbeschränkung für die Sichtbarkeit der Warteschlange ausgeblendet. Wenn Ihre Funktion den Batch erfolgreich verarbeitet, löscht Lambda die Nachrichten aus der Warteschlange. Wenn die Funktion während der Verarbeitung eines Batches auf einen Fehler stößt, werden standardmäßig alle Nachrichten in diesem Batch wieder in der Warteschlange sichtbar. Deshalb muss der Funktionscode in der Lage sein, dieselbe Nachricht mehrmals ohne unbeabsichtigte Begleiterscheinungen zu verarbeiten. Sie können dieses Verhalten bei der erneuten Verarbeitung ändern, indem Sie Batch-Element-Fehler in die Funktionsantwort einbeziehen.

Skalierung und Verarbeitung

Bei Standardwarteschlangen verwendet Lambda Langabfrage, um eine Warteschlange so lange abzufragen, bis sie aktiv wird. Wenn Nachrichten verfügbar sind, liest Lambda bis zu 5 Batches und sendet sie an Ihre Funktion. Wenn weiterhin Nachrichten verfügbar sind, erhöht Lambda die Anzahl der die Batches lesenden Prozesse um bis zu 60 weitere Instances pro Minute. Die maximale Anzahl von Batches, die eine Ereignisquellenzuordnung gleichzeitig verarbeiten kann, ist 1 000.

Bei FIFO-Warteschlangen sendet Lambda Nachrichten in der Reihenfolge, in der sie empfangen wurden, an Ihre Funktion. Wenn Sie eine Nachricht an eine FIFO-Warteschlange senden, geben Sie eine Nachrichtengruppen-ID an. Amazon SQS stellt sicher, dass Nachrichten in derselben Gruppe in der Reihenfolge an Lambda übermittelt werden. Lambda sortiert die Nachrichten in Gruppen und sendet jeweils nur einen Batch für eine Gruppe. Wenn die Funktion einen Fehler zurückgibt, führt sie alle Wiederholungsversuche für die betroffenen Nachrichten aus, bevor Lambda weitere Nachrichten von derselben Gruppe erhält.

Ihre Funktion kann in Gleichzeitigkeit auf die Anzahl aktiver Nachrichtengruppen skaliert werden. Weitere Informationen finden Sie unter SQS FIFO als Ereignisquelle im AWS-Compute Blog.

Konfigurieren einer Warteschlange zur Verwendung mit Lambda

Erstellen Sie eine SQS-Warteschlange als Ereignisquelle für Ihre Lambda-Funktion. Konfigurieren Sie dann die Warteschlange so, dass Ihre Lambda-Funktion Zeit zum Verarbeiten der Ereignisse jedes Batches erhält und Lambda es erneut versuchen kann, wenn Ablehnungsfehler beim Aufwärtsskalieren auftreten.

Damit die Funktion Zeit hat, jeden Batch von Datensätzen zu verarbeiten, legen Sie die Zeitbeschränkung für die Sichtbarkeit der Ausgangswarteschlange auf mindestens das Sechsfache der Zeitbeschränkung fest, die Sie für Ihre Funktion konfigurieren. Diese zusätzliche Zeit ermöglicht es Lambda, einen erneuten Versuch zu machen, wenn die Funktion gedrosselt wird, während ein früherer Batch verarbeitet wird.

Wenn die Funktion eine Nachricht mehrmals nicht verarbeiten kann, kann Amazon SQS sie an eine Warteschlange für unzustellbare Nachrichten senden. Wenn Ihre Funktion einen Fehler zurückgibt, lässt Lambda sie in der Warteschlange. Wenn die Zeitbeschränkung für die Sichtbarkeit auftritt, empfängt Lambda die Nachricht erneut. Um Nachrichten nach einer Anzahl von Empfangsvorgängen an eine zweite Warteschlange zu senden, konfigurieren Sie eine Warteschlange für den Posteingang in der Quellwarteschlange.

Anmerkung

Stellen Sie sicher, dass Sie die Warteschlange für unzustellbare Nachrichten für die Quell-Warteschlange und nicht für die Lambda-Funktion konfigurieren. Die Warteschlange für unzustellbare Nachrichten, die Sie für eine Funktion konfigurieren, wird für die Warteschlange asynchroner Aufrufe der Funktion und nicht für Ereignisquellen-Warteschlangen verwendet.

Wenn Ihre Funktion einen Fehler zurückgibt oder nicht aufgerufen werden kann, da ihre maximale Gleichzeitigkeit erreicht wurde, kann die Verarbeitung mit zusätzlichen Versuchen erfolgreich sein. Damit Nachrichten besser verarbeitet werden können, bevor sie an die Warteschlange gesendet werden, stellen Sie maxReceiveCount für die Redrive-Richtlinie der Quellwarteschlange auf mindestens 5 ein.

Berechtigungen für die Ausführungsrolle

Lambda benötigt die folgenden Berechtigungen zum Verwalten von Nachrichten in der Amazon-SQS-Warteschlange. Fügen Sie sie der Ausführungsrolle Ihrer Funktion hinzu.

Konfigurieren einer Warteschlange als Ereignisquelle

Erstellen Sie ein Ereignisquellen-Mapping, um Lambda anzuweisen, Elemente aus Ihrer Warteschlange an eine Lambda-Funktion zu senden. Sie können mehrere Ereignisquellen-Zuweisungen zum Verarbeiten von Elementen aus mehreren Warteschlangen mit nur einer Funktion erstellen. Wenn Lambda die Zielfunktion aufruft, kann das Ereignis mehrere Elemente bis zu einer konfigurierbaren maximalen Batch-Größe enthalten.

Um Ihre Funktion für das Lesen aus Amazon SQS in der Lambda-Konsole zu konfigurieren, erstellen Sie einen SQS-Auslöser.

So erstellen Sie einen Auslöser

  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie den Namen einer Funktion aus.

  3. Wählen Sie unter Function overview (Funktionsübersicht) die Option Add trigger (Trigger hinzufügen).

  4. Wählen Sie den SQS-Auslösertyp.

  5. Konfigurieren Sie die erforderlichen Optionen und wählen Sie dann Add (Hinzufügen) aus.

Lambda unterstützt die folgenden Optionen für Amazon-SQS-Ereignisquellen.

Optionen für die Ereignisquelle

  • SQS-Warteschlange – Die Amazon-SQS-Warteschlange, aus der Datensätze gelesen werden sollen.

  • Batch-Größe – Die Anzahl der Datensätze, die in jedem Batch an die Funktion gesendet werden sollen. Bei einer Standardwarteschlange können dies bis zu 10.000 Datensätze sein. Bei einer FIFO-Warteschlange liegt der Höchstwert bei 10. Bei einer Batch-Größe über 10 müssen Sie den MaximumBatchingWindowInSeconds-Parameter zusätzlich auf mindestens 1 Sekunde setzen. Lambda übergibt alle Datensätze im Batch in einem einzigen Aufruf an die Funktion, solange die Gesamtgröße der Ereignisse nicht das Nutzlastkontingent pro Aufruf für synchrone Aufrufe überschreitet (6 MB).

    Sowohl Lambda als auch Amazon SQS generieren Metadaten für jeden Datensatz. Diese zusätzlichen Metadaten werden auf die Gesamtnutzlastgröße angerechnet und können dazu führen, dass die Gesamtzahl der in einem Batch gesendeten Datensätze niedriger ist als die konfigurierte Batch-Größe. Die Metadatenfelder, die Amazon SQS sendet, können in der Länge variabel sein. Weitere Informationen zu den Metadatenfeldern von Amazon SQS finden Sie in der Dokumentation zur ReceiveMessage-API-Operation in der Referenz für die API von Amazon Simple Queue Service.

  • Batch window (Batch-Fenster) – Die maximale Zeitspanne zur Erfassung von Datensätzen vor dem Aufruf der Funktion (in Sekunden). Dies gilt nur für Standardwarteschlangen.

    Wenn Sie ein Batch-Fenster von mehr als 0 Sekunden verwenden, müssen Sie die erhöhte Verarbeitungszeit in der Zeitbeschränkung für die Sichtbarkeit der Warteschlange berücksichtigen. Wir empfehlen, die Zeitbeschränkung für die Sichtbarkeit der Warteschlange auf das Sechsfache der Funktionszeitüberschreitung plus den Wert von MaximumBatchingWindowInSeconds festzulegen. Dies gibt Ihrer Lambda-Funktion Zeit, jeden Ereignis-Batch zu verarbeiten und es im Falle eines Drosselungsfehlers erneut zu versuchen.

    Anmerkung

    Wenn das Batch-Fenster größer als 0 und (batch window) + (function timeout) > (queue visibility timeout) ist, beträgt die effektive Zeitbeschränkung für die Sichtbarkeit der Warteschlange (batch window) + (function timeout) + 30s.

    Lambda verarbeitet bis zu 5 Batches gleichzeitig. Das bedeutet, dass maximal 5 Worker zur Verfügung stehen, die Nachrichten parallel stapeln und verarbeiten können. Wenn weiterhin Nachrichten verfügbar sind, erhöht Lambda die Anzahl der die Batches lesenden Prozesse um bis zu 60 weitere Instances pro Minute. Die maximale Anzahl von Batches, die eine Ereignisquellenzuordnung gleichzeitig verarbeiten kann, ist 1 000. Weitere Informationen finden Sie unter Skalierung und Verarbeitung.

  • Enabled (Aktiviert) – Der Status der Ereignisquellenzuordnung. Auf „true“ festlegen, um die Ereignisquellenzuordnung zu aktivieren. Auf "false" festlegen, um die Verarbeitung von Datensätzen zu beenden.

Anmerkung

Amazon SQS verfügt über ein unbegrenztes kostenloses Kontingent für Anfragen. Über das kostenlose Kontingent hinaus werden von Amazon SQS Gebühren pro Million Anfragen berechnet. Während das Ereignisquellen-Mapping aktiv ist, werden von Lambda Anforderungen an die Warteschlange gesendet, um Elemente abzurufen. Details zu den Preisen finden Sie unter Amazon-SQS-Preise.

Um die Konfiguration der Ereignisquelle später in der Lambda-Konsole zu verwalten, wählen Sie im Designer den SQS-Auslöser aus.

Konfigurieren Sie die Zeitbeschränkung für Ihre Funktion, damit ausreichend Zeit für die Verarbeitung eines gesamten Elements-Batches bleibt. Wenn die Verarbeitung bestimmter Elemente lange Zeit in Anspruch nimmt, wählen Sie eine kleinere Batch-Größe. Eine große Batchgröße kann die Effizienz für Workloads erhöhen, die sehr schnell sind oder viel Overhead aufweisen. Wenn Ihre Funktion jedoch einen Fehler zurückgibt, kehren alle Elemente im Batch zur Warteschlange zurück. Wenn Sie reservierte Nebenläufigkeit für Ihre Funktion konfigurieren, legen Sie mindestens fünf gleichzeitige Ausführungen fest, um das Risiko von Drosselungsfehlern zu senken, wenn Lambda die Funktion aufruft. Um Drosselungsfehler auszuschließen, legen Sie den Wert der reservierten Nebenläufigkeit auf 1 000 fest, was der maximalen Anzahl gleichzeitiger Ausführungen für eine Amazon-SQS-Ereignisquelle entspricht.

APIs für die Ereignisquellenzuordnung

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:

Im folgenden Beispiel wird die AWS CLI verwendet, um eine Funktion mit dem Namen my-function einer Amazon-SQS-Warteschlange zu mappen, die durch den Amazon-Ressourcennamen (ARN) angegeben wird; die Batchgröße beträgt 5 und das Batch-Fenster beträgt 60 Sekunden.

aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --maximum-batching-window-in-seconds 60 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue

Die Ausgabe sollte folgendermaßen aussehen:

{ "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "MaximumBatchingWindowInSeconds": 60, "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "State": "Creating", "StateTransitionReason": "USER_INITIATED" }

Melden von Batch-Elementen

Wenn die Lamda-Funktion während der Verarbeitung eines Batches auf einen Fehler stößt, werden standardmäßig alle Nachrichten in diesem Batch wieder in der Warteschlange sichtbar, einschließlich Nachrichten, die Lambda erfolgreich verarbeitet hat. Infolgedessen kann es passieren, dass die Funktion dieselbe Nachricht mehrmals verarbeitet.

Damit nicht alle Nachrichten in einem fehlgeschlagenen Batch erneut verarbeitet werden, können Sie die Ereignisquellenzuordnung so konfigurieren, dass nur die fehlgeschlagenen Nachrichten wieder sichtbar werden. Fügen Sie dazu beim Konfigurieren der Ereignisquellenzuordnung den Wert ReportBatchItemFailures in der Liste FunctionResponseTypes ein. Dadurch kann die Funktion einen Teilerfolg zurückgeben, was die Anzahl unnötiger Wiederholungsversuche für Datensätze reduzieren kann.

Berichtsyntax

Nachdem Sie ReportBatchItemFailures in Ihre Konfiguration der Ereignisquellenzuordnung einbezogen haben, können Sie eine Liste der IDs der fehlgeschlagenen Nachrichten in der Funktionsantwort zurückgeben. Angenommen, Sie haben einen Batch von fünf Nachrichten mit den Nachrichten-IDs id1, id2, id3, id4 und id5. Die Funktion verarbeitet erfolgreich id1, id3 und id5. Damit die Nachrichten id2 und id4 in der Warteschlange wieder sichtbar werden, sollte Ihre Antwortsyntax etwa folgendermaßen aussehen:

{ "batchItemFailures": [ { "itemIdentifier": "id2" }, { "itemIdentifier": "id4" } ] }

Um die Liste der IDs der fehlgeschlagenen Nachrichten im Batch zurückzugeben, können Sie ein SQSBatchResponse-Klassenobjekt verwenden oder eine eigene benutzerdefinierte Klasse erstellen. Hier finden Sie ein Beispiel für eine Antwort mit dem Objekt SQSBatchResponse.

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse; import java.util.ArrayList; import java.util.List; public class ProcessSQSMessageBatch implements RequestHandler<SQSEvent, SQSBatchResponse> { @Override public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) { List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new ArrayList<SQSBatchResponse.BatchItemFailure>(); String messageId = ""; for (SQSEvent.SQSMessage message : sqsEvent.getRecords()) { try { //process your message messageId = message.getMessageId(); } catch (Exception e) { //Add failed message identifier to the batchItemFailures list batchItemFailures.add(new SQSBatchResponse.BatchItemFailure(messageId)); } } return new SQSBatchResponse(batchItemFailures); } }

Um dieses Feature nutzen zu können, muss Ihre Funktion Fehler ordnungsgemäß verarbeiten. Die Funktionslogik muss alle Ausnahmen abfangen und die Nachrichten, die zu Fehlern führen, in Ihrer Funktionsantwort in batchItemFailures melden. Wenn die Funktion eine Ausnahme ausgibt, gilt der gesamte Batch als fehlgeschlagen.

Anmerkung

Wenn Sie dieses Feature mit einer FIFO-Warteschlange verwenden, sollte Ihre Funktion die Verarbeitung von Nachrichten nach dem ersten Fehler beenden und alle fehlgeschlagenen und nicht verarbeiteten Nachrichten in batchItemFailures zurückgeben. Das hilft, die Reihenfolge der Nachrichten in der Warteschlange beizubehalten.

Erfolgs- und Misserfolgsbedingungen

Lambda behandelt einen Batch als komplett erfolgreich, wenn die Funktion eines der folgenden Elemente zurückgibt:

  • Eine leere batchItemFailures-Liste

  • Eine ungültige batchItemFailures-Liste

  • Ein leeres EventResponse

  • Ein ungültiges EventResponse

Lambda behandelt einen Batch als komplett fehlgeschlagen, wenn die Funktion eines der folgenden Elemente zurückgibt:

  • Eine ungültige JSON-Antwort

  • Eine leere Zeichenfolge itemIdentifier

  • Ein ungültiges itemIdentifier

  • Ein itemIdentifier mit einem falschen Schlüsselnamen

  • Einen itemIdentifier-Wert mit einer Nachrichten-ID, die nicht existiert

CloudWatch-Metriken

Um herauszufinden, ob Ihre Funktion Batch-Element-Fehler korrekt meldet, können Sie die Amazon-SQS-Metriken NumberOfMessagesDeleted und ApproximateAgeOfOldestMessage in Amazon CloudWatch überwachen.

  • NumberOfMessagesDeleted verfolgt die Anzahl der Nachrichten, die aus der Warteschlange entfernt wurden. Wenn der Wert auf 0 sinkt, ist dies ein Zeichen dafür, dass die Funktionsantwort fehlgeschlagene Nachrichten nicht korrekt zurückgibt.

  • ApproximateAgeOfOldestMessage verfolgt, wie lange die älteste Nachricht in der Warteschlange geblieben ist. Ein starker Anstieg dieser Metrik kann darauf hinweisen, dass die Funktion fehlgeschlagene Nachrichten nicht korrekt zurückgibt.

Konfigurationsparameter zu Amazon SQS

Alle Lambda-Ereignisquellentypen verwenden dieselben API-Operationen CreateEventSourceMapping und UpdateEventSourceMapping. Allerdings gelten nur einige der Parameter für Amazon SQS.

Ereignisquellparameter, die für Amazon SQS gelten
Parameter Erforderlich Standard Hinweise

BatchSize

N

10

Bei Standardwarteschlangen beträgt der Maximalwert 10 000. Bei FIFO-Warteschlangen beträgt der Maximalwert 10.

Enabled

N

true

EventSourceArn

Y

Der ARN des Datenstroms oder eines Stream-Konsumenten

FunctionName

Y

FunctionResponseTypes

N

Damit Ihre Funktion bestimmte Fehler in einem Batch meldet, beziehen Sie den Wert ReportBatchItemFailures in FunctionResponseTypes ein. Weitere Informationen finden Sie unter Melden von Batch-Elementen.

MaximumBatchingWindowInSeconds

N

0