

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Structurer un projet Python dans une architecture hexagonale à l'aide d'AWS Lambda
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda"></a>

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

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

Ce modèle montre comment structurer un projet Python dans une architecture hexagonale à l'aide d'AWS Lambda. Le modèle utilise l'AWS Cloud Development Kit (AWS CDK) comme outil d'infrastructure en tant que code (iAc), Amazon API Gateway comme API REST et Amazon DynamoDB comme couche de persistance. L'architecture hexagonale suit les principes de conception axés sur le domaine. Dans une architecture hexagonale, le logiciel comprend trois composants : le domaine, les ports et les adaptateurs. *Pour obtenir des informations détaillées sur les architectures hexagonales et leurs avantages, consultez le guide [Création d'architectures hexagonales sur AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/).*

## Conditions préalables et limitations
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-prereqs"></a>

**Conditions préalables**
+ Un compte AWS actif
+ Expérience en Python
+ Connaissance d'AWS Lambda, d'AWS CDK, d'Amazon API Gateway et de DynamoDB
+ Un GitHub compte (voir [les instructions d'inscription](https://docs.github.com/en/get-started/signing-up-for-github/signing-up-for-a-new-github-account))
+ Git (voir les [instructions d'installation](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git))
+ Un éditeur de code pour apporter des modifications et transférer votre code vers GitHub (par exemple, [Visual Studio Code](https://code.visualstudio.com/) ou [JetBrains PyCharm](https://www.jetbrains.com/pycharm/))
+ Docker est installé et le daemon Docker est opérationnel

**Versions du produit**
+ Git version 2.24.3 ou ultérieure
+ Python version 3.7 ou ultérieure
+ Kit de développement logiciel AWS version 2
+ Poetry version 1.1.13 ou ultérieure
+ AWS Lambda Powertools pour Python version 1.25.6 ou ultérieure
+ pytest version 7.1.1 ou ultérieure
+ Moto version 3.1.9 ou ultérieure
+ version 1.9.0 ou ultérieure de pydantic
+ Boto3 version 1.22.4 ou ultérieure
+ mypy-boto3-dynamodb version 1.24.0 ou ultérieure

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

**Pile technologique cible**

La pile technologique cible consiste en un service Python qui utilise API Gateway, Lambda et DynamoDB. Le service utilise un adaptateur DynamoDB pour conserver les données. Il fournit une fonction qui utilise Lambda comme point d'entrée. Le service utilise Amazon API Gateway pour exposer une API REST. L'API utilise AWS Identity and Access Management (IAM) pour l'[authentification des clients](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html).

**Architecture cible**

Pour illustrer l'implémentation, ce modèle déploie une architecture cible sans serveur. Les clients peuvent envoyer des demandes à un point de terminaison API Gateway. API Gateway transmet la demande à la fonction Lambda cible qui implémente le modèle d'architecture hexagonal. La fonction Lambda effectue des opérations de création, de lecture, de mise à jour et de suppression (CRUD) sur une table DynamoDB.


| 
| 
| Ce modèle a été testé dans un environnement PoC. Vous devez effectuer un examen de sécurité pour identifier le modèle de menace et créer une base de code sécurisée avant de déployer une architecture dans un environnement de production.  | 
| --- |

![\[Architecture cible pour structurer un projet Python en architecture hexagonale\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/25bd7169-ea5e-4a21-a865-c91c30a3c0da/images/de0d4f0d-ad19-43ec-bd10-676b25477b64.png)


L'API prend en charge cinq opérations sur une entité de produit :
+ `GET /products`renvoie tous les produits. 
+ `POST /products`crée un nouveau produit. 
+ `GET /products/{id}`renvoie un produit spécifique.
+ `PUT /products/{id}`met à jour un produit spécifique. 
+ `DELETE /products/{id}`supprime un produit spécifique.

Vous pouvez utiliser la structure de dossiers suivante pour organiser votre projet selon le modèle d'architecture hexagonal :  

```
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
```

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

**Services AWS**
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/) est un service entièrement géré qui permet aux développeurs de créer, publier, gérer, surveiller et sécuriser facilement APIs à n'importe quelle échelle.
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) est une base de données NoSQL à valeur clé entièrement gérée, sans serveur, conçue pour exécuter des applications hautes performances à n'importe quelle échelle.
+ [AWS Lambda](https://aws.amazon.com/lambda/) est un service de calcul sans serveur piloté par les événements qui vous permet d'exécuter du code pour pratiquement n'importe quel type d'application ou de service principal sans provisionner ni gérer de serveurs. Vous pouvez lancer des fonctions Lambda à partir de plus de 200 services AWS et applications logicielles en tant que service (SaaS), et ne payer que pour ce que vous utilisez.

**Outils**
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) est utilisé comme système de contrôle de version pour le développement de code dans ce modèle.
+ [Python](https://www.python.org/) est utilisé comme langage de programmation pour ce modèle. Python fournit des structures de données de haut niveau et une approche de la programmation orientée objet. AWS Lambda fournit un environnement d'exécution Python intégré qui simplifie le fonctionnement des services Python.
+ [Visual Studio Code](https://code.visualstudio.com/) est utilisé comme IDE pour le développement et les tests de ce modèle. Vous pouvez utiliser n'importe quel IDE prenant en charge le développement en Python (par exemple, [PyCharm](https://www.jetbrains.com/pycharm/)).
+ [AWS Cloud Development Kit (AWS CDK](https://aws.amazon.com/cdk/)) est un framework de développement logiciel open source qui vous permet de définir les ressources de vos applications cloud à l'aide de langages de programmation courants. Ce modèle utilise le CDK pour écrire et déployer l'infrastructure cloud sous forme de code.
+ [La poésie](https://python-poetry.org/) est utilisée pour gérer les dépendances dans le modèle.
+ [Docker](https://www.docker.com/) est utilisé par le AWS CDK pour créer le package et la couche Lambda.

**Code**

Le code de ce modèle est disponible dans le référentiel d'exemples d'[architecture hexagonale GitHub Lambda](https://github.com/aws-samples/lambda-hexagonal-architecture-sample).

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

Pour utiliser ce modèle dans un environnement de production, suivez les meilleures pratiques suivantes :
+ Utilisez les clés gérées par le client dans AWS Key Management Service (AWS KMS) pour chiffrer les [groupes de CloudWatch journaux Amazon et les tables](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html) [Amazon DynamoDB](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html).
+ Configurez [AWS WAF pour Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) afin d'autoriser l'accès uniquement depuis le réseau de votre organisation.
+ Envisagez d'autres options d'autorisation API Gateway si IAM ne répond pas à vos besoins. Par exemple, vous pouvez utiliser les [groupes d'utilisateurs Amazon Cognito](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html) ou les autorisateurs [Lambda d'API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html).
+ Utilisez les [sauvegardes DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BackupRestore.html).
+ Configurez les fonctions Lambda avec un [déploiement de cloud privé virtuel (VPC)](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html) afin de maintenir le trafic réseau dans le cloud.
+ Mettez à jour la configuration d'origine autorisée pour [le partage de ressources entre origines (CORS) avant le vol](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) afin de restreindre l'accès au domaine d'origine demandeur uniquement.
+ Utilisez [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) pour vérifier le code AWS CDK afin de connaître les meilleures pratiques en matière de sécurité.
+ Envisagez d'utiliser des outils d'analyse de code pour détecter les problèmes de sécurité courants dans le code. Par exemple, [Bandit](https://bandit.readthedocs.io/en/latest/) est un outil conçu pour détecter les problèmes de sécurité courants dans le code Python. [PIP-Audit analyse](https://pypi.org/project/pip-audit/) les environnements Python à la recherche de packages présentant des vulnérabilités connues.

Ce modèle utilise [AWS X-Ray](https://aws.amazon.com/xray/?nc1=h_ls) pour suivre les demandes via le point d'entrée, le domaine et les adaptateurs de l'application. AWS X-Ray aide les développeurs à identifier les goulets d'étranglement et à déterminer les latences élevées afin d'améliorer les performances des applications.

## Épopées
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-epics"></a>

### Initialiser le projet
<a name="initialize-the-project"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez votre propre référentiel. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Installez les dépendances. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Configurez votre IDE. | Nous recommandons Visual Studio Code, mais vous pouvez utiliser n'importe quel IDE de votre choix qui supporte Python. Les étapes suivantes concernent Visual Studio Code.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Exécuter des tests unitaires, option 1 : utiliser Visual Studio Code. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Exécuter des tests unitaires, option 2 : utiliser des commandes shell. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 

### Déployez et testez l'application
<a name="deploy-and-test-the-application"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Demandez des informations d'identification temporaires. | Pour avoir des informations d'identification AWS sur le shell lorsque vous exécutez`cdk deploy`, créez des informations d'identification temporaires à l'aide d'AWS IAM Identity Center (successeur d'AWS Single Sign-On). Pour obtenir des instructions, consultez le billet de blog [Comment récupérer des informations d'identification à court terme pour une utilisation en CLI avec 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/). | Développeur d'applications, AWS DevOps | 
| Déployez l'application. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d'applications, AWS DevOps | 
| Testez l'API, option 1 : utilisez la console. | Utilisez la [console API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html) pour tester l'API. Pour plus d'informations sur les opérations et les request/response messages de l'[API, consultez la section sur l'utilisation de l'API du fichier readme](https://github.com/aws-samples/lambda-hexagonal-architecture-sample/blob/main/README.md#api-usage) du GitHub référentiel. | Développeur d'applications, AWS DevOps | 
| Testez l'API, option 2 : utilisez Postman. | Si vous souhaitez utiliser un outil tel que [Postman](https://www.postman.com/) :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d'applications, AWS DevOps | 

### Développez le service
<a name="develop-the-service"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Rédigez des tests unitaires pour le domaine commercial. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Implémenter des commandes et des gestionnaires de commandes. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Rédigez des tests d'intégration pour les adaptateurs secondaires. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Implémentez des adaptateurs secondaires. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Rédigez end-to-end des tests. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 
| Implémentez les adaptateurs principaux. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Développeur d’applications | 

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

**Guide APG**
+ [Création d'architectures hexagonales sur AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/)

**Références AWS**
+ [Documentation AWS Lambda](https://docs.aws.amazon.com/lambda/)
+ [Documentation du kit de développement AWS](https://docs.aws.amazon.com/cdk/)
  + [Votre première application AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)
+ [Documentation d'API Gateway](https://docs.aws.amazon.com/apigateway/)
  + [Contrôler l'accès à une API avec des autorisations IAM](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)
  + [Utiliser la console API Gateway pour tester une méthode d'API REST](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html)
+ [Documentation Amazon DynamoDB](https://docs.aws.amazon.com/dynamodb/)

**Outils**
+ [Site web git-scm.com](https://git-scm.com/)
+ [Installation de Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ [Création d'un nouveau GitHub référentiel](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository)
+ [Site Web Python](https://www.python.org/)
+ [Outils puissants AWS Lambda pour Python](https://docs.powertools.aws.dev/lambda/python/latest/)
+ [Site de Postman](https://www.postman.com/)
+ [bibliothèque d'objets fictifs en Python](https://docs.python.org/3/library/unittest.mock.html)
+ [Site de poésie](https://python-poetry.org/)

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