J'ai essayé de trouver un meilleur outil de ligne de commande pour la duplication de compartiments que s3cmd . s3cmd
peut dupliquer des compartiments sans avoir à télécharger et télécharger chaque fichier. La commande que j'exécute normalement pour dupliquer des compartiments à l'aide de s3cmd est:
s3cmd cp -r --acl-public s3://bucket1 s3://bucket2
Cela fonctionne, mais c'est très lent car il copie chaque fichier via l'API un par un. Si s3cmd
pourrait fonctionner en mode parallèle, je serais très heureux.
Y a-t-il d'autres options disponibles en tant qu'outils de ligne de commande ou code que les gens utilisent pour dupliquer des compartiments plus rapides que s3cmd
?
Edit: On dirait que s3cmd-modification est exactement ce que je recherche. Dommage que cela ne fonctionne pas. Il y a-t-il des alternatives?
L'AWS CLI semble parfaitement faire le travail et a l'avantage d'être un outil officiellement pris en charge.
aws s3 sync s3://mybucket s3://backup-mybucket
http://docs.aws.Amazon.com/cli/latest/reference/s3/sync.html
Prend en charge les transferts simultanés par défaut. Voir http://docs.aws.Amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests
Pour transférer rapidement un grand nombre de petits fichiers, exécutez le script à partir d'une instance EC2 pour réduire la latence et augmenter max_concurrent_requests
pour réduire l'impact de la latence. Par exemple:
aws configure set default.s3.max_concurrent_requests 200
Si cela ne vous dérange pas d'utiliser la console AWS, vous pouvez:
C'est encore assez lent, mais vous pouvez le laisser tranquille et le laisser faire son travail.
J'ai essayé de cloner deux compartiments à l'aide de la console Web AWS, le s3cmd
et l'AWS CLI. Bien que ces méthodes fonctionnent la plupart du temps, elles sont douloureusement lentes.
Puis j'ai trouvé s3s3mirror
: un outil spécialisé pour synchroniser deux compartiments S3. Il est multi-thread et beaucoup plus rapide que les autres approches que j'ai essayées. J'ai rapidement déplacé des Giga-octets de données d'une région AWS à une autre.
Vérifiez-le sur https://github.com/cobbzilla/s3s3mirror , ou téléchargez un conteneur Docker sur https://registry.hub.docker.com/u/pmoust/s3s3mirror /
Pour une solution adhoc, utilisez aws cli
pour synchroniser entre les compartiments:
aws s3 sync
la vitesse dépend de:
- latence pour un appel API au point de terminaison S3
- nombre d'appels d'API effectués simultanément
Pour augmenter la vitesse de synchronisation:
- courir aws s3 sync
à partir d'une instance AWS (c3.large sur FreeBSD est OK ;-))
- mettez à jour ~/.aws/config avec:
- max_concurrent_requests = 128
- max_queue_size = 8096
avec la configuration et le type d'instance suivants, j'ai pu synchroniser le bucket (309 Go, 72 000 fichiers, us-east-1) en 474 secondes.
Pour une solution plus générique, envisagez la réplication entre régions AWS DataPipeLine ou S3.
Comme il s'agit du premier succès de Google sur ce sujet, l'ajout d'informations supplémentaires.
'Cyno' a créé une nouvelle version de s3cmd-modification, qui prend désormais en charge la synchronisation parallèle de bucket à bucket. Exactement ce que j'attendais aussi.
La demande d'extraction est à https://github.com/pcorliss/s3cmd-modification/pull/2 , sa version à https://github.com/pearltrees/s3cmd-modification
Je ne connais aucun autre outil de ligne de commande S3 mais si rien ne vient ici, il pourrait être plus facile d'écrire le vôtre.
Choisissez la langue et le kit de développement logiciel Amazon SDK que vous préférez. Il vous suffit ensuite de lister/récupérer le contenu du bucket source et de copier chaque fichier (en parallèle évidemment)
En regardant la source de s3cmd-modification (et j'avoue que je ne sais rien de python), il semble qu'ils n'aient pas mis en parallèle le code bucket-to-bucket mais peut-être pourriez-vous utiliser le téléchargement/téléchargement standard code parallèle comme point de départ pour ce faire.