Chargement et copie d’objets à l’aide du chargement partitionné dans Amazon S3 - Amazon Simple Storage Service

Chargement et copie d’objets à l’aide du chargement partitionné dans Amazon S3

Le chargement partitionné vous permet de charger un seul objet dans Amazon S3 en plusieurs parties. Chaque partie est une portion contiguë des données de l’objet. Vous pouvez charger ces parties d’objet indépendamment et dans n’importe quel ordre. Pour les chargements, votre client AWS mis à jour calcule automatiquement la somme de contrôle de l’objet et l’envoie à Amazon S3 avec la taille de l’objet dans le cadre de la demande. Si le transfert d’une partie échoue, vous pouvez la retransférer sans affecter les autres. Une fois que toutes les parties de l’objet sont chargées, Amazon S3 les assemble pour créer cet objet. Il est recommandé d’utiliser le chargement partitionné pour les objets d’au moins 100 Mo au lieu de les charger en une seule opération.

L’utilisation du chargement partitionné offre les avantages suivants :

  • Meilleur débit : vous pouvez charger des parties en parallèle pour améliorer le débit.

  • Récupération rapide après des problèmes réseau : la taille réduite des parties minimise l’impact du redémarrage d’un chargement qui a échoué en raison d’une erreur de réseau.

  • Pause and resume object uploads (Interruption et reprise des chargements d’objet) — vous pouvez charger des parties d’objet au fil du temps. Après le lancement d’un chargement partitionné, il n’y a aucune date d’expiration ; vous devez explicitement le terminer ou l’arrêter.

  • Lancement d’un chargement avant de connaître la taille finale de l’objet : vous pouvez charger un objet à mesure que vous le créez.

Nous vous recommandons d’utiliser le chargement partitionné comme suit :

  • Si vous chargez des objets volumineux sur un réseau stable à large bande passante, utilisez le chargement partitionné pour optimiser l’utilisation de la bande passante disponible en chargeant plusieurs parties d’objet en parallèle pour bénéficier de performances multithreads.

  • Si vous effectuez le chargement sur un réseau irrégulier, utilisez le chargement partitionné pour augmenter la résilience aux erreurs réseau en évitant les redémarrages du chargement. Lorsque vous utilisez le chargement partitionné, vous n’avez besoin de relancer le chargement que pour les parties d’objet dont le chargement a été interrompu. Vous n’avez pas besoin de redémarrer le chargement de vos objets depuis le début.

Note

Pour plus d’informations sur l’utilisation de la classe de stockage Amazon S3 Express One Zone avec des compartiments de répertoires, consultez S3 Express One Zone et Utilisation des compartiments de répertoires. Pour plus d’informations sur l’utilisation du chargement partitionné avec S3 Express One Zone et les compartiments de répertoires, consultez Utilisation du chargement partitionné avec les compartiments de répertoires.

Processus de chargement partitionné

Le chargement partitionné est un processus en trois étapes : vous lancez le chargement, vous chargez les parties de l’objet, et une fois toutes les parties chargées, vous terminez le chargement partitionné. Dès réception de la demande de fin de chargement partitionné, Amazon S3 crée l’objet à partir des parties chargées pour que vous puissiez y accéder comme vous le feriez avec n’importe quel autre objet du compartiment.

Vous pouvez lister tous vos chargements partitionnés en cours ou obtenir une liste des parties que vous avez chargées pour un chargement partitionné spécifique. Chacune de ces opérations est expliquée dans cette section.

Lancement du chargement partitionné

Lorsque vous envoyez une demande pour lancer un chargement partitionné, veillez à spécifier un type de somme de contrôle. Amazon S3 renvoie une réponse avec un ID de chargement, qui est un identifiant unique pour le chargement partitionné. Cet ID de chargement est obligatoire lorsque vous chargez les parties, lorsque vous en affichez la liste, lorsque vous terminez un chargement ou lorsque vous arrêtez un chargement. Si vous souhaitez fournir des métadonnées qui décrivent l’objet en cours de chargement, procédez dans la demande de lancement du chargement partitionné.

Chargement de parties

Lorsque vous chargez une partie, outre l’ID de chargement, vous devez spécifier un numéro de partie. Vous pouvez choisir n’importe quel numéro de partie compris entre 1 et 10 000. Un numéro de partie identifie de manière unique une partie et sa place dans l’objet que vous chargez. Le numéro de partie que vous choisissez ne doit pas obligatoirement constituer une séquence consécutive (par exemple, cela peut être 1, 5 et 14). Sachez que si vous chargez une nouvelle partie avec le même numéro qu’une partie précédemment chargée, cette dernière sera écrasée.

Lorsque vous chargez une partie, Amazon S3 renvoie le type d’algorithme de la somme de contrôle avec la valeur de la somme de contrôle pour chaque partie chargée sous forme d’en-tête dans la réponse. Pour chaque chargement de partie, vous devez enregistrer le numéro de partie et la valeur ETag. Vous devez inclure ces valeurs dans la demande ultérieure pour terminer le chargement partitionné. Chaque partie a sa propre balise d’entité au moment du chargement. Cependant, une fois que le chargement partitionné est terminé et que toutes les parties sont consolidées, toutes les parties appartiennent à une seule balise d’entité sous forme de somme de contrôle des sommes de contrôle.

Important

Après avoir lancé un chargement partitionné et après avoir chargé une ou plusieurs parties, vous devez finaliser ou arrêter le chargement partitionné afin que le stockage des parties chargées cesse de vous être facturé. Ce n’est qu’après la fin ou l’arrêt d’un chargement partitionné qu’Amazon S3 libère le stockage des parties et cesse de vous le facturer.

Après avoir arrêté un chargement partitionné, vous ne pouvez plus charger de partie avec le même ID de chargement. Si des chargements de partie étaient en cours, ils peuvent encore aboutir ou échouer, même après un arrêt du chargement. Pour être sûr de libérer tout le stockage consommé par toutes les parties, n’arrêtez le chargement partitionné qu’après l’aboutissement de tous les chargements partiels.

Fin du chargement partitionné

Lorsque vous terminez un chargement partitionné, Amazon S3 crée un objet en concaténant les parties par ordre croissant en fonction des numéros de partie. Si des métadonnées d’objet sont fournies dans la demande de lancement du chargement partitionné, Amazon S3 les associe à l’objet. À l’issue d’une demande de chargement complet, les parties n’existent plus.

La demande de finalisation du chargement partitionné doit inclure l’ID de chargement et une liste des numéros de chaque partie et des valeurs de balise d’entité correspondantes. La réponse d’Amazon S3 inclut une valeur ETag qui identifie de façon unique les données d’objet combinées. Cet ETag n’est pas nécessairement un hachage MD5 des données d’objet.

Lorsque vous fournissez la somme de contrôle d’un objet entier lors d’un chargement partitionné, le kit SDK AWS transmet cette somme de contrôle à Amazon S3, puis S3 valide l’intégrité de l’objet côté serveur, en la comparant à la valeur reçue. S3 stocke ensuite l’objet si les valeurs correspondent. Si les deux valeurs ne correspondent pas, Amazon S3 fait échouer la demande et génère une erreur BadDigest. La somme de contrôle de votre objet est également stockée dans les métadonnées d’objet que vous utiliserez ultérieurement pour valider l’intégrité des données d’un objet.

Exemples d’appels de chargement partitionné

Pour cet exemple, supposons que vous génériez un chargement partitionné pour un fichier de 100 Go. Dans ce cas, vous recevez les appels d’API suivants pour l’ensemble du processus. Il y a un total de 1 002 appels d’API.

Listes de chargement partitionné

Vous pouvez lister les parties d’un chargement partitionné spécifique ou de tous les chargements partitionnés en cours. L’opération d’affichage de la liste des parties renvoie des informations sur les parties que vous avez chargées pour un chargement partitionné spécifique. Pour chaque demande de liste des parties, Amazon S3 renvoie des informations sur les parties pour le chargement partitionné spécifié, pour 1 000 parties maximum. S’il y a plus de 1 000 parties dans le chargement partitionné, vous devez envoyer une série de demandes d’affichage des différentes parties chargées pour récupérer toutes les parties. Notez que la liste des parties retournée n’inclut pas les parties qui n’ont pas fini d’être chargées. En utilisant l’opération d’affichage des chargements partitionnés, vous pouvez obtenir la liste des chargements partitionnés qui sont en cours.

Un chargement partitionné en cours est un chargement que vous avez lancé, mais que vous n’avez pas encore terminé ou arrêté. Chaque demande renvoie 1 000 chargements partitionnés maximum. S’il y a plus de 1 000 chargements partitionnés en cours, vous devez envoyer des demandes supplémentaires pour récupérer les chargements partitionnés restants. Utilisez la liste renvoyée uniquement pour la vérification.

Important

N’utilisez pas le résultat de la liste lorsque vous envoyez une requête de chargement partitionné complet. Au lieu de cela, conservez votre propre liste des numéros de parties que vous avez spécifiés lors du chargement des parties ainsi que les valeurs ETag correspondantes renvoyées par Amazon S3.

Totaux de contrôle avec les opérations de chargement partitionné

Lorsque vous chargez un objet sur Simple Storage Service (Amazon S3), vous pouvez spécifier un algorithme de total de contrôle à utiliser par Amazon S3. Par défaut, le kit SDK AWS et la console S3 utilisent un algorithme pour tous les chargements d’objets. Vous pouvez le remplacer. Si vous utilisez un ancien kit SDK et que votre objet chargé ne possède pas de somme de contrôle spécifiée, Amazon S3 utilise automatiquement l’algorithme de somme de contrôle CRC-64NVME. Il s’agit également de l’option recommandée pour une vérification efficace de l’intégrité des données. Si vous utilisez CRC-64NVME, Amazon S3 calcule la somme de contrôle de l’objet entier une fois que le chargement en une seule partie ou le chargement partitionné est terminé. L’algorithme de somme de contrôle CRC-64NVME est utilisé pour calculer soit une somme de contrôle directe pour l’objet entier, soit une somme de contrôle des sommes de contrôle pour chaque partie individuelle.

Une fois que vous avez chargé un objet dans S3 à l’aide d’un chargement partitionné, Amazon S3 calcule la somme de contrôle pour chaque partie chargée ou pour l’objet entier et stocke les valeurs. Vous pouvez utiliser l’API ou le kit SDK AWS S3 pour récupérer la valeur de la somme de contrôle de la manière suivante :

  • Pour les parties individuelles, vous pouvez utiliser GetObject ou HeadObject. Pour récupérer les valeurs des sommes de contrôle pour chaque partie des chargements partitionnés toujours en cours, vous pouvez utiliser ListParts.

  • Pour l’ensemble de l’objet, vous pouvez utiliser PutObject. Si vous souhaitez effectuer un chargement partitionné avec la somme de contrôle d’un objet complet, utilisez CreateMultipartUpload et CompleteMultipartUpload en spécifiant le type de somme de contrôle de l’objet entier. Pour valider la valeur de la somme de contrôle de l’objet entier ou pour confirmer le type de somme de contrôle utilisé dans le chargement partitionné, utilisez ListParts.

Important

Si vous utilisez un chargement partitionné avec des sommes de contrôle, les numéros de chaque partie du chargement partitionné doivent être consécutifs. Lorsque vous utilisez des sommes de contrôle, si vous essayez de finaliser une demande de chargement partitionné avec des numéros de parties non consécutifs, Amazon S3 génère une erreur HTTP 500 Internal Server.

Pour plus d’informations sur le fonctionnement des sommes de contrôle avec les objets d’un chargement partitionné, consultez Vérification de l’intégrité des objets dans Amazon S3.

Pour obtenir une procédure complète présentant comment charger un objet à l’aide du chargement partitionné avec une somme de contrôle supplémentaire, consultez Didacticiel : chargement partitionné d’un objet et vérification de l’intégrité de ses données.

Opérations simultanées de chargement partitionné

Dans un environnement de développement distribué, il est possible pour l’application de lancer plusieurs mises à jour sur le même objet en même temps. L’application doit lancer plusieurs chargements partitionnés grâce à la même clé d’objet. Pour chacun de ces chargements, l’application peut ensuite charger des parties et envoyer une demande de chargement complet à Amazon S3 pour créer l’objet. Lorsque les compartiments sont activés pour la gestion des versions S3, un chargement partitionné terminé crée toujours une nouvelle version. Lorsque vous lancez plusieurs chargements partitionnés qui utilisent la même clé d’objet dans un compartiment activé pour la gestion des versions, la version actuelle de l’objet est déterminée par le chargement le plus récent (createdDate).

Par exemple, vous lancez une demande CreateMultipartUpload pour un objet à 10 h. Ensuite, vous soumettez une deuxième demande CreateMultipartUpload pour le même objet à 11 h. Comme la deuxième demande a été soumise le plus récemment, l’objet chargé par la demande de 11 h devient la version actuelle, même si le premier chargement se termine après le second. Pour les compartiments pour lesquels la gestion des versions n’a pas été activée, il est possible que d’autres demandes reçues entre le début et la fin d’un chargement partitionné priment.

Un autre exemple de cas où une demande de chargement partitionné simultané peut être prioritaire est le cas d’une autre opération supprimant une clé après que vous avez lancé un chargement partitionné avec cette même clé. Avant que vous ne finalisiez l’opération, la réponse de finalisation du chargement partitionné peut indiquer une création d’objet réussie sans que vous n’ayez jamais vu l’objet.

Empêcher le chargement d’objets portant des noms de clé identiques lors du chargement partitionné

Vous pouvez vérifier l’existence d’un objet dans un compartiment avant de le créer à l’aide d’une écriture conditionnelle lors des opérations de chargement. Cela permet d’éviter l’écrasement de données existantes. Les écritures conditionnelles valident qu’aucun objet portant le même nom de clé ne se trouve déjà dans votre compartiment lors du chargement.

Vous pouvez utiliser des écritures conditionnelles pour les demandes PutObject ou CompleteMultipartUpload.

Pour plus d’informations sur les demandes conditionnelles, consultez Ajout de conditions préalables aux opérations S3 avec des demandes conditionnelles.

Chargement partitionné et tarification

Lorsque vous lancez un chargement partitionné, Amazon S3 conserve toutes les parties jusqu’à ce que vous terminiez ou arrêtiez le chargement. Tout au long de sa durée de vie, le stockage, la bande passante et les demandes pour ce chargement partitionné ainsi que ses parties associées vous sont facturés.

Ces parties sont facturées en fonction de la classe de stockage spécifiée lors du chargement des parties. Toutefois, ces parties ne vous seront pas facturées si elles sont chargées dans S3 Glacier Flexible Retrieval ou S3 Glacier Deep Archive. Les parties multipartites en cours d’exécution d’une commande PUT vers la classe de stockage S3 Glacier Flexible Retrieval sont facturées en tant que stockage de transit S3 Glacier Flexible Retrieval aux tarifs de stockage S3 Standard jusqu’à ce que le chargement soit terminé. De plus, CreateMultipartUpload et UploadPart sont tous deux facturés aux tarifs S3 Standard. Seule la demande CompleteMultipartUpload est facturée au tarif S3 Glacier Flexible Retrieval. De même, les parties multipartites en cours d’exécution d’une commande PUT vers la classe de stockage S3 Glacier Deep Archive sont facturées en tant que stockage de transit S3 Glacier Flexible Retrieval aux tarifs de stockage standard S3 jusqu’à ce que le chargement soit terminé. Seule la demande CompleteMultipartUpload est facturée aux tarifs S3 Glacier Deep Archive.

Si vous arrêtez le chargement partitionné, Amazon S3 supprime les artefacts et toutes les parties que vous avez chargées. Ces artefacts ne vous seront pas facturés. Aucuns frais de suppression anticipée ne sont facturés pour la suppression de chargements partitionnés incomplets, quelle que soit la classe de stockage spécifiée. Pour plus d’informations sur la tarification, consultez Tarification Amazon S3.

Note

Pour réduire vos coûts de stockage, nous vous recommandons de configurer une règle du cycle de vie pour supprimer les chargements partitionnés incomplets après un certain nombre de jours à l’aide de l’action AbortIncompleteMultipartUpload. Pour plus d’informations sur la création d’une règle de cycle de vie pour supprimer les chargements partitionnés incomplets, consultez Configuration d’une politique de cycle de vie de compartiment pour abandonner les chargements multiparties incomplets.

Prise en charge de l’API pour le chargement partitionné

Les sections suivantes de la Référence de l’API Amazon Simple Storage Service décrivent l’API REST pour le chargement partitionné.

Pour une procédure détaillée du chargement partitionné utilisant les fonctions AWS Lambda, consultez Chargement d’objets volumineux sur Amazon S3 à l’aide du chargement partitionné et de l’accélération du transfert.

Prise en charge d’AWS Command Line Interface pour le chargement partitionné

Les rubriques suivantes d’AWS Command Line Interface décrivent les opérations pour le chargement partitionné.

Prise en charge des kits AWS SDK pour le chargement partitionné

Vous pouvez utiliser un kit AWS SDK pour charger un objet en plusieurs parties. Pour obtenir la liste des kits AWS SDK pris en charge par une action d’API, consultez :

API de chargement partitionné et autorisations

Vous devez posséder les autorisations nécessaires pour utiliser les opérations de chargement partitionné. Vous pouvez utiliser les listes ACL, la politique de compartiment ou la stratégie d’utilisateur pour autoriser des individus à exécuter ces opérations. Le tableau suivant liste les autorisations nécessaires pour les différentes opérations de chargement partitionné si vous utilisez des listes ACL, une politique de compartiment ou une stratégie d’utilisateur.

Action Autorisations requises

Création d’un chargement partitionné

Vous devez être autorisé à exécuter l’action s3:PutObject sur un objet pour pouvoir créer un chargement partitionné.

Le propriétaire du compartiment peut autoriser d’autres personnes habilitées à exécuter l’action s3:PutObject.

Lancement du chargement partitionné

Vous devez être autorisé à exécuter l’action s3:PutObject sur un objet pour pouvoir lancer le chargement partitionné.

Le propriétaire du compartiment peut autoriser d’autres personnes habilitées à exécuter l’action s3:PutObject.

Initiateur

Elément du conteneur qui identifie l’initiateur du chargement partitionné. Si l’initiateur est un Compte AWS, cet élément fournit les mêmes informations que l’élément Propriétaire. Si l’initiateur est un utilisateur IAM, cet élément fournit l’ARN utilisateur et le nom complet.

Chargement d’une partie

Vous devez être autorisé à exécuter l’action s3:PutObject sur un objet pour charger une partie.

Le propriétaire du compartiment doit autoriser l’initiateur à exécuter l’action s3:PutObject sur un objet pour que ce dernier charge une partie pour cet objet.

Chargement d’une partie (Copy)

Vous devez être autorisé à exécuter l’action s3:PutObject sur un objet pour charger une partie. Sachant que vous chargez une partie d’un objet existant, vous devez être autorisé à exécuter l’action s3:GetObject sur l’objet source.

Pour que l’initiateur puisse charger une partie pour un objet, le propriétaire du compartiment doit l’autoriser à effectuer l’action s3:PutObject sur l’objet.

Achèvement du chargement partitionné

Vous devez être autorisé à exécuter l’action s3:PutObject sur un objet pour terminer le chargement partitionné.

Le propriétaire du compartiment doit autoriser l’initiateur à exécuter l’action s3:PutObject sur un objet pour que ce dernier termine un chargement partitionné pour cet objet.

Arrêt du chargement partitionné

Vous devez être autorisé à exécuter l’action s3:AbortMultipartUpload pour arrêter un chargement partitionné.

Par défaut, le propriétaire du compartiment et l’initiateur du chargement partitionné sont autorisés à exécuter cette action dans le cadre des politiques IAM et de compartiment S3. Si l’initiateur est un utilisateur IAM, le Compte AWS de ce dernier est également autorisé à arrêter ce chargement partitionné. Dans le cadre des politiques de point de terminaison de VPC, l’initiateur du chargement partitionné n’a pas automatiquement l’autorisation d’effectuer l’action s3:AbortMultipartUpload.

Outre ces paramètres par défaut, le propriétaire du compartiment peut autoriser d’autres principaux à être habilité à exécuter l’action s3:AbortMultipartUpload sur un objet. Le propriétaire du compartiment peut refuser que tout principal soit habilité à exécuter l’action s3:AbortMultipartUpload.

Liste des parties

Vous devez être autorisé à exécuter l’action s3:ListMultipartUploadParts sur un objet pour lister les parties lors d’un chargement partitionné.

Par défaut, le propriétaire du compartiment est autorisé à lister les parties pour tout chargement partitionné dans le compartiment. L’initiateur du chargement partitionné est autorisé à lister les parties du chargement partitionné spécifique. Si l’initiateur du chargement partitionné est un utilisateur IAM, le Compte AWS qui contrôle cet utilisateur IAM est également autorisé à lister les parties de ce chargement.

Outre ces paramètres par défaut, le propriétaire du compartiment peut autoriser d’autres principaux à être habilité à exécuter l’action s3:ListMultipartUploadParts sur un objet. Le propriétaire du compartiment peut également refuser que tout principal soit habilité à exécuter l’action s3:ListMultipartUploadParts.

Liste des chargements partitionnés

Vous devez être autorisé à exécuter l’action s3:ListBucketMultipartUploads sur un compartiment pour lister les chargements partitionnés en cours dans ce compartiment.

Outre ces paramètres par défaut, le propriétaire du compartiment peut autoriser d’autres personnes habilitées à exécuter l’action s3:ListBucketMultipartUploads sur le compartiment.

AWS KMS Autorisations liées au chiffrement et au déchiffrement

Pour effectuer un chargement partitionné avec un chiffrement à l’aide d’une clé KMS AWS Key Management Service (AWS KMS), le demandeur doit avoir les autorisations suivantes :

Ces autorisations sont requises, car Simple Storage Service (Amazon S3) doit déchiffrer et lire les données des parties de fichier chiffrées avant de terminer le chargement partitionné. L’autorisation kms:Decrypt et le chiffrement côté serveur avec les clés de chiffrement fournies par le client sont également nécessaires pour obtenir la valeur de la somme de contrôle d’un objet. Si vous ne disposez pas des autorisations requises lorsque vous utilisez l’API CompleteMultipartUpload, l’objet sera créé sans valeur de somme de contrôle.

Si votre utilisateur ou rôle IAM est dans le même Compte AWS que la clé KMS, vous devez disposer de ces autorisations sur la politique de clé. Si votre utilisateur ou rôle IAM appartient à un autre compte que la clé KMS, vous devez disposer des autorisations sur la politique de clé et votre utilisateur ou rôle IAM.

SSE-C (chiffrement côté serveur à l’aide des clés de chiffrement fournies par le client)

Lorsque vous utilisez l’API CompleteMultipartUpload, vous devez fournir un chiffrement côté serveur avec des clés de chiffrement fournies par le client (SSE-C). Dans le cas contraire, l’objet sera créé sans somme de contrôle et aucune valeur de somme de contrôle ne sera renvoyée.

Pour en savoir plus sur la relation entre les autorisations de liste ACL et les autorisations des politiques d’accès, consultez Mappage des autorisations de liste ACL et de stratégie d’accès. Pour obtenir plus d’informations sur les utilisateurs IAM, les rôles et les bonnes pratiques, consultez Identités IAM (utilisateurs, groupes d’utilisateurs et rôles) dans le Guide de l’utilisateur IAM.

Totaux de contrôle avec les opérations de chargement partitionné

Trois API Amazon S3 sont utilisées pour effectuer le chargement partitionné : CreateMultipartUpload, UploadPart et CompleteMultipartUpload. Le tableau suivant indique les en-têtes et les valeurs de somme de contrôle qui doivent être fournis pour chacune des API :

Algorithme de somme de contrôle Type de somme de contrôle CreateMultipartUpload UploadPart CompleteMultipartUpoad

CRC-64NVME

Objet complet En-têtes obligatoires :

x-amz-checsum-algorithm

En-têtes facultatifs :

x-amz-checksum-CRC64nvme

En-têtes facultatifs :

x-amz-checksum-algorithm

x-amz-crc64

CRC-32

CRC-32C

Objet complet

En-têtes obligatoires :

x-amz-checksum-algorithm

x-amz-checksum-type

En-têtes facultatifs :

x-amz-checksum-crc64nvme

En-têtes facultatifs :

x-amz-checksum-algorithm

x-amz-crc32

x-amz-crc32c

CRC-32

CRC-32C

SHA-1

SHA-256

Composite

En-têtes obligatoires :

x-amz-checksum-algorithm

En-têtes obligatoires :

x-amz-checksum-crc32

x-amz-checksum-crc32c

x-amz-checksum-sha1

x-amz-checksum-sha256

En-têtes obligatoires :

Toutes les sommes de contrôle au niveau de chaque partie doivent être incluses dans la demande CompleteMultiPartUpload.

En-têtes facultatifs :

x-amz-crc32

x-amz-crc32c

x-amz-sha1

x-amz-sha256