

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.

# Strukturieren Sie ein Python-Projekt in hexagonaler Architektur mit AWS Lambda
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda"></a>

*Furkan Oruc, Dominik Goby, Darius Kunce und Michal Ploski, Amazon Web Services*

## Zusammenfassung
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-summary"></a>

Dieses Muster zeigt, wie ein Python-Projekt in hexagonaler Architektur mithilfe von AWS Lambda strukturiert wird. Das Muster verwendet das AWS Cloud Development Kit (AWS CDK) als Infrastructure-as-Code-Tool (IaC), Amazon API Gateway als REST-API und Amazon DynamoDB als Persistenzschicht. Die hexagonale Architektur folgt domänengesteuerten Designprinzipien. In der hexagonalen Architektur besteht Software aus drei Komponenten: Domäne, Ports und Adaptern. *Ausführliche Informationen zu hexagonalen Architekturen und ihren Vorteilen finden Sie im Leitfaden [Aufbau sechseckiger](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/) Architekturen auf AWS.*

## Voraussetzungen und Einschränkungen
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-prereqs"></a>

**Voraussetzungen**
+ Ein aktives AWS-Konto
+ Erfahrung in Python
+ Vertrautheit mit AWS Lambda, AWS CDK, Amazon API Gateway und DynamoDB
+ [Ein GitHub Konto (siehe Anweisungen zur Registrierung)](https://docs.github.com/en/get-started/signing-up-for-github/signing-up-for-a-new-github-account)
+ Git (siehe [Installationsanleitung](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git))
+ Ein Code-Editor, mit dem Sie Änderungen vornehmen und Ihren Code übertragen können GitHub (z. B. [Visual Studio Code](https://code.visualstudio.com/) oder [JetBrains PyCharm](https://www.jetbrains.com/pycharm/))
+ Docker ist installiert und der Docker-Daemon ist betriebsbereit

**Produktversionen**
+ Git Version 2.24.3 oder höher
+ Python-Version 3.7 oder höher
+ AWS CDK v2
+ Poetry Version 1.1.13 oder höher
+ AWS Lambda Powertools für Python Version 1.25.6 oder höher
+ pytest Version 7.1.1 oder höher
+ Moto-Version 3.1.9 oder höher
+ pydantic Version 1.9.0 oder höher
+ Boto3 Version 1.22.4 oder höher
+ mypy-boto3-dynamodb Version 1.24.0 oder höher

## Architektur
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-architecture"></a>

**Zieltechnologie-Stack**

Der Zieltechnologie-Stack besteht aus einem Python-Dienst, der API Gateway, Lambda und DynamoDB verwendet. Der Dienst verwendet einen DynamoDB-Adapter, um Daten zu speichern. Es bietet eine Funktion, die Lambda als Einstiegspunkt verwendet. Der Service verwendet Amazon API Gateway, um eine REST-API verfügbar zu machen. Die API verwendet AWS Identity and Access Management (IAM) für die [Authentifizierung von Clients](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html).

**Zielarchitektur**

Zur Veranschaulichung der Implementierung wird in diesem Muster eine serverlose Zielarchitektur bereitgestellt. Clients können Anfragen an einen API-Gateway-Endpunkt senden. API Gateway leitet die Anfrage an die Lambda-Zielfunktion weiter, die das hexagonale Architekturmuster implementiert. Die Lambda-Funktion führt Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge (CRUD) in einer DynamoDB-Tabelle durch.


| 
| 
| Dieses Muster wurde in einer PoC-Umgebung getestet. Bevor Sie eine Architektur in einer Produktionsumgebung einsetzen, müssen Sie eine Sicherheitsüberprüfung durchführen, um das Bedrohungsmodell zu identifizieren und eine sichere Codebasis zu erstellen.  | 
| --- |

![\[Zielarchitektur für die Strukturierung eines Python-Projekts in hexagonaler Architektur\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/25bd7169-ea5e-4a21-a865-c91c30a3c0da/images/de0d4f0d-ad19-43ec-bd10-676b25477b64.png)


Die API unterstützt fünf Operationen an einer Produktentität:
+ `GET /products`gibt alle Produkte zurück. 
+ `POST /products`erstellt ein neues Produkt. 
+ `GET /products/{id}`gibt ein bestimmtes Produkt zurück.
+ `PUT /products/{id}`aktualisiert ein bestimmtes Produkt. 
+ `DELETE /products/{id}`löscht ein bestimmtes Produkt.

Sie können die folgende Ordnerstruktur verwenden, um Ihr Projekt so zu organisieren, dass es dem hexagonalen Architekturmuster folgt:  

```
app/  # application code
|--- adapters/  # implementation of the ports defined in the domain
     |--- tests/  # adapter unit tests
|--- entrypoints/  # primary adapters, entry points
     |--- api/  # api entry point
          |--- model/  # api model
          |--- tests/  # end to end api tests
|--- domain/  # domain to implement business logic using hexagonal architecture
     |--- command_handlers/  # handlers used to execute commands on the domain
     |--- commands/  # commands on the domain
     |--- events/  # events triggered via the domain
     |--- exceptions/  # exceptions defined on the domain
     |--- model/  # domain model
     |--- ports/  # abstractions used for external communication
     |--- tests/  # domain tests
|--- libraries/  # List of 3rd party libraries used by the Lambda function
infra/  # infrastructure code
simple-crud-app.py  # AWS CDK v2 app
```

## Tools
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-tools"></a>

**AWS-Services**
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/) ist ein vollständig verwalteter Service, der Entwicklern die Erstellung, Veröffentlichung, Wartung, Überwachung und Sicherung APIs in jeder Größenordnung erleichtert.
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) ist eine vollständig verwaltete, serverlose NoSQL-Datenbank mit Schlüsselwerten, die für die Ausführung von Hochleistungsanwendungen in jeder Größenordnung konzipiert ist.
+ [AWS Lambda](https://aws.amazon.com/lambda/) ist ein serverloser, ereignisgesteuerter Rechenservice, mit dem Sie Code für praktisch jede Art von Anwendung oder Backend-Service ausführen können, ohne Server bereitstellen oder verwalten zu müssen. Sie können Lambda-Funktionen von über 200 AWS-Services und SaaS-Anwendungen (Software as a Service) aus starten und zahlen nur für das, was Sie tatsächlich nutzen.

**Tools**
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) wird in diesem Muster als Versionskontrollsystem für die Codeentwicklung verwendet.
+ [Python](https://www.python.org/) wird als Programmiersprache für dieses Muster verwendet. Python bietet Datenstrukturen auf hoher Ebene und einen Ansatz für objektorientierte Programmierung. AWS Lambda bietet eine integrierte Python-Laufzeit, die den Betrieb von Python-Services vereinfacht.
+ [Visual Studio Code](https://code.visualstudio.com/) wird als IDE für die Entwicklung und das Testen dieses Musters verwendet. Sie können jede IDE verwenden, die die Python-Entwicklung unterstützt (z. B. [PyCharm](https://www.jetbrains.com/pycharm/)).
+ Das [AWS Cloud Development Kit (AWS CDK](https://aws.amazon.com/cdk/)) ist ein Open-Source-Framework für die Softwareentwicklung, mit dem Sie Ihre Cloud-Anwendungsressourcen mithilfe vertrauter Programmiersprachen definieren können. Dieses Muster verwendet das CDK, um die Cloud-Infrastruktur als Code zu schreiben und bereitzustellen.
+ [Poesie](https://python-poetry.org/) wird verwendet, um Abhängigkeiten im Muster zu verwalten.
+ [Docker](https://www.docker.com/) wird vom AWS CDK verwendet, um das Lambda-Paket und die Lambda-Layer zu erstellen.

**Code**

Der Code für dieses Muster ist im Beispiel-Repository für die [hexagonale Architektur von GitHub Lambda](https://github.com/aws-samples/lambda-hexagonal-architecture-sample) verfügbar.

## Best Practices
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-best-practices"></a>

Um dieses Muster in einer Produktionsumgebung zu verwenden, folgen Sie diesen bewährten Methoden:
+ Verwenden Sie vom Kunden verwaltete Schlüssel in AWS Key Management Service (AWS KMS), um [ CloudWatch Amazon-Protokollgruppen und Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html) [DynamoDB-Tabellen](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html) zu verschlüsseln.
+ Konfigurieren Sie [AWS WAF für Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) so, dass der Zugriff nur über das Netzwerk Ihres Unternehmens möglich ist.
+ Ziehen Sie andere Optionen für die API Gateway Gateway-Autorisierung in Betracht, wenn IAM Ihre Anforderungen nicht erfüllt. Sie können beispielsweise [Amazon Cognito Cognito-Benutzerpools](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html) oder [API Gateway Lambda-Autorisierer](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) verwenden.
+ Verwenden Sie [DynamoDB-Backups](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BackupRestore.html).
+ Konfigurieren Sie Lambda-Funktionen mit einer [Virtual Private Cloud (VPC) -Bereitstellung](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html), um den Netzwerkverkehr in der Cloud zu halten.
+ Aktualisieren Sie die zulässige Ausgangskonfiguration für [Cross-Origin Resource Sharing (CORS) -Preflight](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS), um den Zugriff nur auf die anfragende Ursprungsdomäne zu beschränken.
+ Verwenden Sie [cdk-nag](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/check-aws-cdk-applications-or-cloudformation-templates-for-best-practices-by-using-cdk-nag-rule-packs.html), um den AWS-CDK-Code auf bewährte Sicherheitsmethoden zu überprüfen.
+ Erwägen Sie die Verwendung von Tools zum Scannen von Code, um häufig auftretende Sicherheitsprobleme im Code zu finden. [Bandit](https://bandit.readthedocs.io/en/latest/) ist beispielsweise ein Tool, das entwickelt wurde, um häufig auftretende Sicherheitsprobleme im Python-Code zu finden. [PIP-Audit](https://pypi.org/project/pip-audit/) durchsucht Python-Umgebungen nach Paketen, die bekannte Sicherheitslücken aufweisen.

Dieses Muster verwendet [AWS X-Ray](https://aws.amazon.com/xray/?nc1=h_ls), um Anfragen über den Einstiegspunkt, die Domäne und die Adapter der Anwendung zu verfolgen. AWS X-Ray hilft Entwicklern dabei, Engpässe zu identifizieren und hohe Latenzen zu ermitteln, um die Anwendungsleistung zu verbessern.

## Epen
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-epics"></a>

### Initialisieren Sie das Projekt
<a name="initialize-the-project"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie Ihr eigenes Repository. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Installieren Sie die Abhängigkeiten. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Konfigurieren Sie Ihre IDE. | Wir empfehlen Visual Studio Code, aber Sie können jede IDE Ihrer Wahl verwenden, die Python unterstützt. Die folgenden Schritte beziehen sich auf Visual Studio Code.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Führen Sie Komponententests aus, Option 1: Verwenden Sie Visual Studio Code. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Führen Sie Komponententests aus, Option 2: Verwenden Sie Shell-Befehle. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 

### Stellen Sie die Anwendung bereit und testen Sie sie
<a name="deploy-and-test-the-application"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Fordern Sie temporäre Anmeldeinformationen an. | Um bei der Ausführung AWS-Anmeldeinformationen auf der Shell zu haben`cdk deploy`, erstellen Sie mithilfe von AWS IAM Identity Center (Nachfolger von AWS Single Sign-On) temporäre Anmeldeinformationen. Anweisungen finden Sie im Blogbeitrag [So rufen Sie kurzfristige Anmeldeinformationen für die CLI-Verwendung mit AWS IAM Identity Center](https://aws.amazon.com/blogs/security/aws-single-sign-on-now-enables-command-line-interface-access-for-aws-accounts-using-corporate-credentials/) ab. | App-Entwickler, AWS DevOps | 
| Stellen Sie die Anwendung bereit. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Entwickler, AWS DevOps | 
| Testen Sie die API, Option 1: Verwenden Sie die Konsole. | Verwenden Sie die [API Gateway Gateway-Konsole](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html), um die API zu testen. Weitere Informationen zu API-Vorgängen und request/response -Meldungen finden Sie im [Abschnitt API-Nutzung der Readme-Datei](https://github.com/aws-samples/lambda-hexagonal-architecture-sample/blob/main/README.md#api-usage) im GitHub Repository. | App-Entwickler, AWS DevOps | 
| Testen Sie die API, Option 2: Verwenden Sie Postman. | Wenn Sie ein Tool wie [Postman](https://www.postman.com/) verwenden möchten:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Entwickler, AWS DevOps | 

### Entwickeln Sie den Service
<a name="develop-the-service"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Schreiben Sie Komponententests für den Geschäftsbereich. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Implementieren Sie Befehle und Befehlshandler. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Schreiben Sie Integrationstests für sekundäre Adapter. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Implementieren Sie sekundäre Adapter. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Schreiben Sie end-to-end Tests. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 
| Implementieren Sie Primäradapter. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | App-Developer | 

## Zugehörige Ressourcen
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-resources"></a>

**APG-Leitfaden**
+ [Aufbau sechseckiger Architekturen auf AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/)

**AWS-Referenzen**
+ [AWS Lambda Lambda-Dokumentation](https://docs.aws.amazon.com/lambda/)
+ [AWS-CDK-Dokumentation](https://docs.aws.amazon.com/cdk/)
  + [Ihre erste AWS CDK-App](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)
+ [API Gateway Gateway-Dokumentation](https://docs.aws.amazon.com/apigateway/)
  + [Steuern Sie den Zugriff auf eine API mit IAM-Berechtigungen](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)
  + [Verwenden Sie die API Gateway Gateway-Konsole, um eine REST-API-Methode zu testen](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html)
+ [Amazon DynamoDB DynamoDB-Dokumentation](https://docs.aws.amazon.com/dynamodb/)

**Tools**
+ [Webseite git-scm.com](https://git-scm.com/)
+ [Git installieren](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ [Ein neues GitHub Repository erstellen](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository)
+ [Python-Webseite](https://www.python.org/)
+ [AWS Lambda Powertools für Python](https://docs.powertools.aws.dev/lambda/python/latest/)
+ [Postman-Webseite](https://www.postman.com/)
+ [Python-Mock-Objektbibliothek](https://docs.python.org/3/library/unittest.mock.html)
+ [Poesie-Website](https://python-poetry.org/)

**IDEs**
+ [Visual Studio Code-Webseite](https://code.visualstudio.com/)
+ [PyCharm website](https://www.jetbrains.com/pycharm/)