Verwenden von AWS Lambda mit Amazon SQS - AWS Lambda

Verwenden von AWS Lambda mit Amazon SQS

Sie können eine AWS Lambda-Funktion verwenden, um Nachrichten in einer Amazon Simple Queue Service (Amazon SQS)-Warteschlange zu verarbeiten. Lambda--Ereignisquellzuweisungen unterstützen Standardwarteschlangen und FIFO-Warteschlangen (First-In, First-Out). 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 Stapeln und ruft Ihre Funktion einmal für jeden Stapel auf. Wenn Ihre Funktion einen Stapel erfolgreich verarbeitet, löscht Lambda deren Nachrichten aus der Warteschlange. Das folgende Beispiel zeigt ein Ereignis für einen Stapel 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 ruft Ihre Funktion standardmäßig auf, sobald Datensätze in der SQS-Warteschlange verfügbar sind. Lambda wird bis zu 10 Nachrichten in Ihrer Warteschlange sofort abfragen und diesen Stapel an die Funktion senden. Um zu vermeiden, dass die Funktion mit einer kleinen Anzahl von Funktionen aufgerufen wird, können Sie der Ereignisquelle mitteilen, Datensätze bis zu fünf Minuten zu puffern, indem Sie ein Stapelfenster konfigurieren. Vor dem Aufrufen der Funktion wird Lambda weiterhin Nachrichten aus der SQS-Standardwarteschlange abfragen, bis das Batch-Fenster abläuft, das Nutzlastlimit oder die volle Stapelgröße erreicht ist.

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 Stapel liest, verbleiben die Meldungen in der Warteschlange, werden aber für über die Dauer der Zeitbeschränkung für die Sichtbarkeit der Warteschlange ausgeblendet. Wenn Ihre Funktion den Stapel erfolgreich verarbeitet, löscht Lambda deren Nachrichten aus der Warteschlange. Wenn Ihre Funktion gedrosselt wird, einen Fehler zurückgibt oder nicht reagiert, wird die Meldung wieder sichtbar. Alle Nachrichten in einer fehlgeschlagenen Stapel kehren zur Warteschlange zurück, sodass Ihr Funktionscode in der Lage sein muss, dieselbe Nachricht mehrmals ohne Nebeneffekte zu verarbeiten.

Skalierung und Verarbeitung

Bei Standardwarteschlangen verwendet Lambda Langabfrage (Long Polling), um eine Warteschlange so lange abzufragen, bis sie aktiv wird. Wenn Nachrichten verfügbar sind, liest Lambda bis zu 5 Stapel und sendet sie an Ihre Funktion. Wenn weiterhin Nachrichten verfügbar sind, erhöht Lambda die Anzahl der die Stapel lesenden Prozesse um bis zu 60 weitere Instances pro Minute. Die maximale Anzahl von Stapeln, die von einer Ereignisquellen-Zuordnung gleichzeitig verarbeitet werden können, ist 1000.

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 Lambda der Reihe nach zugestellt werden. Lambda sortiert die Nachrichten in Gruppen und sendet jeweils nur einen Batch für eine Gruppe. Wenn die Funktion einen Fehler zurückgibt, werden alle Wiederholungsversuche für die betroffenen Nachrichten versucht, bevor Lambda zusätzliche 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 Stapels erhält und Lambda es erneut versuchen kann, wenn Ablehnungsfehler beim Aufwärtsskalieren auftreten.

Um Ihrer Funktion Zeit zum Verarbeiten der einzelnen Datensatzstapel einzuräumen, legen Sie die Zeitbeschränkung für die Sichtbarkeit der Quellwarteschlange auf mindestens den sechsfachen Wert der Zeitbeschränkung fest, die Sie für Ihre Funktion konfigurieren. Die zusätzliche Zeit ermöglicht Lambda, es erneut zu versuchen, wenn Ihre Funktionsausführung abgelehnt wird, während Ihre Funktion einen früheren Stapel verarbeitet.

Wenn die Verarbeitung einer Nachricht mehrmals fehlschlägt, 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 diese der Ausführungsrolle Ihrer Funktion hinzu.

Weitere Informationen finden Sie unter AWS Lambda-Ausführungsrolle.

Konfigurieren einer Warteschlange als Ereignisquelle

Erstellen Sie eine Ereignis-Quellzuweisung, um Lambda anzuweisen, Elemente aus Ihrer Warteschlange an eine Lambda-Funktion zu senden. Sie können mehrere Ereignis-Quellzuweisungen 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 Stapelgröß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 „Functions (Funktionen)“ der Lambda-Konsole.

  2. Wählen Sie eine Funktion aus.

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

  4. Wählen Sie einen Trigger-Typ aus.

  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 queue (SQS-Warteschlange) – Die Amazon SQS-Warteschlange, aus der Datensätze gelesen werden sollen.

  • Stapelgröße – Die Anzahl der Datensätze, die in jedem Stapel 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 Stapelgröße von über 10 müssen Sie auch den MaximumBatchingWindowInSeconds-Parameter auf mindestens 1 Sekunde einstellen. Lambda übergibt alle Datensätze im Stapel in einem einzigen Aufruf an die Funktion, solange die Gesamtgröße der Ereignisse nicht das Nutzlast-Limit für synchrone Aufrufe überschreitet (6 MB).

    Metadaten werden sowohl von Lambda als auch Amazon SQS für jeden Datensatz generiert. 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 Stapelgröße. Die Metadatenfelder, die von Amazon SQS gesendet werden, können in der Länge variabel sein. Weitere Informationen über die Amazon SQS-Metadatenfelder finden Sie in der ReceiveMessage-Dokumentation in der Amazon Simple Queue Service-API-Referenz .

  • Stapelfenster: – Geben Sie die maximale Zeitspanne zur Erfassung von Datensätzen vor dem Aufruf der Funktion in Sekunden an. Gilt nur für Standard-Warteschlangen.

    Wenn Sie ein Stapelfenster von mehr als 0 Sekunden verwenden, müssen Sie die erhöhte Verarbeitungszeit in Ihrer Zeitbeschränkung für die Sichtbarkeit der Warteschlange berücksichtigen. Legen Sie die Zeitbeschränkung für die Sichtbarkeit der Warteschlange auf das 6-Fache der Zeitbeschränkung Ihrer Funktion plus den Wert von MaximumBatchingWindowInSeconds fest. Dies gibt Ihrer Lambda-Funktion Zeit, jeden Ereignisstapel zu verarbeiten und es im Falle eines Drosselungsfehlers erneut zu versuchen. Lambda verarbeitet bis zu 5 Stapel auf einmal.

  • Enabled (Aktiviert) – Auf "true" festlegen, um die Ereignisquellenzuweisung 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 die Ereignisquellzuweisung aktiv ist, werden von Lambda Anforderungen an die Warteschlange gesendet, um Elemente abzurufen. Details zu den Preisen finden Sie unter Amazon Simple Queue Service-Preise.

Um die Konfiguration der Ereignisquelle zu einem späteren Zeitpunkt zu verwalten, wählen Sie den Auslöser im Designer aus.

Konfigurieren Sie die Zeitbeschränkung für Ihre Funktion, damit ausreichend Zeit für die Verarbeitung eines gesamten Elementstapels bleibt. Wenn die Verarbeitung bestimmter Elemente lange Zeit in Anspruch nimmt, wählen Sie eine kleinere Stapelgröße. Eine große Stapelgröße kann die Effizienz für Arbeitslasten erhöhen, die sehr schnell sind oder viel Overhead aufweisen. Wenn Ihre Funktion jedoch einen Fehler zurückgibt, kehren alle Elemente im Stapel zur Warteschlange zurück. Wenn Sie die reservierte Gleichzeitigkeit für Ihre Funktion konfigurieren, legen Sie mindestens fünf gleichzeitige Ausführungen fest, um das Risiko von Ablehnungsfehlern zu senken, wenn Lambda Ihre Funktion aufruft. Um die Wahrscheinlichkeit von Drosselungsfehlern auszuschließen, legen Sie den Wert für die reservierte Gleichzeitigkeit 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 CLI oder dem 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 zuzuordnen, die durch den Amazon-Ressourcennamen (ARN) angegeben wird; die Stapelgröße beträgt 5 und das Stapelfenster 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" }