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.
Ereignisse asynchron mit Amazon API Gateway und Amazon DynamoDB Streams verarbeiten
Erstellt von Andrea Meroni (AWS), Alessandro Trisolini (), Nadim Majed (AWS), Mariem Kthiri () und Michael Wallner (AWS) AWS AWS
Übersicht
Amazon API Gateway ist ein vollständig verwalteter Service, den Entwickler nutzen können, um sie in jeder Größenordnung zu erstellen, zu veröffentlichen, zu warten, APIs zu überwachen und zu sichern. Er erledigt die Aufgaben, die mit der Annahme und Bearbeitung von bis zu Hunderttausenden von gleichzeitigen API Anrufen verbunden sind.
Eine wichtige Servicequote von API Gateway ist das Integrations-Timeout. Das Timeout ist die maximale Zeit, in der ein Backend-Dienst eine Antwort zurückgeben muss, bevor er einen Fehler REST API zurückgibt. Die feste Grenze von 29 Sekunden ist für synchrone Workloads im Allgemeinen akzeptabel. Dieses Limit stellt jedoch eine Herausforderung für Entwickler dar, die API Gateway mit asynchronen Workloads verwenden möchten.
Dieses Muster zeigt eine Beispielarchitektur für die asynchrone Verarbeitung von Ereignissen mithilfe von API Gateway, Amazon DynamoDB Streams und. AWS Lambda Die Architektur unterstützt die Ausführung von Parallelverarbeitungsjobs mit denselben Eingabeparametern und verwendet ein Basic REST API als Schnittstelle. In diesem Beispiel begrenzt die Verwendung von Lambda als Backend die Dauer von Jobs auf 15 Minuten. Sie können dieses Limit umgehen, indem Sie einen alternativen Dienst zur Verarbeitung eingehender Ereignisse verwenden (z. B. AWS Fargate).
Projen
Voraussetzungen und Einschränkungen
Voraussetzungen
Ein aktiver AWS-Konto
Die folgenden Tools sind auf Ihrer Workstation installiert:
AWS Cloud Development Kit (AWS CDK) Toolkit-Version 2.85.0 oder höher
Docker-Version 20.10.21
oder höher Node.js Version 18
oder höher Projen
Version 0.71.111 oder höher Python-Version
3.9.16 oder höher
Einschränkungen
Die empfohlene maximale Anzahl von Lesern für DynamoDB Streams ist zwei, um eine Drosselung zu vermeiden.
Die maximale Laufzeit eines Jobs ist durch die maximale Laufzeit für Lambda-Funktionen (15 Minuten) begrenzt.
Die maximale Anzahl gleichzeitiger Jobanfragen ist durch die reservierte Parallelität der Lambda-Funktionen begrenzt.
Architektur
Architektur
Das folgende Diagramm zeigt die Interaktion der Jobs API mit DynamoDB Streams und der Lambda-Funktionen zur Ereignisverarbeitung und Fehlerbehandlung mit Ereignissen, die in einem Amazon-Ereignisarchiv gespeichert sind. EventBridge

Ein typischer Arbeitsablauf umfasst die folgenden Schritte:
Sie authentifizieren sich bei AWS Identity and Access Management (IAM) und erhalten Sicherheitsanmeldedaten.
Sie senden eine HTTP
POST
Anfrage an den/jobs
API Auftragsendpunkt und geben dabei die Jobparameter im Hauptteil der Anfrage an.Der Job API gibt Ihnen eine HTTP Antwort zurück, die die Job-ID enthält.
Die Jobs fügen API die Jobparameter in die
jobs_table
Amazon DynamoDB-Tabelle ein.Der
jobs_table
DynamoDB-Stream der DynamoDB-Tabelle ruft die Lambda-Funktionen zur Ereignisverarbeitung auf.Die Lambda-Funktionen zur Ereignisverarbeitung verarbeiten das Ereignis und fügen dann die Auftragsergebnisse in die
jobs_table
DynamoDB-Tabelle ein. Um konsistente Ergebnisse zu gewährleisten, implementieren die Funktionen zur Ereignisverarbeitung einen optimistischen Sperrmechanismus.Sie senden eine HTTP
GET
Anfrage an den/jobs/{jobId}
API Auftragsendpunkt mit der Job-ID aus Schritt 3 als.{jobId}
Die Jobs API fragen die
jobs_table
DynamoDB-Tabelle ab, um die Auftragsergebnisse abzurufen.Die Jobs geben eine HTTP Antwort API zurück, die die Auftragsergebnisse enthält.
Wenn die Ereignisverarbeitung fehlschlägt, sendet die Quellenzuordnung der Ereignisverarbeitungsfunktion das Ereignis an das Thema Amazon Simple Notification Service (Amazon) zur Fehlerbehandlung. SNS
Das SNS Thema zur Fehlerbehandlung leitet das Ereignis asynchron an die Fehlerbehandlungsfunktion weiter.
Die Fehlerbehandlungsfunktion platziert die Jobparameter in der
jobs_table
DynamoDB-Tabelle.Sie können die Job-Parameter abrufen, indem Sie eine HTTP
GET
Anfrage an den Job-Endpunkt senden./jobs/{jobId}
APIWenn die Fehlerbehandlung fehlschlägt, sendet die Fehlerbehandlungsfunktion das Ereignis an ein EventBridge Amazon-Archiv.
Sie können die archivierten Ereignisse erneut abspielen, indem Sie EventBridge
Tools
AWS-Services
AWS Cloud Development Kit (AWS CDK)ist ein Framework für die Softwareentwicklung, mit dem Sie die AWS Cloud-Infrastruktur im Code definieren und bereitstellen können.
Amazon DynamoDB ist ein vollständig verwalteter Service ohne SQL Datenbank, der eine schnelle, vorhersehbare und skalierbare Leistung bietet.
Amazon EventBridge ist ein serverloser Event-Bus-Service, mit dem Sie Ihre Anwendungen mit Echtzeitdaten aus einer Vielzahl von Quellen verbinden können. Zum Beispiel AWS Lambda-Funktionen, HTTP Aufruf-Endpunkte, die API Ziele verwenden, oder Event-Busse in anderen Konten. AWS
AWS Lambda ist ein Datenverarbeitungsservice, mit dem Sie Code ausführen können, ohne dass Sie Server bereitstellen oder verwalten müssen. Es führt Ihren Code nur bei Bedarf aus und skaliert automatisch, sodass Sie nur für die tatsächlich genutzte Rechenzeit zahlen.
Amazon Simple Notification Service (AmazonSNS) unterstützt Sie bei der Koordination und Verwaltung des Nachrichtenaustauschs zwischen Herausgebern und Kunden, einschließlich Webservern und E-Mail-Adressen.
Andere Tools
autopep8
formatiert Python-Code automatisch auf der Grundlage des Styleguides Python Enhancement Proposal (PEP) 8. Bandit
scannt Python-Code, um häufig auftretende Sicherheitsprobleme zu finden. Commitizen
ist ein Git-Commit-Checker und -Generator. CHANGELOG
cfn-lint ist ein Linter
AWS CloudFormation Checkov
ist ein statisches Code-Analyse-Tool, das Infrastructure as Code (IaC) auf Sicherheits- und Compliance-Fehlkonfigurationen überprüft. jq ist ein Befehlszeilentool
zum Parsen. JSON Postman
ist eine Plattform. API pre-commit
ist ein Git-Hooks-Manager. Projen
ist ein Projektgenerator. pytest
ist ein Python-Framework zum Schreiben kleiner, lesbarer Tests.
Code-Repository
Dieser Beispielarchitekturcode befindet sich im Repository GitHub Asynchronous Processing with API Gateway und DynamoDB Streams
Bewährte Methoden
Diese Beispielarchitektur beinhaltet keine Überwachung der bereitgestellten Infrastruktur. Wenn Ihr Anwendungsfall eine Überwachung erfordert, sollten Sie das Hinzufügen von CDKMonitoring-Konstrukten
oder einer anderen Überwachungslösung in Betracht ziehen. Diese Beispielarchitektur verwendet IAMBerechtigungen, um den Zugriff auf die Jobs API zu kontrollieren. Jeder, der autorisiert ist
JobsAPIInvokeRole
, anzunehmen, kann die Jobs API aufrufen. Daher ist der Zugriffskontrollmechanismus binär. Wenn Ihr Anwendungsfall ein komplexeres Autorisierungsmodell erfordert, sollten Sie es mit einem anderen Zugriffskontrollmechanismus testen.Wenn ein Benutzer eine HTTP
POST
Anfrage an den/jobs
API Auftragsendpunkt sendet, werden die Eingabedaten auf zwei verschiedenen Ebenen validiert:APIGateway ist für die erste Anforderungsvalidierung verantwortlich.
Die Funktion zur Ereignisverarbeitung führt die zweite Anfrage aus.
Es wird keine Überprüfung durchgeführt, wenn der Benutzer eine HTTP
GET
Anfrage an den/jobs/{jobId}
API Auftragsendpunkt sendet. Wenn Ihr Anwendungsfall eine zusätzliche Eingabevalidierung und ein erhöhtes Sicherheitsniveau erfordert, sollten Sie die Verwendung AWS WAF zum Schutz Ihrer Daten prüfenAPI.
Um eine Drosselung zu vermeiden, rät die DynamoDB Streams-Dokumentation Benutzern davon ab, mit mehr als zwei Verbrauchern vom Shard desselben Streams zu lesen. Um die Anzahl der Verbraucher zu erhöhen, empfehlen wir die Verwendung von Amazon Kinesis Data Streams.
In diesem Beispiel wurde optimistisches Sperren verwendet, um sicherzustellen, dass Elemente in der
jobs_table
DynamoDB-Tabelle konsistent aktualisiert werden. Je nach Anforderung des Anwendungsfalls müssen Sie möglicherweise zuverlässigere Sperrmechanismen implementieren, z. B. pessimistisches Sperren.
Epen
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Klonen Sie das Repository | Führen Sie den folgenden Befehl aus, um das Repository lokal zu klonen:
| DevOps Ingenieur |
Richten Sie das Projekt ein. | Ändern Sie das Verzeichnis in das Repository-Stammverzeichnis und richten Sie die virtuelle Python-Umgebung und alle Tools mithilfe von Projen
| DevOps Ingenieur |
Installieren Sie Pre-Commit-Hooks. | Gehen Sie wie folgt vor, um Pre-Commit-Hooks zu installieren:
| DevOps Ingenieur |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Bootstrap. AWS CDK | Um AWS CDK
| AWS DevOps |
Stellen Sie die Beispielarchitektur bereit. | Führen Sie den folgenden Befehl aus AWS-Konto, um die Beispielarchitektur in Ihrem bereitzustellen:
| AWS DevOps |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Installieren Sie die Testvoraussetzungen. | Installieren Sie auf Ihrer Workstation the AWS Command Line Interface (AWS CLI), Postman Die Verwendung von Postman | DevOps Ingenieur |
Gehen Sie von der aus | Gehen Sie davon aus
| AWS DevOps |
Konfigurieren Sie Postman. |
| AWS DevOps |
Testen Sie die Beispielarchitektur. | Um die Beispielarchitektur zu testen, senden Sie Anfragen an die JobsAPI. Weitere Informationen finden Sie in der Postman-Dokumentation | DevOps Ingenieur |
Fehlerbehebung
Problem | Lösung |
---|---|
Die Zerstörung und anschließende erneute Bereitstellung der Beispielarchitektur schlägt fehl, da die Amazon CloudWatch Logs-Protokollgruppe |
|