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

44

J'ai des millions de fichiers dans un compartiment Amazon S3 et je souhaite déplacer ces fichiers vers d'autres compartiments et dossiers avec un coût minimal ou nul si possible. Tous les seaux sont dans la même zone.

Comment pourrais-je le faire?

Daniel Cukier
la source

Réponses:

53

Millions est un chiffre important. J'y reviendrai plus tard.

Quelle que soit votre approche, le mécanisme sous-jacent doit copier directement d'un compartiment à un autre - de cette manière (puisque vos compartiments se trouvent dans la même région), vous ne payez aucun frais de bande passante. Toute autre approche est simplement inefficace (par exemple, le téléchargement et la remise en ligne des fichiers).

La copie entre les compartiments est réalisée à l'aide de '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éta-données associées. Vous devez inclure un 'x-amz-acl' avec la valeur correcte si vous souhaitez définir la liste de contrôle d'accès en même temps (sinon, elle sera par défaut privée). Vous serez facturé pour vos demandes de copie (0,01 USD / 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 implique ou non les frais d’une requête GET, car l’objet doit d’abord être récupéré à partir du compartiment source. Si tel est le cas, les frais seront de 0,01 / 10 000 USD supplémentaires. demandes).

Les frais ci-dessus sont apparemment inévitables - pour un million d'objets, vous vous approchez d'environ 10 dollars (ou 11 dollars). En fin de compte, étant donné que vous devez réellement créer les fichiers sur le compartiment de destination, les autres approches (par exemple, le traitement des fichiers par gzipper, Amazon Import / Export, etc.) ne permettent pas de contourner ce coût. Néanmoins, il pourrait être intéressant de contacter Amazon si vous avez plus de deux millions d'objets à transférer.

Compte tenu de ce qui précède (prix inévitable), la prochaine chose à considérer 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 seront facturés au même prix. Malheureusement, vous avez besoin d'une demande par fichier (à copier), d'une demande de suppression et éventuellement d'une demande de lecture des données de la liste de contrôle d'accès (si vos fichiers ont plusieurs listes de contrôle d'accès). La meilleure vitesse viendra de tout ce qui peut exécuter les opérations les plus parallèles.

Certaines approches en ligne de commande pourraient être tout à fait viables:

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

Il est possible que s3fs fonctionne - il est assez parallèle, prend en charge les copies entre les mêmes compartiments - NE prend PAS en charge les copies entre différents compartiments, mais peut prendre en charge les déplacements entre différents compartiments.

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

cyberx86
la source
Bucket Explorer semble bien fonctionner pour moi (déplacer des fichiers entre deux compartiments pour le moment)
Noodles
3
Où est la aws s3 sync s3://source s3://destinationplace?
Olivier Lalonde
7

Vieux sujet, mais ceci s’applique à tous ceux qui étudient 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 principalement une image, ainsi que des fichiers vidéo et divers fichiers multimédias.

Utilisation des outils de l'AWS CLI pour copier les fichiers de Bucket A vers Bucket B.

A. Créer le nouveau compartiment

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

B. Synchronisez l'ancien seau avec le nouveau seau

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

Copier plus de 20 000 objets ...

Commencé à 17h03

Terminé 17:06

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

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

C. Retirer / supprimer l'ancien seau

$ aws s3 rb --force s3://old-bucket-name
utilisateur1360528
la source
Sauveur de vie. Je copie plus de 300 Go. Un conseil: si vous copiez depuis des compartiments situés dans la même région, le processus est bien plus rapide que dans une autre région (et je le lis moins cher).
Marcelo Agimóvel
Votre méthode me posait un problème: la confidentialité des fichiers était réglée sur PRIVATE, même si la plupart des objets étaient publics, que se passait-il?
Marcelo Agimóvel
5

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

Itikos Kleinos
la source
6
Cela risque de ne pas bien fonctionner avec un million de fichiers.
James
@ James peut confirmer douloureusement que;)
rob
3

J'imagine que vous avez probablement déjà trouvé une bonne solution, mais pour les autres personnes qui rencontrent ce problème (comme je viens de le faire), j'ai créé un utilitaire simple spécifiquement dans le but de refléter un seau S3 sur un autre dans une manière hautement 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, merci de me prévenir si vous avez des commentaires.

Cobbzilla
la source
J'ai eu une grande expérience avec s3s3mirror. J'ai pu l'installer sur un noeud m1.small EC2 et copier 1,5 million d'objets en environ 2 heures. La configuration était un peu difficile, à cause de ma méconnaissance de Maven et de Java, mais il n’a fallu que quelques commandes apt-get sur Ubuntu pour que tout soit installé. Une dernière remarque: si (comme moi) vous êtes préoccupé par l’exécution d’un script inconnu sur un seau important et important, créez un utilisateur spécial avec un accès en lecture seule sur le seau de copie et utilisez ces informations d’identité. Zéro chance de suppression accidentelle.
Micah
Cela peut-il être appliqué à des compartiments entre différents comptes?
Oliver Burdekin
@OliverBurdekin Oui, il existe une --cross-account-copyoption ( -Cpour faire court). Notez que lors de la copie sur plusieurs comptes, les listes de contrôle d'accès ne sont pas copiées. le propriétaire du compartiment de destination disposera de tous les droits sur les données copiées.
Cobbzilla
Merci @rfcreader Comment puis-je estimer le coût de cela? Je connais le calculateur de coûts AWS, mais je ne sais pas du tout que ce processus impliquera en termes de nombre de demandes de souscriptions reçues, etc. Le support AWS a suggéré "demandeur payeur". Ha!
Oliver Burdekin
@OliverBurdekin s3s3mirror garde une trace du nombre de demandes AWS par type (GET, COPY, DELETE, etc.). Ces statistiques sont imprimées périodiquement lors de l'exécution et une dernière fois à la fin. Vous pouvez effectuer un nombre limité / tests pour copier un petit sous-ensemble des objets, ce qui devrait vous donner une idée générale du nombre total de demandes nécessaires pour copier l'ensemble du jeu de données.
Cobbzilla
2

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

Les commandes suivantes indiqueront à l'AWS CLI d'utiliser 1 000 threads pour exécuter des travaux (chacun un petit fichier ou une partie d'une copie multipart) et d'anticiper 100 000 travaux:

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

Après leur exécution, 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), dans mon cas (fichiers de 3 à 50 Go), la vitesse de synchronisation / copie est passée d’environ 9,5 Mo / s à 700 + MiB / s, soit une augmentation de la vitesse de 70 fois la configuration par défaut.

il est temps de partir
la source
0

Dans le compartiment perdant, sélectionnez le (s) fichier (s) que vous souhaitez copier dans un autre compartiment.

  • Sous Actions, choisissez "Copier".
  • Allez dans le seau gagnant.
  • Sous Actions, choisissez "Coller".
John
la source
1
Pourquoi répéter une solution que d'autres ont mentionnée un an auparavant?
Benjamin le