Amazon Kinesis Data Streams Streams-Datensätze mit Lambda verarbeiten - AWS Lambda

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 Kinesis Data Streams Streams-Datensätze mit Lambda verarbeiten

Um Amazon Kinesis Data Streams Streams-Datensätze mit Lambda zu verarbeiten, erstellen Sie einen Consumer für Ihren Stream und anschließend eine Lambda-Ereignisquellenzuordnung.

Konfigurieren Ihres Daten-Streams und Ihrer Funktion

Ihre Lambda-Funktion ist eine Konsumentenanwendung für Ihren Daten-Stream. Sie verarbeitet jeweils einen Batch Datensätzen aus jedem Shard. Sie können eine Lambda-Funktion zu einem Konsumenten mit gemeinsam genutztem Durchsatz (Standard-Iterator) oder zu einem Konsumenten mit dediziertem Durchsatz mit erweitertem Rundsenden zuweisen.

  • Standard-Iterator: Lambda fragt jeden Shard in Ihrem Kinesis-Stream mit einer Basisrate von einmal pro Sekunde nach Datensätzen ab. Wenn mehr Datensätze verfügbar sind, verarbeitet Lambda Batches, bis die Funktion mit dem Stream gleichzieht. Die Ereignisquellenzuordnung teilt den Lesedurchsatz mit anderen Konsumenten des Shards zusammen.

  • Verbesserter Fan-Out: Um die Latenz zu minimieren und den Lesedurchsatz zu maximieren, sollten Sie einen Data-Stream-Consumer mit erweitertem Fan-Out einrichten. Stream-Konsumenten mit erweitertem Rundsenden erhalten eine dedizierte Verbindung für jeden Shard, der keine Auswirkungen auf andere Anwendungen hat, die aus dem Stream lesen. Stream-Konsumenten verwenden HTTP/2, um die Latenz zu reduzieren, indem Datensätze über eine langlebige Verbindung an Lambda übertragen und Anforderungs-Header komprimiert werden. Sie können einen Stream-Consumer mit der Kinesis RegisterStreamConsumer API erstellen.

aws kinesis register-stream-consumer \ --consumer-name con1 \ --stream-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream

Die Ausgabe sollte folgendermaßen aussehen:

{ "Consumer": { "ConsumerName": "con1", "ConsumerARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream/consumer/con1:1540591608", "ConsumerStatus": "CREATING", "ConsumerCreationTimestamp": 1540591608.0 } }

Um die Geschwindigkeit zu erhöhen, mit der Ihre Funktion Datensätze verarbeitet, fügen Sie Ihrem Datenstream Shards hinzu. Lambda verarbeitet Datensätze in jedem Shard in der Reihenfolge. Es beendet die Verarbeitung zusätzlicher Datensätze in einem Shard, wenn Ihre Funktion einen Fehler zurückgibt. Mehr Shards bedeutet, dass mehr Stapel verarbeitet und gleichzeitig die Auswirkungen von Fehlern auf die Nebenläufigkeit verringert werden.

Wenn Ihre Funktion nicht hochskalieren kann, um alle gleichzeitigen Stapel zu verarbeiten, fordern Sie eine Kontingenterhöhung an oder reservieren Sie Gleichzeitigkeit für Ihre Funktion.

Erstellen Sie eine Ereignisquellenzuordnung, um eine Lambda-Funktion aufzurufen

Um Ihre Lambda-Funktion mit Datensätzen aus Ihrem Datenstrom aufzurufen, erstellen Sie eine Ereignisquellenzuordnung. Sie können mehrere Ereignisquellenzuordnungen erstellen, um gleiche Daten mit mehreren Lambda-Funktionen oder Elemente aus mehreren Daten-Streams mit nur einer Funktion zu verarbeiten. Bei der Verarbeitung von Elementen aus mehreren Streams enthält jeder Batch nur Datensätze aus einem einzigen Shard oder Stream.

Sie können Zuordnungen von Ereignisquellen konfigurieren, um Datensätze aus einem Stream in einem anderen zu verarbeiten. AWS-Konto Weitere Informationen hierzu finden Sie unter Erstellen einer kontenübergreifenden Zuordnung von Ereignisquellen.

Bevor Sie eine Ereignisquellenzuordnung erstellen, müssen Sie Ihrer Lambda-Funktion die Erlaubnis erteilen, aus einem Kinesis-Datenstream zu lesen. Lambda benötigt die folgenden Berechtigungen, um Ressourcen im Zusammenhang mit Ihrem Kinesis-Datenstrom zu verwalten:

Die AWS verwaltete Richtlinie AWSLambdaKinesisExecutionRoleumfasst diese Berechtigungen. Fügen Sie diese verwaltete Richtlinie zu Ihrer Funktion hinzu, wie im folgenden Verfahren beschrieben.

AWS Management Console
So fügen Sie Ihrer Funktion Kinesis-Berechtigungen hinzu
  1. Öffnen Sie die Funktionsseite der Lambda-Konsole und wählen Sie Ihre Funktion aus.

  2. Wählen Sie auf der Registerkarte Konfiguration die Option Berechtigungen aus.

  3. Wählen Sie im Bereich Ausführungsrolle unter Rollenname den Link zur Ausführungsrolle Ihrer Funktion aus. Dieser Link öffnet die Seite für diese Rolle in der IAM-Konsole.

  4. Wählen Sie im Bereich „Berechtigungsrichtlinien“ die Option „Berechtigungen hinzufügen“ und anschließend „Richtlinien anhängen“ aus.

  5. Geben Sie im Suchfeld AWSLambdaKinesisExecutionRole ein.

  6. Aktivieren Sie das Kontrollkästchen neben der Richtlinie und wählen Sie „Berechtigung hinzufügen“ aus.

AWS CLI
So fügen Sie Ihrer Funktion Kinesis-Berechtigungen hinzu
  • Führen Sie den folgenden CLI-Befehl aus, um die AWSLambdaKinesisExecutionRole Richtlinie zur Ausführungsrolle Ihrer Funktion hinzuzufügen:

    aws iam attach-role-policy \ --role-name MyFunctionRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole
AWS SAM
So fügen Sie Ihrer Funktion Kinesis-Berechtigungen hinzu
  • Fügen Sie der Definition Ihrer Funktion die Policies Eigenschaft hinzu, wie im folgenden Beispiel gezeigt:

    Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./my-function/ Handler: index.handler Runtime: nodejs20.x Policies: - AWSLambdaKinesisExecutionRole

Nachdem Sie die erforderlichen Berechtigungen konfiguriert haben, erstellen Sie die Zuordnung der Ereignisquelle.

AWS Management Console
So erstellen Sie das Kinesis-Ereignisquellen-Mapping
  1. Öffnen Sie die Funktionsseite der Lambda-Konsole und wählen Sie Ihre Funktion aus.

  2. Wählen Sie im Bereich Function overview (Funktionsübersicht) die Option Add trigger (Auslöser hinzufügen).

  3. Wählen Sie unter Trigger-Konfiguration für die Quelle Kinesis aus.

  4. Wählen Sie den Kinesis-Stream aus, für den Sie das Event-Quellen-Mapping erstellen möchten, und optional einen Consumer Ihres Streams.

  5. (Optional) Bearbeiten Sie die Stapelgröße, die Startposition und das Stapelfenster für Ihre Ereignisquellenzuordnung.

  6. Wählen Sie Hinzufügen aus.

Wenn Sie Ihre Ereignisquellenzuordnung von der Konsole aus erstellen, muss Ihre IAM-Rolle über die Berechtigungen kinesis: ListStreams und kinesis: ListStream Consumers verfügen.

AWS CLI
So erstellen Sie das Kinesis-Ereignisquellen-Mapping
  • Führen Sie den folgenden CLI-Befehl aus, um eine Kinesis-Ereignisquellenzuordnung zu erstellen. Wählen Sie Ihre eigene Batchgröße und Startposition entsprechend Ihrem Anwendungsfall.

    aws lambda create-event-source-mapping \ --function-name MyFunction \ --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \ --starting-position LATEST \ --batch-size 100

Um ein Batching-Fenster anzugeben, fügen Sie die --maximum-batching-window-in-seconds Option hinzu. Weitere Informationen zur Verwendung dieses und anderer Parameter finden Sie unter create-event-source-mapping in der Befehlsreferenz.AWS CLI

AWS SAM
So erstellen Sie das Kinesis-Ereignisquellen-Mapping
  • Fügen Sie der Definition Ihrer Funktion die KinesisEvent Eigenschaft hinzu, wie im folgenden Beispiel gezeigt:

    Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./my-function/ Handler: index.handler Runtime: nodejs20.x Policies: - AWSLambdaKinesisExecutionRole Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt MyKinesisStream.Arn StartingPosition: LATEST BatchSize: 100 MyKinesisStream: Type: AWS::Kinesis::Stream Properties: ShardCount: 1

Weitere Informationen zum Erstellen einer Ereignisquellenzuordnung für Kinesis Data Streams finden Sie unter Kinesis im AWS Serverless Application Model Entwicklerhandbuch. AWS SAM

Abfrage und Startposition des Streams

Beachten Sie, dass die Stream-Abfrage bei der Erstellung und Aktualisierung der Zuordnung von Ereignisquellen letztendlich konsistent ist.

  • Bei der Erstellung der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis mit der Abfrage von Ereignissen aus dem Stream begonnen wird.

  • Bei Aktualisierungen der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis die Abfrage von Ereignissen aus dem Stream gestoppt und neu gestartet wird.

Dieses Verhalten bedeutet, dass, wenn Sie LATEST als Startposition für den Stream angeben, die Zuordnung von Ereignisquellen bei der Erstellung oder Aktualisierung möglicherweise Ereignisse übersieht. Um sicherzustellen, dass keine Ereignisse übersehen werden, geben Sie die Startposition des Streams als TRIM_HORIZON oder AT_TIMESTAMP an.

Erstellen einer kontenübergreifenden Zuordnung von Ereignisquellen

Amazon Kinesis Data Streams unterstützt ressourcenbasierte Richtlinien. Aus diesem Grund können Sie Daten, die in einen Stream aufgenommen wurden, in einem Konto AWS-Konto mit einer Lambda-Funktion in einem anderen Konto verarbeiten.

Um eine Ereignisquellenzuordnung für Ihre Lambda-Funktion mithilfe eines Kinesis-Streams in einem anderen zu erstellen AWS-Konto, müssen Sie den Stream mithilfe einer ressourcenbasierten Richtlinie konfigurieren, um Ihrer Lambda-Funktion die Berechtigung zum Lesen von Elementen zu erteilen. Informationen dazu, wie Sie Ihren Stream so konfigurieren, dass er kontoübergreifenden Zugriff ermöglicht, finden Sie unter Zugriff mit kontoübergreifenden AWS Lambda Funktionen teilen im Amazon Kinesis Streams Streams-Entwicklerhandbuch.

Nachdem Sie Ihren Stream mit einer ressourcenbasierten Richtlinie konfiguriert haben, die Ihrer Lambda-Funktion die erforderlichen Berechtigungen erteilt, erstellen Sie die Ereignisquellenzuordnung mit einer der im vorherigen Abschnitt beschriebenen Methoden.

Wenn Sie Ihr Event-Quellen-Mapping mit der Lambda-Konsole erstellen möchten, fügen Sie den ARN Ihres Streams direkt in das Eingabefeld ein. Wenn Sie einen Verbraucher für Ihren Stream angeben möchten, wird das Stream-Feld durch Einfügen des ARN des Verbrauchers automatisch aufgefüllt.