Je souhaite copier un gros fichier (au moins 100 Mo) vers un compartiment Amazon S3 en plusieurs parties. Je souhaite garantir l'intégrité du fichier après son chargement. Comment procéder avec l'interface de ligne de commande AWS ?

Le chargement d'un fichier sur 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. De plus, en cas d'échec de chargement d'une ou plusieurs parties, vous ne devez recharger que ces parties et non la totalité du fichier.

Vous vérifiez l'intégrité du téléchargement partitionné d'un message en envoyant les valeurs de total de contrôle MD5 base64 du fichier d'origine et de chaque partie du fichier à Amazon S3 lorsque vous lancez le chargement. 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 S3 en indiquant la valeur UploadId et le total de contrôle MD5 base64 de chaque partie du fichier. 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, tels que le compartiment de destination, la liste des parties du fichier et d'autres informations. 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 différentes règles syntaxiques 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. Tous 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 légèrement différente. Pour plus d'informations, consultez Spécification des valeurs des paramètres pour l'interface de ligne de commandes AWS.

Sous Windows : téléchargez l'utilitaire File Checksum Integrity Verifier (FCIV) et extrayez son contenu dans un dossier. Ajoutez ensuite 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

Notez que 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. Si vous voulez modifier la variable d'environnement du chemin d'accès système Windows de façon permanente, consultez la documentation Windows ou recherchez sur le Web « Modifier la variable path 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 S3. Remplacez c:\S3\testfile par l'emplacement du fichier que vous chargez sur 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 sera similaire à la valeur suivante renvoyée 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 valeur de total de contrôle pour le téléchargement partitionné de messages sur S3. Si vous utilisez un total de contrôle MD5 hexadécimal, vous recevrez le message d'erreur « La valeur Content-MD5 spécifiée n'est pas valide ». Plusieurs convertisseurs de chaînes hexadécimales en base64 sont disponibles sur le Web. Si vous préférez, vous pouvez télécharger un code de script tel que le script HexToBase64, qui est disponible à l'adresse http://www.rlmueller.net/Programs/HexToBase64.txt. Vous pouvez également 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 téléchargement partitionné de messages sur S3. L'équivalent codé en base64 de la valeur hexadécimale renvoyée par l'utilitaire FCIV dans l'exemple est 4bCvab+2y96bU8VeS/kZkg==.

Sous Linux : Linux offre en mode natif la possibilité 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 la commande suivante à partir d'un shell Linux :

openssl md5 -binary PATH/TO/FILE | base64

La valeur renvoyée sera similaire à la valeur suivante renvoyée 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 facilement 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 des commandes suivantes à partir du shell de commande Linux :

split --help : affiche les arguments de la commande split

info split : affiche les informations générales sur la commande split

man split : affiche la page de manuel relative à la commande split

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

Ce tableau présente les informations que vous devez rassembler pour lancer le téléchargement partitionné de messages.

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 targetBucket --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 :

{

    "Bucket": "targetBucket",

    "UploadId":"sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk",

    "Key": "testfile"

}

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 targetBucket --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 targetBucket --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\""

}

Si vous le souhaitez, exécutez la commande suivante pour répertorier les parties dont le chargement a abouti :

aws s3api list-parts -–bucket targetBucket -–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 que les différentes parties ont été chargées, 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 qui contient 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 a été 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

    }

    ]

}

La commande suivante termine le processus de télé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 targetBucket

--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": "targetBucket",

    "Location": "https://targetBucket.s3.amazonaws.com/testfile",

    "Key": "testfile"

}

Vous pouvez exécuter la commande suivante pour récupérer les données d'en-tête d'objet du fichier chargé :

aws s3api head-object --bucket targetBucket --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=="

    }

}

Les données d'en-tête d'objet contiennent la valeur du total de contrôle MD5 codé en base64 du fichier, que vous pouvez utiliser pour vérifier l'intégrité du fichier s'il est téléchargé ou déplacé ailleurs par la suite. La valeur du total de contrôle MD5 du fichier doit correspondre à la valeur du total de contrôle MD5 du fichier calculée avant le fractionnement du fichier et son téléchargement partitionné.

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'accumuler des frais de stockage inutiles. Pour répertorier les téléchargements partitionnés de messages incomplets dans le compartiment, exécutez la commande suivante en remplaçant targetBucket par le nom de votre compartiment :

aws s3api list-multipart-uploads –bucket targetBucket

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 targetBucket --key music.mp4 --upload-id MuQzVbEvQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-

Amazon S3, téléchargement partitionné de messages, API aws s3, interface de ligne de commande AWS, total de contrôle MD5 base64, chargement de fichier à l'aide de plusieurs threads


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