

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
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams"></a>

*Andrea Meroni, Mariem Kthiri, Nadim Majed, Alessandro Trisolini und Michael Wallner, Amazon Web Services*

## Zusammenfassung
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) ist ein vollständig verwalteter Service, den Entwickler nutzen können, um sie in jeder Größenordnung zu erstellen, zu veröffentlichen, zu verwalten, APIs zu überwachen und zu sichern. Er erledigt die Aufgaben, die mit der Annahme und Verarbeitung von bis zu Hunderttausenden von gleichzeitigen API-Aufrufen 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 die REST-API einen Fehler zurückgibt. Das feste Limit 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 eine grundlegende 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](https://pypi.org/project/projen/) [wird verwendet, um die lokale Entwicklungsumgebung einzurichten und die Beispielarchitektur in Kombination mit dem [AWS Cloud Development Kit (AWS CDK) Toolkit AWS-Konto](https://docs.aws.amazon.com/cdk/v2/guide/cli.html), [Docker](https://docs.docker.com/get-docker/) und Node.js auf einem Ziel bereitzustellen.](https://nodejs.org/en/download/) Projen richtet automatisch eine virtuelle [Python-Umgebung](https://www.python.org/downloads/) mit [Pre-Commit](https://pre-commit.com/) und den Tools ein, die für die Qualitätssicherung des Codes, Sicherheitsscans und Unit-Tests verwendet werden. Weitere Informationen finden Sie im Abschnitt [Tools](#processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools).

## Voraussetzungen und Einschränkungen
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-prereqs"></a>

**Voraussetzungen**
+ Ein aktiver AWS-Konto
+ Die folgenden Tools sind auf Ihrer Workstation installiert:
  + [AWS Cloud Development Kit (AWS CDK) Toolkit-Version](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 2.85.0 oder höher
  + [Docker-Version 20.10.21](https://docs.docker.com/get-docker/) oder höher
  + [Node.js Version 18](https://nodejs.org/en/download/) oder höher
  + [Projen](https://pypi.org/project/projen/) Version 0.71.111 oder höher
  + [Python-Version](https://www.python.org/downloads/) 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
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-architecture"></a>

**Architektur**

Das folgende Diagramm zeigt die Interaktion der Jobs-API mit DynamoDB Streams und den Lambda-Funktionen zur Ereignisverarbeitung und Fehlerbehandlung mit Ereignissen, die in einem Amazon-Ereignisarchiv gespeichert sind. EventBridge 

![\[Diagramm der Architektur und des Prozesses, wobei die Schritte nach dem Diagramm aufgeführt sind.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/68a46501-16e5-48e4-99c6-fc67a8b4133a/images/29fe6982-ad81-4099-9c65-08b17c96e78f.png)


Ein typischer Arbeitsablauf umfasst die folgenden Schritte:

1. Sie authentifizieren sich bei AWS Identity and Access Management (IAM) und erhalten Sicherheitsanmeldedaten.

1. Sie senden eine `POST` HTTP-Anfrage an den `/jobs` Jobs-API-Endpunkt und geben dabei die Jobparameter im Hauptteil der Anfrage an.

1. Die Jobs-API gibt Ihnen eine HTTP-Antwort zurück, die die Job-ID enthält.

1. Die Job-API platziert die Job-Parameter in der `jobs_table` Amazon DynamoDB-Tabelle.

1. Der `jobs_table` DynamoDB-Stream der DynamoDB-Tabelle ruft die Lambda-Funktionen zur Ereignisverarbeitung auf.

1. 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.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)

1. Sie senden eine `GET` HTTP-Anfrage an den `/jobs/{jobId}` Job-API-Endpunkt mit der Job-ID aus Schritt 3 als. `{jobId}`

1. Die Jobs-API fragt die `jobs_table` DynamoDB-Tabelle ab, um die Auftragsergebnisse abzurufen.

1. Die Jobs-API gibt eine HTTP-Antwort zurück, die die Auftragsergebnisse enthält.

1. Wenn die Ereignisverarbeitung fehlschlägt, sendet die Quellenzuordnung der Ereignisverarbeitungsfunktion das Ereignis an das Thema Amazon Simple Notification Service (Amazon SNS) zur Fehlerbehandlung.

1. Das SNS-Thema zur Fehlerbehandlung überträgt das Ereignis asynchron an die Fehlerbehandlungsfunktion.

1. Die Fehlerbehandlungsfunktion platziert die Jobparameter in der `jobs_table` DynamoDB-Tabelle.

   Sie können die Job-Parameter abrufen, indem Sie eine `GET` HTTP-Anfrage an den `/jobs/{jobId}` Jobs-API-Endpunkt senden.

1. Wenn 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
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools"></a>

**AWS-Services**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)ist ein Softwareentwicklungs-Framework, das Sie bei der Definition und Bereitstellung der AWS-Cloud-Infrastruktur im Code unterstützt.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) ist ein vollständig verwalteter NoSQL-Datenbank-Service, der schnelle und planbare Leistung mit nahtloser Skalierbarkeit bereitstellt.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 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 AWS-Konten.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 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 (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) unterstützt Sie bei der Koordination und Verwaltung des Nachrichtenaustauschs zwischen Herausgebern und Kunden, einschließlich Webservern und E-Mail-Adressen.

**Andere Tools**
+ [autopep8](https://github.com/hhatto/autopep8) formatiert Python-Code automatisch auf der Grundlage des Python Enhancement Proposal (PEP) 8-Styleguides.
+ [Bandit](https://bandit.readthedocs.io/en/latest/) scannt Python-Code, um häufig auftretende Sicherheitsprobleme zu finden.
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) ist ein Git-Commit-Checker und -Generator. `CHANGELOG`
+ [cfn-lint ist ein Linter](https://github.com/aws-cloudformation/cfn-lint) AWS CloudFormation 
+ [Checkov](https://github.com/bridgecrewio/checkov) ist ein statisches Code-Analyse-Tool, das Infrastructure as Code (IaC) auf Sicherheits- und Compliance-Fehlkonfigurationen überprüft.
+ [jq ist ein Befehlszeilentool](https://stedolan.github.io/jq/download/) zum Parsen von JSON.
+ [Postman](https://www.postman.com/) ist eine API-Plattform.
+ [pre-commit](https://pre-commit.com/) ist ein Git-Hooks-Manager.
+ [Projen](https://github.com/projen/projen) ist ein Projektgenerator.
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) 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](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk).

## Best Practices
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-best-practices"></a>
+ Diese Beispielarchitektur beinhaltet keine Überwachung der bereitgestellten Infrastruktur. Wenn Ihr Anwendungsfall eine Überwachung erfordert, sollten Sie das Hinzufügen von [CDK Monitoring Constructs](https://constructs.dev/packages/cdk-monitoring-constructs) oder einer anderen Überwachungslösung in Betracht ziehen.
+ Diese Beispielarchitektur verwendet [IAM-Berechtigungen](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html), um den Zugriff auf die Jobs-API zu steuern. Jeder, der autorisiert ist, `JobsAPIInvokeRole` dies 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](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html) testen.
+ Wenn ein Benutzer eine `POST` HTTP-Anfrage an den `/jobs` Jobs-API-Endpunkt sendet, werden die Eingabedaten auf zwei verschiedenen Ebenen validiert:
  + API Gateway ist für die erste [Anforderungsvalidierung](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html) verantwortlich.
  + Die Funktion zur Ereignisverarbeitung führt die zweite Anfrage aus.

    Es wird keine Überprüfung durchgeführt, wenn der Benutzer eine `GET` HTTP-Anfrage an den `/jobs/{jobId}` Jobs-API-Endpunkt sendet. Wenn Ihr Anwendungsfall eine zusätzliche Eingabevalidierung und ein erhöhtes Sicherheitsniveau erfordert, sollten Sie den [Einsatz AWS WAF zum Schutz Ihrer API in Betracht ziehen](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html).
+ Um eine Drosselung zu vermeiden, rät die [DynamoDB Streams-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.Processing) 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](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html).
+ In diesem Beispiel wurde [optimistisches Sperren](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html) 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
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-epics"></a>

### Richte die Umgebung ein
<a name="set-up-the-environment"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Klonen Sie das Repository | Führen Sie den folgenden Befehl aus, um das Repository lokal zu klonen:<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git</pre> | 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](https://github.com/projen/projen) ein:<pre>cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk<br />npx projen</pre> | DevOps Ingenieur | 
| Installieren Sie Pre-Commit-Hooks. | Gehen Sie wie folgt vor, um Pre-Commit-Hooks zu installieren:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | DevOps Ingenieur | 

### Stellen Sie die Beispielarchitektur bereit
<a name="deploy-the-example-architecture"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Bootstrap. AWS CDK | Um [AWS CDK](https://aws.amazon.com/cdk/)in Ihrem zu booten AWS-Konto, führen Sie den folgenden Befehl aus:<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| Stellen Sie die Beispielarchitektur bereit. | Führen Sie den folgenden Befehl aus AWS-Konto, um die Beispielarchitektur in Ihrem bereitzustellen:<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### Testen Sie die Architektur
<a name="test-the-architecture"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Installieren Sie die Testvoraussetzungen. | Installieren Sie auf Ihrer Workstation the [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [Postman](https://www.postman.com/downloads/) und [jq](https://jqlang.github.io/jq/).Die Verwendung von [Postman](https://www.postman.com/downloads/) zum Testen dieser Beispielarchitektur wird empfohlen, ist aber nicht zwingend erforderlich. Wenn Sie sich für ein alternatives API-Testtool entscheiden, stellen Sie sicher, dass es die [AWS Signature Version 4-Authentifizierung](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) unterstützt, und verweisen Sie auf die exponierten API-Endpunkte, die durch [Exportieren der REST-API](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) überprüft werden können. | DevOps Ingenieur | 
| Gehen Sie von der aus`JobsAPIInvokeRole`. | [Gehen Sie davon aus](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)`JobsAPIInvokeRole`, dass das als Ausgabe des `deploy` Befehls gedruckt wurde:<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | AWS DevOps | 
| Postman konfigurieren. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | AWS DevOps | 
| Testen Sie die Beispielarchitektur. | Um die Beispielarchitektur zu testen, senden Sie Anfragen an die Jobs-API. Weitere Informationen finden Sie in der [Postman-Dokumentation](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request). | DevOps Ingenieur | 

## Fehlerbehebung
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-troubleshooting"></a>


| Problem | Lösung | 
| --- | --- | 
| Die Zerstörung und anschließende erneute Bereitstellung der Beispielarchitektur schlägt fehl, da die [Amazon CloudWatch Logs-Protokollgruppe](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) `/aws/apigateway/JobsAPIAccessLogs` bereits existiert. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | 

## Zugehörige Ressourcen
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-resources"></a>
+ [API-Gateway-Zuordnungsvorlage und Referenz zur Zugriffsprotokollierungsvariablen](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [Erfassung von Änderungsdaten für DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)
+ [Optimistisches Sperren mit Versionsnummer](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)
+ [Verwenden von Kinesis Data Streams zur Erfassung von Änderungen an DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)