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?
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:
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.
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
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.
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.
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.
Dans le compartiment perdant, sélectionnez le ou les fichiers que vous souhaitez copier dans un autre compartiment.