Comment puis-je copier tous les objets d'un compartiment Amazon S3 vers un autre compartiment ?

Date de la dernière mise à jour : 19/05/2021

Je souhaite copier ou transférer tous mes objets d'un compartiment Amazon Simple Storage Service (Amazon S3) vers un autre compartiment. Comment migrer des objets entre mes compartiments S3 ?

Brève description

Pour copier des objets d'un compartiment S3 vers un autre, suivez la procédure suivante :

1.    Créez un nouveau compartiment S3.

2.    Installez et configurez l'interface de ligne de commande AWS.

3.    Copiez les objets entre les compartiments S3.

Remarque : l'utilisation des commandes aws s3 ls ou aws s3 sync sur de grands compartiments (avec 10 millions d'objets ou plus) peut s'avérer coûteuse, et entraîner un dépassement du délai. Si vous rencontrez des dépassements de délai en raison d'un compartiment volumineux, envisagez d'utiliser les métriques Amazon CloudWatch pour calculer la taille et le nombre d'objets dans un compartiment. Envisagez également d'utiliser S3 Batch Operations pour copier les objets.

4.    Vérifiez que les objets sont copiés.

5.    Mettez à jour les appels d'API existants vers le nom du compartiment cible.

Avant de commencer, vérifiez les points suivants :

Solution

Créer un nouveau compartiment S3

1.    Ouvrez la console Amazon S3.

2.    Choisissez Create Bucket (Créer un compartiment).

3.    Choisissez un nom conforme DNS pour le nouveau compartiment.

4.    Sélectionnez votre région AWS.

Conseil : pour éviter les problèmes de performance causés par le trafic inter-régions, créez le compartiment cible dans la même région que le compartiment source.

5.    De manière facultative, choisissez Copy settings from an existing bucket (Copier les paramètres depuis un compartiment existant) pour mettre en miroir la configuration du compartiment source.

Installez et configurez AWS CLI.

1.    Installez l'interface de ligne de commande AWS.

2.    Configurez AWS CLI en exécutant la commande suivante :

aws configure

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis AWS CLI, assurez-vous que vous utilisez la version d'AWS CLI la plus récente.

3.    Saisissez vos clés d'accès (ID de clé d'accès et clé d'accès secrète).

4.    Appuyez sur Entrée pour ignorer les options de région et de sortie par défaut. Pour plus d'informations sur les paramètres de la région Amazon S3, consultez les points de terminaison du service AWS.

Remarque : les sorties AWS CLI sont au format JSON, texte ou tableau, mais les commandes ne prennent pas toutes en charge chaque type de sortie. Pour plus d'informations, consultez Contrôle de la sortie de commande d'AWS CLI.

Copier les objets entre les compartiments S3

1.    Si vous avez archivé des objets S3 dans la classe de stockage Amazon Simple Storage Service Glacier, restaurez-les.

2.    Copiez les objets entre les compartiments source et cible en exécutant lacommande de synchronisation suivante via AWS CLI :

aws s3 sync s3://DOC-EXAMPLE-BUCKET-SOURCE s3://DOC-EXAMPLE-BUCKET-TARGET

Remarque : mettez à jour la commande de synchronisation pour inclure le nom du compartiment source et celui du compartiment cible.

La commande de synchronisation utilise les API CopyObject pour copier les objets d'un compartiment S3 à un autre. La commande de synchronisation répertorie les compartiments source et cible pour identifier les objets qui se trouvent dans le compartiment source, mais pas dans le compartiment cible. Elle identifie également dans le compartiment source les objets dont les dates de dernière modification (LastModified) sont différentes de celles des objets dans le compartiment cible. Lorsque vous utilisez la commande de synchronisation d'un compartiment existant en plusieurs versions, seule la version actuelle de l'objet est copiée (les versions précédentes ne sont pas copiées). Par défaut, ce comportement préserve les métadonnées des objets, même si les listes de contrôle d'accès (ACL) de votre compte AWS sont définies sur FULL_CONTROL de manière à supprimer toutes les autres listes ACL. En cas d'échec de l'opération, vous pouvez à nouveau exécuter la commande de synchronisation sans dupliquer les objets précédemment copiés. Pour résoudre les problèmes liés à l'opération de synchronisation, consultez Pourquoi ne puis-je pas copier un objet d'un compartiment Amazon S3 à l'autre ?

3.    (Facultatif) Si vous rencontrez un dépassement de délai, utilisez la commande cloudwatch get-metric-statistics pour calculer le nombre d'objets dans votre compartiment :

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=AllStorageTypes --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 600 --statistic Average --output json

4.    (Facultatif) Si vous rencontrez un dépassement de délai, utilisez la commande cloudwatch get-metric-statistics pour récupérer la taille de votre compartiment :

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=StandardStorage --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 3600 --statistics Average --unit Bytes --output json
Remarque : les appels de liste peuvent être très coûteux, ce qui entraîne la temporisation de la commande. Pour les compartiments volumineux, envisagez plutôt d'utiliser les métriques Amazon CloudWatch pour calculer la taille du compartiment et le nombre total d'objets. Toutefois, comme les métriques Amazon CloudWatch ne sont extraites qu'une fois par jour, le nombre d'objets signalés et la taille du compartiment peuvent différer des résultats de la commande de liste.

Vérifier que les objets sont copiés

1.    Vérifiez le contenu des compartiments source et cible en exécutant les commandes suivantes :

aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-SOURCE --summarize > bucket-contents-source.txt
        
aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-TARGET --summarize > bucket-contents-target.txt

Remarque : mettez à jour la commande de liste pour inclure le nom du compartiment source et celui du compartiment cible.

2.    Comparez les objets dans les compartiments source et cible en utilisant les sorties enregistrées dans des fichiers dans le répertoire de l'interface de ligne de commande AWS. Consultez l'exemple de sortie suivant :

$ aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET --summarize
2017-11-20 21:17:39      15362 s3logo.png

  Total Objects: 1        Total Size: 15362

Mettre à jour les appels d'API existants vers le nom du compartiment cible

Mettez à jour les applications ou les charges de travail existantes pour qu'elles utilisent le nom du compartiment cible. Il peut être nécessaire d'exécuter les commandes de synchronisation de manière à éviter les divergences entre les compartiments source et cible si vous êtes amené à effectuer des écritures fréquentes.