

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.

# Traitez les événements de manière asynchrone avec Amazon API Gateway et Amazon DynamoDB Streams
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams"></a>

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

## Résumé
<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) est un service entièrement géré que les développeurs peuvent utiliser pour créer, publier, gérer, surveiller et sécuriser APIs à n'importe quelle échelle. Il gère les tâches liées à l'acceptation et au traitement de centaines de milliers d'appels d'API simultanés.

Le délai d'intégration est un quota de service important pour API Gateway. Le délai d'attente est le délai maximal pendant lequel un service principal doit renvoyer une réponse avant que l'API REST ne renvoie une erreur. La limite stricte de 29 secondes est généralement acceptable pour les charges de travail synchrones. Toutefois, cette limite représente un défi pour les développeurs qui souhaitent utiliser API Gateway avec des charges de travail asynchrones.

Ce modèle montre un exemple d'architecture permettant de traiter des événements de manière asynchrone à l'aide d'API Gateway, d'Amazon DynamoDB Streams et. AWS Lambda L'architecture prend en charge l'exécution de tâches de traitement parallèle avec les mêmes paramètres d'entrée et utilise une API REST de base comme interface. Dans cet exemple, l'utilisation de Lambda comme backend limite la durée des tâches à 15 minutes. Vous pouvez éviter cette limite en utilisant un autre service pour traiter les événements entrants (par exemple, AWS Fargate).

[Projen](https://pypi.org/project/projen/) [est utilisé pour configurer l'environnement de développement local et pour déployer l'exemple d'architecture sur une cible Compte AWS, en combinaison avec le [AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html), [Docker et Node.js](https://docs.docker.com/get-docker/).](https://nodejs.org/en/download/) Projen configure automatiquement un environnement virtuel [Python](https://www.python.org/downloads/) avec le [pré-commit](https://pre-commit.com/) et les outils utilisés pour l'assurance qualité du code, l'analyse de sécurité et les tests unitaires. Pour plus d'informations, consultez la section [Outils](#processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools).

## Conditions préalables et limitations
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-prereqs"></a>

**Prérequis**
+ Un actif Compte AWS
+ Les outils suivants sont installés sur votre poste de travail :
  + [AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) version 2.85.0 ou ultérieure
  + [Docker](https://docs.docker.com/get-docker/) version 20.10.21 ou ultérieure
  + [Node.js](https://nodejs.org/en/download/) version 18 ou ultérieure
  + [Projen](https://pypi.org/project/projen/) version 0.71.111 ou ultérieure
  + [Python](https://www.python.org/downloads/) version 3.9.16 ou ultérieure

**Limites**
+ Le nombre maximum de lecteurs recommandé pour DynamoDB Streams est de deux afin d'éviter toute limitation.
+ Le temps d'exécution maximal d'une tâche est limité par le temps d'exécution maximal des fonctions Lambda (15 minutes).
+ Le nombre maximum de demandes de travail simultanées est limité par la simultanéité réservée des fonctions Lambda.

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

**Architecture**

Le schéma suivant montre l'interaction de l'API jobs avec DynamoDB Streams et les fonctions Lambda de traitement des événements et de gestion des erreurs, avec les événements stockés dans une archive d'événements Amazon. EventBridge 

![\[Schéma de l'architecture et du processus, avec les étapes répertoriées après le schéma.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/68a46501-16e5-48e4-99c6-fc67a8b4133a/images/29fe6982-ad81-4099-9c65-08b17c96e78f.png)


Un flux de travail typique comprend les étapes suivantes :

1. Vous vous authentifiez auprès de Gestion des identités et des accès AWS (IAM) et obtenez des informations d'identification de sécurité.

1. Vous envoyez une `POST` requête HTTP au point de terminaison de l'API des `/jobs` tâches, en spécifiant les paramètres de la tâche dans le corps de la demande.

1. L'API des tâches vous renvoie une réponse HTTP contenant l'identifiant de la tâche.

1. L'API des tâches place les paramètres des tâches dans la table `jobs_table` Amazon DynamoDB.

1. Le flux `jobs_table` DynamoDB de la table DynamoDB invoque les fonctions Lambda de traitement des événements.

1. Les fonctions Lambda de traitement des événements traitent l'événement puis placent les résultats de la tâche dans la table DynamoDB. `jobs_table` Pour garantir des résultats cohérents, les fonctions de traitement des événements mettent en œuvre un mécanisme de [verrouillage optimiste](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html).

1. Vous envoyez une `GET` requête HTTP au point de terminaison de l'API des `/jobs/{jobId}` tâches, avec l'identifiant de tâche de l'étape 3 sous la forme`{jobId}`.

1. L'API des tâches interroge la table `jobs_table` DynamoDB pour récupérer les résultats des tâches.

1. L'API des tâches renvoie une réponse HTTP contenant les résultats des tâches.

1. Si le traitement des événements échoue, le mappage source de la fonction de traitement des événements envoie l'événement à la rubrique Amazon Simple Notification Service (Amazon SNS) consacrée à la gestion des erreurs.

1. La rubrique SNS de gestion des erreurs transmet l'événement de manière asynchrone à la fonction de gestion des erreurs.

1. La fonction de gestion des erreurs place les paramètres de la tâche dans la table DynamoDB`jobs_table`.

   Vous pouvez récupérer les paramètres des tâches en envoyant une `GET` requête HTTP au point de terminaison de l'API `/jobs/{jobId}` des tâches.

1. Si la gestion des erreurs échoue, la fonction de gestion des erreurs envoie l'événement à une archive Amazon EventBridge .

   Vous pouvez rejouer les événements archivés en utilisant EventBridge.

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

**Services AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)est un framework de développement logiciel qui vous aide à définir et à provisionner l'infrastructure cloud AWS sous forme de code.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) est un service de base de données NoSQL entièrement géré, offrant des performances rapides, prévisibles et évolutives.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) est un service de bus d'événements sans serveur qui vous permet de connecter vos applications à des données en temps réel provenant de diverses sources. Par exemple, les fonctions AWS Lambda, les points de terminaison d'appel HTTP utilisant des destinations d'API ou les bus d'événements dans d'autres comptes AWS.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.
+ [Amazon Simple Notification Service (Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)) vous aide à coordonner et à gérer l'échange de messages entre les éditeurs et les clients, y compris les serveurs Web et les adresses e-mail.

**Autres outils**
+ [autopep8 formate](https://github.com/hhatto/autopep8) automatiquement le code Python en fonction du guide de style de la Python Enhancement Proposal (PEP) 8.
+ [Bandit](https://bandit.readthedocs.io/en/latest/) scanne le code Python pour détecter les problèmes de sécurité courants.
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) est un vérificateur et un générateur de commit Git. `CHANGELOG`
+ [cfn-lint est un linter](https://github.com/aws-cloudformation/cfn-lint) AWS CloudFormation 
+ [Checkov](https://github.com/bridgecrewio/checkov) est un outil d'analyse de code statique qui vérifie l'infrastructure en tant que code (IaC) pour détecter les erreurs de configuration liées à la sécurité et à la conformité.
+ [jq](https://stedolan.github.io/jq/download/) est un outil en ligne de commande pour analyser le JSON.
+ [Postman](https://www.postman.com/) est une plateforme d'API.
+ [pre-commit](https://pre-commit.com/) est un gestionnaire de hooks Git.
+ [Projen](https://github.com/projen/projen) est un générateur de projets.
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) est un framework Python pour écrire de petits tests lisibles.

**Référentiel de code**

Cet exemple de code d'architecture se trouve dans le référentiel GitHub [Asynchronous Processing with API Gateway et DynamoDB Streams](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk).

## Bonnes pratiques
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-best-practices"></a>
+ Cet exemple d'architecture n'inclut pas la surveillance de l'infrastructure déployée. Si votre cas d'utilisation nécessite une surveillance, évaluez l'ajout de [constructions de surveillance CDK](https://constructs.dev/packages/cdk-monitoring-constructs) ou d'une autre solution de surveillance.
+ Cet exemple d'architecture utilise [les autorisations IAM](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html) pour contrôler l'accès à l'API des tâches. Toute personne autorisée à assumer le `JobsAPIInvokeRole` sera en mesure d'invoquer l'API jobs. Le mécanisme de contrôle d'accès est donc binaire. Si votre cas d'utilisation nécessite un modèle d'autorisation plus complexe, évaluez-le à l'aide d'un autre [mécanisme de contrôle d'accès](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html).
+ Lorsqu'un utilisateur envoie une `POST` requête HTTP au point de terminaison de l'API `/jobs` jobs, les données d'entrée sont validées à deux niveaux différents :
  + API Gateway est en charge de la [validation de la première demande](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html).
  + La fonction de traitement des événements exécute la deuxième demande.

    Aucune validation n'est effectuée lorsque l'utilisateur envoie une `GET` requête HTTP au point de terminaison de l'API `/jobs/{jobId}` des tâches. Si votre cas d'utilisation nécessite une validation des entrées supplémentaire et un niveau de sécurité accru, évaluez [l'utilisation AWS WAF pour protéger votre API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html).
+ Pour éviter toute limitation, la documentation [DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.Processing) déconseille aux utilisateurs de lire avec plus de deux utilisateurs d'une même partition de flux. Pour augmenter le nombre de consommateurs, nous vous recommandons d'utiliser [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html).
+ Le [verrouillage optimiste](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html) a été utilisé dans cet exemple pour garantir des mises à jour cohérentes des éléments de la table `jobs_table` DynamoDB. Selon les exigences du cas d'utilisation, vous devrez peut-être mettre en œuvre des mécanismes de verrouillage plus fiables, tels que le verrouillage pessimiste.

## Épopées
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-epics"></a>

### Configuration de l'environnement
<a name="set-up-the-environment"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Pour cloner le référentiel. | Pour cloner le dépôt localement, exécutez la commande suivante :<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git</pre> | DevOps ingénieur | 
| Configurez le projet. | Remplacez le répertoire par la racine du référentiel et configurez l'environnement virtuel Python et tous les outils à l'aide de [Projen :](https://github.com/projen/projen)<pre>cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk<br />npx projen</pre> | DevOps ingénieur | 
| Installez des hooks de pré-validation. | Pour installer des hooks de pré-validation, procédez comme suit :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | DevOps ingénieur | 

### Déployez l'exemple d'architecture
<a name="deploy-the-example-architecture"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Bootstrap. AWS CDK | Pour démarrer votre [AWS CDK](https://aws.amazon.com/cdk/)compte Compte AWS, exécutez la commande suivante :<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| Déployez l'exemple d'architecture. | Pour déployer l'exemple d'architecture dans votre Compte AWS, exécutez la commande suivante :<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### Testez l'architecture
<a name="test-the-architecture"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Installez les prérequis de test. | Installez sur votre poste de travail 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/) et [jq](https://jqlang.github.io/jq/).L'utilisation de [Postman](https://www.postman.com/downloads/) pour tester cet exemple d'architecture est suggérée mais pas obligatoire. Si vous choisissez un autre outil de test d'API, assurez-vous qu'il prend en charge l'[authentification AWS Signature version 4](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) et reportez-vous aux points de terminaison d'API exposés qui peuvent être inspectés en [exportant l'API REST](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html). | DevOps ingénieur | 
| Supposons que`JobsAPIInvokeRole`. | [Supposons](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html) que `JobsAPIInvokeRole` ce qui a été imprimé en tant que sortie de la `deploy` commande :<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 | 
| Configurez Postman. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | AWS DevOps | 
| Testez l'exemple d'architecture. | Pour tester l'exemple d'architecture, envoyez des demandes à l'API jobs. Pour plus d'informations, consultez la [documentation de Postman](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request). | DevOps ingénieur | 

## Résolution des problèmes
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| La destruction puis le redéploiement de l'architecture d'exemple échouent car le [groupe de CloudWatch journaux Amazon Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) existe `/aws/apigateway/JobsAPIAccessLogs` déjà. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | 

## Ressources connexes
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-resources"></a>
+ [Modèle de mappage API Gateway et référence à la variable de journalisation des accès](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [Modifier la capture de données pour DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)
+ [Verrouillage optimiste avec numéro de version](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)
+ [Utilisation de Kinesis Data Streams pour capturer les modifications apportées à DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)