

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 AWS Lambda verarbeiten
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda"></a>

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

## Zusammenfassung
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) ist ein vollständig verwalteter Service, mit dem Entwickler in jeder Größenordnung erstellen, veröffentlichen, warten, überwachen und sichern APIs können. 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 und AWS Lambda. Die Architektur unterstützt die Ausführung von Verarbeitungsaufträgen mit einer Dauer von bis zu 15 Minuten und verwendet eine einfache REST-API als Schnittstelle.

[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](#process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools).

## Voraussetzungen und Einschränkungen
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-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
  + [Docker-Version 20.10.21](https://docs.docker.com/get-docker/)
  + [Node.js, Version 18.13.0](https://nodejs.org/en/download/)
  + Bewährte [Version 0.71.111](https://pypi.org/project/projen/)
  + [Python-Version](https://www.python.org/downloads/) 3.9.16

**Einschränkungen**
+ 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-Funktion begrenzt.

## Architektur
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-architecture"></a>

Das folgende Diagramm zeigt die Interaktion der Jobs-API mit den Lambda-Funktionen zur Ereignisverarbeitung und Fehlerbehandlung, wobei Ereignisse in einem Amazon-Ereignisarchiv gespeichert werden. EventBridge 

![](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/e027130c-44c1-41ab-bbe9-f196a49bd9ac/images/3c437b65-48e3-477d-aeea-6ff938cc3285.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, bei der es sich um eine API-Gateway-REST-API handelt, gibt Ihnen eine HTTP-Antwort zurück, die die Job-ID enthält.

1. Die Jobs-API ruft asynchron die Lambda-Funktion zur Ereignisverarbeitung auf.

1. Die Funktion zur Ereignisverarbeitung verarbeitet das Ereignis und fügt dann die Auftragsergebnisse in die Amazon DynamoDB-Tabelle der Jobs ein.

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` 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 Ereignisverarbeitungsfunktion das Ereignis an die Fehlerbehandlungsfunktion.

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

1. 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 Ereignisarchiv.

   Sie können die archivierten Ereignisse erneut abspielen, indem Sie. EventBridge

## Tools
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools"></a>

**AWS-Services**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)ist ein Softwareentwicklungs-Framework, das Ihnen hilft, AWS Cloud Infrastruktur im Code zu definieren und bereitzustellen.
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) ist ein Open-Source-Tool, mit dem Sie über Befehle in Ihrer Befehlszeilen-Shell mit AWS-Services interagieren können.
+ [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 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.

**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 Event Processing with API Gateway and Lambda](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk).

## Best Practices
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-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:
  + Amazon 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 durch.

    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 höheres Maß an Sicherheit erfordert, sollten Sie die [Verwendung von AWS WAF zum Schutz Ihrer API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) in Betracht ziehen.

## Epen
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-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-lambda-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-lambda-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/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.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 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/).<br />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 [Authentifizierung mit AWS Signature Version 4](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) unterstützt, und beziehen Sie sich auf die exponierten API-Endpunkte, die durch [den Export 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 Befehls deploy 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/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | AWS DevOps | 
| Testen Sie die Beispielarchitektur. | Um die Beispielarchitektur zu testen, [senden Sie Anfragen an](https://learning.postman.com/docs/sending-requests/requests/#next-steps) 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="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-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/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | 

## Zugehörige Ressourcen
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-resources"></a>
+ [API-Gateway-Zuordnungsvorlage und Referenz zur Zugriffsprotokollierungsvariablen](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [Richten Sie den asynchronen Aufruf der Backend-Lambda-Funktion ein](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html)