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?
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?
Réponses:
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:
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.
aws s3 sync s3://source s3://destination
place?
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
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.
--cross-account-copy
option ( -C
pour 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.
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.
Dans le compartiment perdant, sélectionnez le (s) fichier (s) que vous souhaitez copier dans un autre compartiment.