

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.

# Exécuter des lectures parallèles d'objets S3 en utilisant Python dans une AWS Lambda fonction
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function"></a>

*Eduardo Bortoluzzi, Amazon Web Services*

## Résumé
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-summary"></a>

Vous pouvez utiliser ce modèle pour récupérer et résumer une liste de documents à partir des buckets Amazon Simple Storage Service (Amazon S3) en temps réel. Le modèle fournit un exemple de code pour lire en parallèle des objets à partir de compartiments S3 sur Amazon Web Services (AWS). Le modèle montre comment exécuter efficacement des tâches I/O liées avec des AWS Lambda fonctions utilisant Python.

Une société financière a utilisé ce modèle dans une solution interactive pour approuver ou rejeter manuellement les transactions financières corrélées en temps réel. Les documents relatifs aux transactions financières étaient stockés dans un compartiment S3 lié au marché. Un opérateur a sélectionné une liste de documents dans le compartiment S3, a analysé la valeur totale des transactions calculées par la solution et a décidé d'approuver ou de rejeter le lot sélectionné.

Les tâches liées aux E/S prennent en charge plusieurs threads. Dans cet exemple de code, le fichier [concurrent.futures. ThreadPoolExecutor](https://docs.python.org/3.13/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)est utilisé avec un maximum de 30 threads simultanés, même si les fonctions Lambda prennent en charge jusqu'à 1 024 threads (l'un de ces threads étant votre processus principal). Cette limite est due au fait qu'un trop grand nombre de threads crée des problèmes de latence en raison du changement de contexte et de l'utilisation des ressources informatiques. Vous devez également augmenter le nombre maximum de connexions au pool `botocore` afin que tous les threads puissent effectuer le téléchargement de l'objet S3 simultanément.

L'exemple de code utilise un objet de 8,3 Ko, avec des données JSON, dans un compartiment S3. L'objet est lu plusieurs fois. Une fois que la fonction Lambda a lu l'objet, les données JSON sont décodées en un objet Python. En décembre 2024, le résultat après l'exécution de cet exemple était de 1 000 lectures traitées en 2,3 secondes et de 10 000 lectures traitées en 27 secondes à l'aide d'une fonction Lambda configurée avec 2 304 Mo de mémoire. AWS Lambda prend en charge les configurations de mémoire de 128 Mo à 10 240 Mo (10 Go), mais l'augmentation de la mémoire Lambda au-delà de 2 304 Mo n'a pas contribué à réduire le temps d'exécution de cette tâche spécifique liée aux E/S.

L'outil [AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) a été utilisé pour tester différentes configurations de mémoire Lambda et vérifier le meilleur performance-to-cost ratio pour la tâche. Pour les résultats des tests, consultez la section [Informations supplémentaires](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional).

## Conditions préalables et limitations
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-prereqs"></a>

**Conditions préalables**
+ Un actif Compte AWS
+ Maîtrise du développement en Python

**Limites**
+ Une fonction Lambda peut comporter au maximum [1 024 processus ou threads d'exécution](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution).
+  Comptes AWS Les nouveaux ont une limite de mémoire Lambda de 3 008 Mo. Réglez l'outil AWS Lambda Power Tuning en conséquence. Pour plus d'informations, consultez la section [Dépannage](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting).
+ Amazon S3 impose une limite de [5 500 GET/HEAD demandes par seconde et par préfixe partitionné](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html).

**Versions du produit**
+ Python 3.9 ou version ultérieure
+ AWS Cloud Development Kit (AWS CDK) v2
+ AWS Command Line Interface (AWS CLI) version 2
+ AWS Lambda Power Tuning 4.3.6 (en option)

## Architecture
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-architecture"></a>

**Pile technologique cible**
+ AWS Lambda
+ Amazon S3
+ AWS Step Functions (si AWS Lambda Power Tuning est déployé)

**Architecture cible**

Le schéma suivant montre une fonction Lambda qui lit des objets depuis un compartiment S3 en parallèle. Le diagramme contient également un flux de travail Step Functions pour l'outil AWS Lambda Power Tuning afin d'affiner la mémoire des fonctions Lambda. Ce réglage précis permet d'atteindre un bon équilibre entre les coûts et les performances.

![\[Schéma illustrant la fonction Lambda, le compartiment S3 et les fonctions AWS Step.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/828696e2-6df7-4536-9205-951c99449f4e.png)


**Automatisation et mise à l'échelle**

Les fonctions Lambda évoluent rapidement lorsque cela est nécessaire. Pour éviter 503 erreurs de ralentissement causées par Amazon S3 en cas de forte demande, nous vous recommandons de limiter le dimensionnement.

## Outils
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-tools"></a>

**Services AWS**
+ AWS Cloud Development Kit (AWS CDK) La [v2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) est un framework de développement logiciel qui vous aide à définir et à provisionner AWS Cloud l'infrastructure dans le code. L'exemple d'infrastructure a été créé pour être déployé avec AWS CDK.
+ [AWS Command Line InterfaceAWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)est un outil open source qui vous permet d'interagir Services AWS par le biais de commandes dans votre interface de ligne de commande. Dans ce modèle, AWS CLI la version 2 est utilisée pour télécharger un exemple de fichier JSON.
+ [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 Storage Service Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) est un service de stockage d'objets basé sur le cloud qui vous permet de stocker, de protéger et de récupérer n'importe quel volume de données.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)est un service d'orchestration sans serveur qui vous permet de combiner des AWS Lambda fonctions et d'autres services AWS pour créer des applications critiques pour l'entreprise.

**Autres outils**
+ [Python](https://www.python.org/) est un langage de programmation informatique polyvalent. La [réutilisation des threads de](https://docs.python.org/3.8/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) travail inactifs a été introduite dans la version 3.8 de Python, et le code de fonction Lambda de ce modèle a été créé pour Python version 3.9 et versions ultérieures.

**Référentiel de code**

Le code de ce modèle est disponible dans le [aws-lambda-parallel-download](https://github.com/aws-samples/aws-lambda-parallel-download) GitHub référentiel.

## Bonnes pratiques
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-best-practices"></a>
+ Cette AWS CDK construction repose sur les autorisations Compte AWS utilisateur dont vous disposez pour déployer l'infrastructure. Si vous envisagez d'utiliser des AWS CDK pipelines ou des déploiements entre comptes, consultez la section Synthétiseurs [Stack](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-synthesizers).
+ Dans cet exemple d'application, les journaux d'accès ne sont pas activés dans le compartiment S3. Il est recommandé d'activer les journaux d'accès dans le code de production.

## Épopées
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-epics"></a>

### Préparer l'environnement de développement
<a name="prepare-the-development-environment"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Vérifiez la version de Python installée. | Ce code a été testé spécifiquement sur Python 3.9 et Python 3.13, et il devrait fonctionner sur toutes les versions entre ces versions. Pour vérifier votre version de Python, `python3 -V` lancez-la dans votre terminal et installez une version plus récente si nécessaire.Pour vérifier que les modules requis sont installés, exécutez`python3 -c "import pip, venv"`. L'absence de message d'erreur signifie que les modules sont correctement installés et que vous êtes prêt à exécuter cet exemple.  | Architecte du cloud | 
| Installez AWS CDK. | Pour installer le AWS CDK s'il n'est pas déjà installé, suivez les instructions de la section [Mise en route avec le AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). Pour vérifier que la AWS CDK version installée est 2.0 ou ultérieure, exécutez`cdk –version`. | Architecte du cloud | 
| Bootstrap votre environnement. | Pour démarrer votre environnement, si ce n'est pas déjà fait, suivez les instructions de la section [Bootstrap votre environnement pour une utilisation avec](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping-env.html) le. AWS CDK | Architecte du cloud | 

### Cloner le référentiel d'exemple
<a name="clone-the-example-repository"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Pour cloner le référentiel. | Pour cloner la dernière version du référentiel, exécutez la commande suivante :<pre>git clone --depth 1 --branch v1.2.0 \<br />git@github.com:aws-samples/aws-lambda-parallel-download.git</pre> | Architecte du cloud | 
| Remplacez le répertoire de travail par le référentiel cloné. | Exécutez la commande suivante :<pre>cd aws-lambda-parallel-download</pre> | Architecte du cloud | 
| Créez l'environnement virtuel Python. | Pour créer un environnement virtuel Python, exécutez la commande suivante :<pre>python3 -m venv .venv</pre> | Architecte du cloud | 
| Activez l’environnement virtuel. | Pour activer l'environnement virtuel, exécutez la commande suivante :<pre>source .venv/bin/activate</pre> | Architecte du cloud | 
| Installez les dépendances. | Pour installer les dépendances Python, exécutez la `pip` commande suivante :<pre>pip install -r requirements.txt</pre> | Architecte du cloud | 
| Parcourez le code. | (Facultatif) L'exemple de code qui télécharge un objet depuis le compartiment S3 se trouve sur`resources/parallel.py`.Le code d'infrastructure se trouve dans le `parallel_download` dossier. | Architecte du cloud | 

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


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Déployez l’application. | Exécutez `cdk deploy`.Notez les AWS CDK sorties :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | Architecte du cloud | 
| Téléchargez un exemple de fichier JSON. | Le référentiel contient un exemple de fichier JSON d'environ 9 Ko. Pour télécharger le fichier dans le compartiment S3 de la pile créée, exécutez la commande suivante :<pre>aws s3 cp sample.json s3://<ParallelDownloadStack.SampleS3BucketName></pre>Remplacez `<ParallelDownloadStack.SampleS3BucketName>` par la valeur correspondante de la AWS CDK sortie. | Architecte du cloud | 
| Lancez l'application. | Pour exécuter l'application, procédez comme suit :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | Architecte du cloud | 
| Ajoutez le nombre de téléchargements. | (Facultatif) Pour exécuter 1 500 appels d'objets get, utilisez le code JSON suivant dans le **JSON d'événement** du `Test` paramètre :<pre>{"repeat": 1500, "objectKey": "sample.json"}</pre> | Architecte du cloud | 

### Facultatif : exécutez AWS Lambda Power Tuning
<a name="optional-run-lamlong-power-tuning"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Exécutez l'outil AWS Lambda Power Tuning. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html)À la fin de l'exécution, le résultat sera affiché dans l'onglet **d'entrée et de sortie de l'exécution**. | Architecte du cloud | 
| Affichez les résultats du AWS Lambda Power Tuning sous forme de graphique. | Dans l'onglet **Entrée et sortie d'exécution**, copiez le lien de `visualization` propriété et collez-le dans un nouvel onglet du navigateur. | Architecte du cloud | 

### Nettoyage
<a name="clean-up"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Supprimez les objets du compartiment S3. | Avant de détruire les ressources déployées, vous devez supprimer tous les objets du compartiment S3 :<pre>aws s3 rm s3://<ParallelDownloadStack.SampleS3BucketName> \<br />--recursive</pre>N'oubliez pas `<ParallelDownloadStack.SampleS3BucketName>` de remplacer par la valeur des AWS CDK sorties. | Architecte du cloud | 
| Détruisez les ressources. | Pour détruire toutes les ressources créées pour ce pilote, exécutez la commande suivante :<pre>cdk destroy</pre> | Architecte du cloud | 

## Résolution des problèmes
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| `'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008` | Pour les nouveaux comptes, il se peut que vous ne puissiez pas configurer plus de 3 008 Mo dans vos fonctions Lambda. Pour tester l'utilisation de AWS Lambda Power Tuning, ajoutez la propriété suivante au JSON d'entrée lorsque vous démarrez l'exécution de Step Functions :<pre>"powerValues": [<br />    512,<br />    1024,<br />    1536,<br />    2048,<br />    2560,<br />    3008<br />  ]</pre> | 

## Ressources connexes
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-resources"></a>
+ [Python — concurrent.futures. ThreadPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)
+ [Quotas Lambda : configuration, déploiement et exécution des fonctions](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)
+ [Travailler avec le AWS CDK en Python](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [Fonctions de profilage avec AWS Lambda Power Tuning](https://docs.aws.amazon.com/lambda/latest/operatorguide/profile-functions.html)

## Informations supplémentaires
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional"></a>

**Code**

L'extrait de code suivant effectue le traitement parallèle I/O  :

```
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
  for result in executor.map(a_function, (the_arguments)):
    ...
```

Les fils `ThreadPoolExecutor` de discussion sont réutilisés lorsqu'ils sont disponibles.

**Tests et résultats**

Ces tests ont été réalisés en décembre 2024.

Le premier test a traité 2 500 lectures d'objets, avec le résultat suivant.

![\[Le temps d'invocation diminue et le coût de l'invocation augmente à mesure que la mémoire augmente.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f6743412-1e52-4c4c-a51c-ac0f75b3b998.png)


À partir de 3 009 Mo, le temps de traitement est resté pratiquement le même quelle que soit l'augmentation de la mémoire, mais le coût a augmenté à mesure que la taille de la mémoire augmentait.

Un autre test a examiné la plage comprise entre 1 536 Mo et 3 072 Mo de mémoire, en utilisant des valeurs multiples de 256 Mo et en traitant 10 000 lectures d'objets, avec les résultats suivants.

![\[Diminution de la différence entre la diminution du temps d'invocation et l'augmentation du coût de l'invocation.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/c75d4443-74d8-4b93-9b4d-b2640869381e.png)


Le meilleur performance-to-cost ratio a été obtenu avec la configuration Lambda de 2 304 Mo de mémoire.

À titre de comparaison, un processus séquentiel de 2 500 lectures d'objets a pris 47 secondes. Le processus parallèle utilisant la configuration Lambda de 2 304 Mo a pris 7 secondes, soit 85 % de moins.

![\[Graphique illustrant la diminution du temps lors du passage du traitement séquentiel au traitement parallèle.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f3dcc44d-ac20-4b75-897d-1d71f0d59781.png)
