Satya vous montre comment
effectuer un chargement de
message partitionné dans S3

Satya_s3-multipart-upload-cli-1

Je veux copier un fichier volumineux (plus de 100 Mo) vers un compartiment Amazon Simple Storage Service (Amazon S3) en plusieurs parties. Je veux également vérifier l'intégrité du fichier une fois les parties téléchargées et le fichier d'origine recréé. Comment procéder avec l'interface de ligne de commande AWS ?

Le chargement d'un fichier sur Amazon S3 en plusieurs parties permet d'améliorer les vitesses de chargement en utilisant plusieurs threads pour charger les différentes parties du fichier en parallèle. Un autre avantage est que si le chargement d'une ou plusieurs parties échoue, vous n'avez besoin de télécharger à nouveau que les parties défaillantes et pas la totalité du fichier.

L'intégrité d'un chargement de message partitionné est vérifiée lors du lancement du téléchargement, par l'envoi des valeurs de total de contrôle MD5 base64 du fichier d'origine et des parties du fichier à Amazon S3. Ces valeurs de total de contrôle peuvent être utilisées pour vérifier l'intégrité du fichier ou de chacune de ses parties. Voici les étapes à suivre :

  1. Obtenez le total de contrôle MD5 base64 du fichier à charger.
  2. Fractionnez le fichier en plusieurs parties et obtenez le total de contrôle MD5 base64 de chaque partie du fichier.
  3. Lancez un téléchargement partitionné de message sur Amazon S3 et recevez une réponse comportant une valeur UploadId unique. Cette valeur associe le fichier d'origine à chaque partie de fichier.
  4. Chargez les parties du fichier sur Amazon S3 en indiquant la valeur UploadId et le total de contrôle MD5 base64 de chaque partie du fichier. Amazon S3 renvoie une valeur ETag distincte pour chaque partie du fichier.
  5. Une fois toutes les parties chargées, exécutez une commande pour terminer le processus de téléchargement partitionné. Cette commande inclut divers détails, notamment le compartiment de destination, la liste des parties du fichier et d'autres informations. Amazon S3 utilise ces informations pour recréer le fichier d'origine et vérifier son intégrité.

Suivez les étapes ci-dessous à l'aide de l'interface de ligne de commande (CLI) AWS pour effectuer le téléchargement partitionné d'un fichier dans un compartiment Amazon S3.

Remarque : l'interface CLI AWS est accessible depuis divers interpréteurs de commandes s'exécutant sur plusieurs systèmes d'exploitation. Les interpréteurs de commandes utilisent souvent des règles syntaxiques différentes pour accepter les valeurs des paramètres. Par exemple, certains interpréteurs de commandes traitent le texte entre guillemets, tandis que d'autres acceptent uniquement le texte entre apostrophes. Les exemples de données d'entrée et de sortie de ce document ont été créés en exécutant l'interface CLI AWS à partir d'une invite de commande Windows. Linux, MacOS et Windows PowerShell utilisent une syntaxe différente. Pour en savoir plus, consultez Spécification de valeurs de paramètres pour l'interface de ligne de commande AWS.

Étape 1 : Obtention du total de contrôle MD5 base64 du fichier à charger

Sous Windows : téléchargez l'utilitaire File Checksum Integrity Verifier (FCIV) et extrayez son contenu dans un dossier. Ajoutez l'emplacement de ce dossier au chemin d'accès système Windows. Pour ce faire, exécutez la commande suivante à partir d'une invite de commande avec élévation de privilèges (Exécuter en tant qu'administrateur) en remplaçant c:\fciv par le dossier qui contient les fichiers extraits de l'utilitaire FCIV :

C:>set path=%path%;c:\\fciv

Remarque : lorsque vous modifiez le chemin d'accès système Windows à partir d'une invite de commande, la modification n'est pas conservée au redémarrage de Windows. Pour modifier la variable d'environnement du chemin d'accès système Windows de façon permanente, consultez la documentation Windows ou recherchez sur Internet « Modifier la variable de chemin d'accès sous Windows X » en remplaçant X par votre version de Windows.

Après avoir installé l'utilitaire FCIV et mis à jour la variable d'environnement %path% avec l'emplacement d'extraction des fichiers de cet utilitaire, exécutez la commande suivante pour renvoyer le total de contrôle MD5 hexadécimal du fichier à charger sur Amazon S3. Remplacez c:\S3\testfile par l'emplacement du fichier que vous chargez sur Amazon S3 :

fciv.exe c:\\S3\\testfile

Remarque : si le chemin d'accès au fichier contient des espaces, indiquez-le entre guillemets (").

La valeur renvoyée est similaire à la valeur suivante lors du calcul du total de contrôle MD5 du fichier C:\Windows\explorer.exe :

fciv C:\\Windows\\explorer.exe
//
// File Checksum Integrity Verifier version 2.05.
//
e1b0af69bfb6cbde9b53c55e4bf91992 c:\\windows\\explorer.exe

Important : le total de contrôle MD5 renvoyé par l'utilitaire FCIV est une valeur hexadécimale qui doit être convertie au format base64 pour pouvoir être utilisée comme total de contrôle pour le téléchargement de messages partitionné sur Amazon S3. Si vous utilisez un total de contrôle MD5 hexadécimal, vous recevez le message d'erreur « La valeur Content-MD5 spécifiée n'est pas valide ». Plusieurs décodeurs de chaînes hexadécimales vers base64 sont disponibles sur Internet. Vous pouvez également télécharger du code de script, comme le script VB HexToBase64. Vous pouvez trouver des exemples de fonctions de conversion de format hexadécimal en base64 à utiliser avec les feuilles de calcul si vous envisagez d'utiliser intensivement la fonctionnalité de chargement partitionné de messages sur Amazon S3. L'équivalent codé en base64 de la valeur hexadécimale renvoyée par l'utilitaire FCIV dans cet exemple est 4bCvab+2y96bU8VeS/kZkg==.

Sous Linux : Linux vous permet de calculer le total de contrôle MD5 base64 d'un fichier à l'aide de la commande openssl. Pour déterminer le total de contrôle MD5 base64 d'un fichier sous Linux, exécutez cette commande à partir d'un shell Linux :

openssl md5 -binary PATH/TO/FILE |base64 

La valeur renvoyée est similaire à la valeur suivante lors de l'extraction du total de contrôle MD5 base64 du fichier /bin/bash :

user@example:/home$ openssl md5 -binary /bin/bash |base64
+e9lnJtCrdoKwYqg9wlFwA==

Sous Windows : vous pouvez fractionner un fichier en plusieurs parties depuis Windows grâce aux utilitaires gratuits disponibles, tels que HJ-Split pour Windows. HJ-Split pour Windows fournit également une interface utilisateur permettant de calculer la valeur du total de contrôle MD5 hexadécimal de chaque partie du fichier. Etant donné que ces valeurs de total de contrôle sont hexadécimales, vous devez les convertir au format base64 avant de les utiliser pour effectuer un téléchargement partitionné de messages.

Sous Linux : Linux offre en mode natif la possibilité de fractionner un fichier à l'aide de la commande split et il peut également calculer le total de contrôle MD5 base64. Pour en savoir plus sur l'utilisation de la commande split de Linux, saisissez une ou plusieurs de ces commandes à partir du shell de commande Linux :

split --help - displays arguments for the split command
info split - displays general information about the split command
man split - displays the manual page for the split command

HJ-Split est également disponible pour Linux si vous souhaitez utiliser une interface utilisateur graphique.

Ce tableau indique les informations requises pour lancer le chargement d'un message partitionné.

Caractéristique

Paramètres et valeurs

Compartiment cible

--bucket targetBucket

Nom de fichier

--key testfile  --metadata md5=mvhFZXpr7J5u0ooXDoZ/4Q==

1re partie

--part-number 1  --body testfile.001 --content-md5 Vuoo2L6aAmjr+4sRXUwf0w==

2e partie

--part-number 2  --body testfile.002  --content-md5 317wIkbjGrgH2m9igCwa6A==

En utilisant les informations du tableau, vous pouvez exécuter la commande d'interface de ligne de commande AWS aws s3api create-multipart-upload pour récupérer la valeur UploadId unique qui associe le fichier d'origine aux différentes parties de fichier :

aws s3api create-multipart-upload --bucket multirecv --key testfile
--metadata md5= mvhFZXpr7J5u0ooXDoZ/4Q==

La réponse à cette commande contient la valeur UploadId qui est exigée à chaque fois qu'une partie du message est chargée :

}    "Key": "testfile"
    "Bucket": "multirecv",    
    "UploadId":"sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk",
{

Dans cet exemple, la commande permettant de charger la première partie du message indique le compartiment cible, le nom du fichier d'origine, la première partie du fichier, la valeur UploadId et le total de contrôle MD5 base64 de la première partie du fichier :

aws s3api upload-part --bucket multirecv --key testfile --part-number 1 --body testfile.001 --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 Vuoo2L6aAmjr+4sRXUwf0w==

La réponse à cette commande contient la valeur ETag associée à cette partie du message. Enregistrez cette valeur ETag afin de l'utiliser ultérieurement pour terminer le processus de téléchargement partitionné de messages :

{
    "ETag": "\\"56ea28d8be9a0268ebfb8b115d4c1fd3\\""
}

La commande permettant de charger la deuxième partie du message est similaire à quelques différences près : le numéro de partie (--part-number 2), le nom de la deuxième partie (--body testfile.002) et une valeur de total de contrôle MD5 différente :

aws s3api upload-part --bucket multirecv --key testfile --part-number 2 --body testfile.002 --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 317wIkbjGrgH2m9igCwa6A==

La commande de chargement de la deuxième partie du message renvoie une autre valeur ETag :

{
    "ETag": "\\"df5ef02246e31ab807da6f62802c1ae8\\""
}

Vous pouvez également exécuter cette commande pour répertorier les parties chargées correctement :

aws s3api list-parts --bucket multirecv --key testfile --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

Dans cet exemple, les données de sortie suivantes sont renvoyées. Elles décrivent le propriétaire du compte, l'initiateur du téléchargement partitionné de messages, les parties chargées et la classe de stockage du compartiment contenant ces parties :

{
    "Owner": {
        "DisplayName": "multipartmessage",
        "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Initiator": {
        "DisplayName": "multipart",
        "ID": "arn:aws:iam::22xxxxxxxxxx:user/multipart"
    },
    "Parts": [
        {
            "LastModified": "2016-01-13T13:43:33.000Z",
            "PartNumber": 1,
            "ETag": "\\"56ea28d8be9a0268ebfb8b115d4c1fd3\\"",
            "Size": 79520768
        },
        {
            "LastModified": "2016-01-13T13:56:47.000Z",
            "PartNumber": 2,
            "ETag": "\\"df5ef02246e31ab807da6f62802c1ae8\\"",
            "Size": 79519704
        }
    ],
    "StorageClass": "STANDARD"
}

Une fois les différentes parties chargées, Amazon S3 exige quelques informations supplémentaires pour recréer le fichier d'origine. Les premières de ces informations se présentent sous la forme d’un fichier au format JSON contenant les valeurs ETag renvoyées précédemment lors du chargement des différentes parties du message. Dans cet exemple, le nom du fichier est fileparts et il est enregistré dans le même répertoire que le fichier d'origine et les parties du fichier :

# fileparts
{
    "Parts": [
    {
        "ETag": "56ea28d8be9a0268ebfb8b115d4c1fd3",
        "PartNumber":1
    },
    {
        "ETag": "df5ef02246e31ab807da6f62802c1ae8",
        "PartNumber":2
    }
    ]
}

Cela termine le processus de chargement partitionné de messages. Cette commande détermine chaque partie d'un fichier en lisant le fichier au format JSON que vous avez créé à l'étape 4 et tente de réassembler le fichier d'origine dans le compartiment S3 indiqué. Le paramètre –upload-id est également défini afin d'identifier de façon unique chaque partie du fichier partitionné.

aws s3api complete-multipart-upload --multipart-upload file://fileparts --bucket multirecv --key testfile --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

Si cette étape finale réussit, des données de sortie similaires à celles qui suivent s'affichent :

{
    "ETag": "\\"13115fdae01633ff0af167d925cad279-2\\"",
    "Bucket": "multirecv",
    "Location": "https://multirecv.s3.amazonaws.com/testfile",
    "Key": "testfile"
}

Exécutez cette commande pour récupérer les données d'en-tête d'objet du fichier chargé :

aws s3api head-object --bucket multirecv --key testfile
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Wed, 13 Jan 2016 13:15:00 GMT",
    "ContentLength": 159040472,
    "ETag": "\\"13115fdae01633ff0af167d925cad279-2\\"",
    "Metadata": {
        "md5": "mvhFZXpr7J5u0ooXDoZ/4Q=="
    }
}

Si vous rencontrez des problèmes lors du chargement d'une ou plusieurs parties d'un message partitionné, vous pouvez essayer de recharger les parties concernées du message comme décrit à l'étape 4. Si une partie du message est chargée mais devient orpheline, veillez à la supprimer pour éviter d’accroître inutilement les frais de stockage. Pour répertorier les téléchargements partitionnés de messages incomplets dans le compartiment, exécutez cette commande en remplaçant targetBucket par le nom de votre compartiment :

aws s3api list-multipart-uploads --bucket multirecv

La réponse répertorie toutes les parties de message qui n'ont pas été traitées.

{
    "Uploads": [
        {
            "Initiator": {
                "DisplayName": "myaccount",
                "ID": "5b7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
            },
            "Initiated": "2016-03-31T06:13:15.000Z",
            "UploadId": "MuQzVbEvQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-",
            "StorageClass": "STANDARD",
            "Key": "music.mp4",
            "Owner": {
                "DisplayName": " myaccount ",
                "ID": "5b7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
            }
        }
   ]
}

Vous pouvez utiliser ces informations pour supprimer les parties de message indésirables. Par exemple, pour annuler la partie du message décrite dans l'exemple, exécutez la commande suivante :

aws s3api abort-multipart-upload --bucket multirecv --key music.mp4 --upload-id MuQzVbEvQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB

Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support.

Date de publication : 25/01/2016

Date de mise à jour : 22/02/2018