Le transfert multipart avec Amazon S3 (Amazon Simple Storage Service) est une fonctionnalité qui permet de télécharger de gros objets (fichiers) vers Amazon Simple Storage Service (S3) en plusieurs parties, ou "chunks", et ensuite de les assembler côté serveur pour créer l'objet complet.

 

Ce processus offre plusieurs avantages par rapport aux téléchargements traditionnels en une seule partie : 

  • Résilience : les téléversements multiparties sont plus robustes car ils réduisent les risques.
  • Performance : les téléversements multiparties permettent la parallélisation du transfert de données, améliorant ainsi la vitesse de téléversement globale, surtout pour les gros fichiers.
  • Pause and reprise : nous pouvons mettre en pause et reprendre les téléversements multiparties, ce qui est utile lorsqu'on rencontre des connexions réseau instables, ou lorsque le téléversement prend une période prolongée.
  • Utilisation optimisée de la mémoire : les téléversements multiparties permettent le téléversement de parties indépendantes, réduisant ainsi la quantité de mémoire nécessaire côté client pour manipuler de gros fichiers.
  • Streaming d'objets : cela permet le streaming de données directement depuis la source vers S3 sans avoir besoin de stocker l'ensemble de l'objet en mémoire.

 

Pour initier un téléversement multipartie, nous devons créer une nouvelle demande de téléversement multipartie avec l'API S3, puis téléverser des parties individuelles de l'objet dans des appels d'API séparés, chacun identifié par un numéro de partie unique.

 

Une fois que toutes les parties sont téléversées, le téléversement multipartie est terminé et S3 assemblera les parties pour former l'objet final. De plus, vous pouvez annuler un téléversement multipartie à tout moment pour nettoyer les parties téléversées et économiser sur les coûts de stockage.

 

Les téléversements multiparties sont couramment utilisés lors du traitement de fichiers 

généralement plus grands que 100 Mo ou lorsque des conditions réseau instables pendant le processus de téléversement sont prévues.

 

Cet article vise à illustrer de manière détaillée et pratique les avantages des téléversements multiparties AWS S3 en fournissant une implémentation utilisant Dropzone.js et le framework Flask de Python en conjonction avec le SDK Python boto3 d'AWS S3.

 

 

Le côté serveur

Pour des raisons de sécurité, les requêtes vers S3 sont proxifiées via une API Flask Restful. Commençons par créer et configurer l'application Flask :

 

Amazon S3_1

 

Ensuite, nous allons créer trois points d'extrémité Flask pour les fonctionnalités suivantes :

  • Initialiser le téléversement multipartie S3 et récupérer l'ID de téléversement
  • Téléverser les parties du fichier, ou l'ensemble des fichiers lorsque leur taille n'est pas suffisamment grande pour être fractionnée.
  • Terminer le téléversement

Point de terminaison pour l'initialisation du téléversement multipartie


L'implémentation du point de terminaison ci-dessous démarre un téléversement multipartie vers le compartiment S3 spécifié et la clé d'objet en utilisant le SDK Boto3.

 

La fonction "create_multipart_upload" est appelée pour créer un nouveau téléversement multipartie, et l' "UploadId" retourné par l'API est inclus dans la réponse.

 

Amazon S3_2

 

Point de terminaison pour le téléversement de fichiers

Ce point de terminaison reçoit un fichier, ou une partie de fichier, sous forme de données binaires ainsi que la clé d'objet S3, l'ID de téléversement (obtenu à partir de la méthode "create_multipart_upload"), le numéro de partie (numéro unique pour chaque partie commençant par 1), et un indicateur qui indique si le téléversement concerne une partie de fichier ou un fichier entier.

 

La partie est téléversée vers S3 en utilisant la méthode "upload_part". Ci-dessous, vous pouvez trouver le code source pour ce point de terminaison :

 

Amazon S3_3

 

 

Point de terminaison pour terminer le téléversement multipartie

Une fois que toutes les parties de fichier sont téléversées avec succès, ce point de terminaison est appelé pour terminer le téléversement multipartie. Mais d'abord, nous devons avoir un téléversement multipartie en cours et toutes les informations nécessaires sur les parties déjà téléversées, telles que l'ETag (une empreinte MD5 représentant les données de la partie) et les numéros de partie.

 

Pour obtenir ces données sur les parties qui ont déjà été téléversées pour un téléversement multipartie donné, nous appelons la méthode "list_parts" qui récupère une liste de dictionnaires, chacun représentant une partie téléversée, contenant des détails tels que le numéro de partie et l'ETag.

 

Une fois que nous avons toutes les informations sur les parties, la méthode 

"complete_multipart_upload" est appelée pour que S3 assemble toutes les parties en un objet final et le rende disponible dans notre compartiment.

 

Voici une implémentation du point de terminaison :

 

Amazon S3_4

 

Le côté Front-End

Pour implémenter le côté front-end web, nous utiliserons Dropzone.js, qui est une bibliothèque JavaScript open-source largement populaire fournissant une manière élégante et flexible d'implémenter des téléversements de fichiers avec une fonctionnalité de glisser-déposer. Elle simplifie le processus de gestion des téléversements de fichiers en fournissant une interface conviviale prête à l'emploi, et elle gère diverses tâches liées au téléversement, telles que la validation des fichiers, la fragmentation des gros fichiers et le support pour les téléversements de plusieurs fichiers.

 

Commençons par configurer Dropzone.js en l'incluant dans le fichier HTML. Nous pouvons soit télécharger la bibliothèque et la référencer localement, soit utiliser un lien CDN. De plus, un élément HTML doit être créé pour servir de zone de dépôt (dropzone), où les utilisateurs peuvent faire glisser et déposer des fichiers :

 

Amazon S3_5

 

La prochaine étape est la configuration de Dropzone.js :

 

Amazon S3_6

 

Dans l'extrait de code ci-dessus, une constante pour la taille des fragments sera utilisée par Dropzone pour diviser les fichiers en parties de 5 MiB ou fragments. Notez que la taille est en mébibytes et non en mégaoctets. Un mébibyte est légèrement plus grand qu'un mégaoctet et 5 MiB est la taille de partie minimale prise en charge par les téléversements multiparties d'AWS S3.

Dropzone fractionnera tous les fichiers égaux ou plus grands que la valeur de "chunkSize".

 

Pour accélérer les téléversements de fichiers, la parallélisation des téléversements de parties est activée. Et pour rendre nos téléversements multiparties plus résilients, les réessais ont été activés pour les téléversements de parties qui pourraient échouer.

 

Le traitement automatique des fichiers mis en file d'attente a été désactivé car nous devons nous assurer que tous les fichiers mis en file d'attente reçoivent leur ID de téléversement multipartie AWS S3, avant que Dropzone ne commence à traiter les fichiers dans la file d'attente. Sinon, il y a un risque que certains téléversements de parties de fichiers échouent en raison de l'absence d'ID de téléversement. Ces IDs sont stockés dans la carte "uploadIdsMap".

 

Remarque : Assurez-vous de différer l'initialisation de Dropzone jusqu'à ce que la page soit chargée. Cela peut être réalisé avec, par exemple, une expression de fonction immédiatement invoquée.

 

Étant donné que nous avons besoin que Dropzone envoie des paramètres personnalisés dans chaque demande de téléversement, par exemple, l'ID de téléversement multipartie et la clé S3 du fichier en cours de téléversement, entre autres données, nous devons remplacer l'option "params" de Dropzone comme indiqué ci-dessous :

 

Amazon S3_7

 

Pour créer la clé d'objet S3 pour le fichier téléversé, la fonction suivante est utilisée :

 

Amazon S3_8

 

Finalement, nous devons gérer les événements suivants de Dropzone :

  • Sur la file d'attente de fichier (addedFile) : pour chaque fichier mis en file d'attente, un ID de téléversement multipartie AWS S3 est récupéré depuis le backend proxy en appelant le point d'extrémité "GET api/file/upload-id". L'ID de téléversement du fichier est stocké dans la "uploadIdsMap" pour être ensuite envoyé par Dropzone dans chaque demande de téléversement de fragment de fichier à notre backend. Dans ce gestionnaire d'événements, nous attendons que tous les fichiers mis en file d'attente soient téléversés ;
  • Sur la réussite du téléversement du fichier (success) : lorsque un téléversement fragmenté est terminé avec succès, nous devons terminer le téléversement multipartie en appelant le point d'extrémité REST correspondant : "PUT /api/file/chunks/complete" ;
  • Sur la complétion du téléversement du fichier (complete) : indépendamment de la réussite ou de l'échec du téléversement du fichier, nous devons vérifier s'il reste des fichiers en file d'attente et le cas échéant, nous devons traiter explicitement la file d'attente afin que le prochain lot de fichiers, de taille égale à l'option "parallelUploads", soit traité.

Ci-dessous, vous pouvez trouver des extraits de code qui mettent en œuvre les gestionnaires d'événements de Dropzone décrits ci-dessus, ainsi que d'autres fonctions auxiliaires utilisées dans ces gestionnaires.

 

Amazon S3_9

 

Amazon S3_10

 

Conclusion

Les téléversements multiparties d'AWS S3 sont une fonctionnalité puissante qui améliore les performances, la fiabilité et la flexibilité du téléversement de gros objets vers Amazon S3. En divisant les objets en parties plus petites, les développeurs peuvent tirer parti des téléversements parallèles et des capacités de reprise, ce qui permet des téléversements plus rapides et plus fiables.

 

Que vous travailliez sur une application à forte intensité de données, un stockage multimédia ou un système de diffusion de contenu, comprendre et mettre en œuvre les téléversements multiparties peut améliorer considérablement vos flux de travail de gestion des données S3, en en faisant un outil essentiel dans l'arsenal des services cloud AWS.

Partager cet article