web-dev-qa-db-fra.com

Comment déplacer des fichiers entre deux compartiments S3 avec un coût minimum?

J'ai des millions de fichiers dans un compartiment Amazon S3 et j'aimerais déplacer ces fichiers vers d'autres compartiments et dossiers à un coût minimum ou gratuit si possible. Tous les godets sont dans la même zone.

Comment pourrais-je le faire?

45
Daniel Cukier

Des millions, c'est un gros chiffre - j'y reviendrai plus tard.

Quelle que soit votre approche, le mécanisme sous-jacent doit être copié directement d'un compartiment à un autre - de cette façon (puisque vos compartiments sont dans la même région), vous ne payez aucun frais pour la bande passante. Toute autre approche est simplement inefficace (par exemple, télécharger et re-télécharger les fichiers).

La copie entre les compartiments est accomplie en utilisant 'PUT copy' - c'est-à-dire une demande PUT qui inclut l'en-tête 'x-amz-copy-source' - je crois que cela est classé comme une demande COPY. Cela copiera le fichier et par défaut les métadonnées associées. Vous devez inclure un "x-amz-acl" avec la valeur correcte si vous souhaitez définir l'ACL en même temps (sinon, il sera par défaut privé). Vous serez facturé pour vos demandes de COPIE (0,01 $/1 000 demandes). Vous pouvez supprimer les fichiers inutiles après leur copie (les demandes DELETE ne sont pas facturées). (Un point sur lequel je ne suis pas tout à fait clair est de savoir si une demande COPY entraîne également la charge d'une demande GET, car l'objet doit d'abord être récupéré dans le compartiment source - si c'est le cas, la charge sera de 0,01 $/10 000 $ supplémentaires demandes).

Les frais ci-dessus sont apparemment inévitables - pour un million d'objets, vous regardez environ 10 $ (ou 11 $). Comme à la fin, vous devez réellement créer les fichiers sur le compartiment de destination, d'autres approches (par exemple tar-gzipping les fichiers, Amazon Import/Export, etc.) ne contourneront pas ce coût. Néanmoins, cela pourrait valoir la peine de contacter Amazon si vous avez plus de quelques millions d'objets à transférer.

Compte tenu de ce qui précède (prix inévitable), la prochaine chose à examiner est le temps, qui sera un facteur important lors de la copie de "millions de fichiers". Tous les outils pouvant effectuer la copie directe entre les compartiments entraîneront les mêmes frais. Malheureusement, vous avez besoin d'une demande par fichier (à copier), d'une demande à supprimer et éventuellement d'une demande de lecture des données ACL (si vos fichiers ont des ACL variées). La meilleure vitesse proviendra de tout ce qui peut exécuter les opérations les plus parallèles.

Il existe des approches en ligne de commande qui pourraient être tout à fait viables:

  • s3cmd-modification (cette requête pull spécifique) inclut des commandes parallèles cp et mv et devrait être une bonne option pour vous.
  • La console AWS peut effectuer la copie directement - je ne peux cependant pas dire à quel point elle est parallèle.
  • aws de Tim Kay le script peut faire la copie - mais ce n'est pas parallèle - vous devrez le scripter pour exécuter la copie complète que vous voulez (probablement pas la meilleure option dans ce cas - bien que ce soit un grand script).
  • CloudBerry S3 Explorer , Bucket Explorer , et CloudBuddy devraient tous être en mesure d'effectuer la tâche, bien que je ne sache pas comment l'efficacité de chacun empile. Je crois cependant que les fonctionnalités multi-thread de la plupart d'entre elles nécessitent l'achat du logiciel.
  • Créez votre propre script à l'aide de l'un des SDK disponibles.

Il y a une certaine possibilité que s3fs puisse fonctionner - il est assez parallèle, prend en charge les copies entre le même compartiment - ne prend PAS en charge les copies entre différents compartiments, mais pourrait prend en charge les mouvements entre différents compartiments.

Je commencerais par la modification s3cmd et verrais si vous avez du succès ou contactez Amazon pour une meilleure solution.

55
cyberx86

Ancien sujet, mais c'est pour tous ceux qui enquêtent sur le même scénario. Avec le temps qu'il m'a fallu, pour plus de 20 000 objets. Fonctionnant sur AWS Linux/Centos, chaque objet étant pour la plupart des images, ainsi que des vidéos et divers fichiers multimédias.

Utilisation des outils AWS CLI pour copier les fichiers du compartiment A vers le compartiment B.

A. Créez le nouveau compartiment

$ aws s3 mb s3://new-bucket-name

B. Synchronisez l'ancien compartiment avec le nouveau compartiment

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Copie de plus de 20000 objets ...

Commencé 17:03

Terminé 17:06

Temps total pour plus de 20 000 objets = environ 3 minutes

Une fois que le nouveau compartiment est correctement configuré, c'est-à-dire autorisations, stratégie, etc. et vous souhaitez supprimer l'ancien compartiment.

C. Supprimer/supprimer l'ancien sea

$ aws s3 rb --force s3://old-bucket-name
9
user1360528

Je ne suis pas sûr que ce soit la meilleure approche mais la console de gestion AWS a une fonction couper/copier/coller. très facile à utiliser et efficace.

5
Itikos Kleinos

L'AWS CLI fournit un moyen de copier un compartiment vers un autre dans des processus parallèles. Tiré de https://stackoverflow.com/a/40270349/371699 :

Les commandes suivantes indiquent à l'AWS CLI d'utiliser 1000 threads pour exécuter des travaux (chacun étant un petit fichier ou une partie d'une copie en plusieurs parties) et anticiper 100 000 travaux:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Après les avoir exécutés, vous pouvez utiliser la commande de synchronisation simple comme suit:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Sur une machine m4.xlarge (dans AWS - 4 cœurs, 16 Go de RAM), pour mon cas (fichiers de 3 à 50 Go), la vitesse de synchronisation/copie est passée d'environ 9,5 Mo/s à 700 + MiB/s, une augmentation de vitesse de 70x sur la configuration par défaut.

4
timetofly

J'imagine que vous avez probablement déjà trouvé une bonne solution, mais pour ceux qui rencontrent ce problème (comme je l'étais récemment), j'ai conçu un utilitaire simple spécifiquement dans le but de mettre en miroir un compartiment S3 à un autre dans d'une manière très concurrente, mais efficace en termes de CPU et de mémoire.

C'est sur github sous une licence Apache ici: https://github.com/cobbzilla/s3s3mirror

Si vous décidez de l'essayer, faites-le moi savoir si vous avez des commentaires.

3
cobbzilla

Dans le compartiment perdant, sélectionnez le ou les fichiers que vous souhaitez copier dans un autre compartiment.

  • Sous Actions, choisissez "Copier".
  • Allez dans le seau à gagner.
  • Sous Actions, choisissez "Coller"
0
john