J'ai des millions de fichiers dans un bac Amazon S3 et j'aimerais déplacer ces fichiers vers d'autres bacs et dossiers avec un coût minimum ou sans coût si possible. Tous les buckets sont dans la même zone.
Comment pourrais-je le faire ?
J'ai des millions de fichiers dans un bac Amazon S3 et j'aimerais déplacer ces fichiers vers d'autres bacs et dossiers avec un coût minimum ou sans coût si possible. Tous les buckets sont dans la même zone.
Comment pourrais-je le faire ?
Des millions, c'est un chiffre important - j'y reviendrai plus tard.
Quelle que soit votre approche, le mécanisme sous-jacent doit consister à copier directement d'une base de données à une autre - de cette manière (puisque vos bases de données se trouvent dans la même région), vous ne payez pas de frais pour la bande passante. Toute autre approche est tout simplement inefficace (par exemple, le téléchargement et le rechargement des fichiers).
La copie entre godets est réalisée en utilisant "PUT copy" - c'est-à-dire une requête PUT qui inclut l'en-tête "x-amz-copy-source" - je crois qu'il s'agit d'une requête COPY. Cela copiera le fichier et, par défaut, les métadonnées associées. Vous devez inclure un en-tête "x-amz-acl" avec la bonne valeur si vous voulez définir l'ACL en même temps (sinon, elle sera définie par défaut comme privée). Vous serez facturé pour vos demandes de COPIE (0,01 $/1 000 demandes). Vous pouvez supprimer les fichiers inutiles après qu'ils ont été copiés (les demandes DELETE ne sont pas facturées). (Un point sur lequel je ne suis pas très clair est de savoir si une requête COPY entraîne également les frais d'une requête GET, puisque l'objet doit d'abord être récupéré dans le panier source - si c'est le cas, les frais seront de 0,01 $/10 000 requêtes supplémentaires).
Les frais susmentionnés sont apparemment inévitables - pour un million d'objets, il faut compter environ 10 $ (ou 11 $). Étant donné qu'en fin de compte vous devez créer les fichiers sur le panier de destination, les autres approches (par exemple, tar-gzipping des fichiers, Amazon Import/Export, etc) ne permettent pas de contourner ce coût. Néanmoins, il peut être intéressant 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 à prendre en considération est le temps, qui sera un facteur important lors de la copie de "millions de fichiers". Tous les outils capables d'effectuer une copie directe entre des godets seront facturés au même prix. Malheureusement, vous avez besoin d'une demande par fichier (pour copier), d'une demande pour supprimer, et éventuellement d'une demande pour lire les données ACL (si vos fichiers ont des ACL variées). La meilleure vitesse est celle qui permet d'exécuter le plus grand nombre d'opérations en parallèle.
Il existe des approches en ligne de commande qui pourraient être tout à fait viables :
Il est possible que s3fs fonctionne - il est assez parallèle, prend en charge les copies entre les mêmes godets - ne prend PAS en charge les copies entre les différents godets, mais il est possible que s3fs ne prenne pas en charge les copies entre les différents godets. pourrait se déplace d'un godet à l'autre.
Je commencerais avec s3cmd-modification et verrais si vous avez du succès avec ou contacter Amazon pour une meilleure solution.
Vieux sujet, mais ceci s'adresse à tous ceux qui enquêtent sur le même scénario. Avec le temps que cela m'a pris, pour plus de 20 000 objets. Fonctionnant sur AWS Linux/Centos, chaque objet étant pour la plupart des images, ainsi que quelques vidéos et divers fichiers multimédias.
Utilisation des outils AWS CLI pour copier les fichiers du Bucket A vers le Bucket B.
A. Créer le nouveau seau
$ aws s3 mb s3://new-bucket-name
B. Synchroniser l'ancien seau avec le nouveau seau
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Copier plus de 20 000 objets...
Démarrage 17:03
Terminé 17:06
Temps total pour 20 000+ objets = environ 3 minutes
Une fois que le nouveau seau est correctement configuré, c'est-à-dire les autorisations, la politique, etc. et que vous souhaitez supprimer l'ancien seau.
C. Retirer/supprimer l'ancien seau
$ aws s3 rb --force s3://old-bucket-name
L'interface de commande AWS permet de copier un bac vers un autre en parallèle. Tiré de https://stackoverflow.com/a/40270349/371699 :
Les commandes suivantes indiquent à l'interface de programmation AWS d'utiliser 1 000 threads pour exécuter des tâches (chacune étant un petit fichier ou une partie d'une copie en plusieurs parties) et d'anticiper 100 000 tâches :
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), dans mon cas (3-50 Go de fichiers), la vitesse de synchronisation/copie est passée d'environ 9,5 Mo/s à 700+ Mo/s, soit une augmentation de la vitesse de 70x par rapport à la configuration par défaut.
J'imagine que vous avez déjà trouvé une bonne solution, mais pour ceux qui rencontrent ce problème (comme je l'ai fait récemment), j'ai conçu un utilitaire simple qui permet de mettre en miroir un bucket S3 vers un autre de manière hautement concurrentielle, tout en étant efficace en termes de CPU et de mémoire.
Il est disponible sur github sous licence Apache ici : https://github.com/cobbzilla/s3s3mirror
Si vous décidez de l'essayer, n'hésitez pas à me faire part de vos commentaires.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.