Tenho tentado encontrar uma ferramenta de linha de comando melhor para duplicar baldes do que s3cmd . s3cmd
pode duplicar baldes sem ter que baixar e carregar cada arquivo. O comando que normalmente executo para duplicar intervalos usando s3cmd é:
s3cmd cp -r --acl-public s3://bucket1 s3://bucket2
Isso funciona, mas é muito lento, pois copia cada arquivo por meio da API, um de cada vez. Se s3cmd
pudesse rodar em modo paralelo, ficaria muito feliz.
Existem outras opções disponíveis como ferramentas de linha de comando ou código que as pessoas usam para duplicar depósitos mais rápidos do que s3cmd
?
Edit: Parece que s3cmd-modify é exatamente o que estou procurando. Pena que não funciona. Existem outras opções?
amazon-web-services
amazon-s3
Sean McCleary
fonte
fonte
Respostas:
O AWS CLI parece fazer o trabalho perfeitamente e tem a vantagem de ser uma ferramenta com suporte oficial.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
Suporta transferências simultâneas por padrão. Consulte http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests
Para transferir rapidamente um grande número de arquivos pequenos, execute o script de uma instância EC2 para diminuir a latência e aumente
max_concurrent_requests
para reduzir o impacto da latência. Por exemplo:fonte
Se você não se importa em usar o console AWS, pode:
Ainda é bastante lento, mas você pode deixá-lo sozinho e deixá-lo fazer seu trabalho.
fonte
Tentei clonar dois baldes usando o console da web da AWS, o
s3cmd
e o AWS CLI. Embora esses métodos funcionem na maioria das vezes, eles são dolorosamente lentos.Então eu descobri
s3s3mirror
: uma ferramenta especializada para sincronizar dois buckets S3. É multi-threaded e muito mais rápido do que as outras abordagens que experimentei. Mudei rapidamente Giga-bytes de dados de uma região da AWS para outra.Confira em https://github.com/cobbzilla/s3s3mirror ou baixe um contêiner Docker em https://registry.hub.docker.com/u/pmoust/s3s3mirror/
fonte
Para solução ad hoc, use
aws cli
para sincronizar entre os intervalos:aws s3 sync
a velocidade depende de:- latência para uma chamada API para o endpoint S3
- quantidade de chamadas API feitas em simultâneo
Para aumentar a velocidade de sincronização:
- execute a
aws s3 sync
partir de uma instância AWS (c3.large no FreeBSD está OK ;-))- atualize ~ / .aws / config com:
-
max_concurrent_requests = 128
-
max_queue_size = 8096
com a seguinte configuração e tipo de instância, consegui sincronizar o intervalo (309 GB, 72K arquivos, us-east-1) em 474 segundos.
Para uma solução mais genérica, considere - AWS DataPipeLine ou replicação entre regiões S3.
fonte
awscli
documento -aws sync
copia apenas arquivos novos e atualizados. provavelmente você deve esperar alto desempenho comaws cp
(a cópia é feita internamente, seu cliente apenas emite uma chamada de API). o desempenho depende destes fatores: 1. latência entre as regiões src e dst (por exemplo, us-east-X para us-west-X) 2. latência entre seu cliente e o endpoint da API AWS (quão rápido você pode emitir uma chamada de API) 3. quantidade de solicitações simultâneas (quantas solicitações por segundo seu cliente pode emitir). No meu caso, 309G foi copiado entre baldes na mesma região (us-east-1)Como se trata do primeiro acerto do Google neste assunto, adicionando informações extras.
'Cyno' fez uma versão mais recente de s3cmd-modify, que agora suporta sincronização paralela de bloco para bloco. Exatamente o que eu estava esperando também.
A solicitação pull está em https://github.com/pcorliss/s3cmd-modification/pull/2 , a versão dele em https://github.com/pearltrees/s3cmd-modification
fonte
Não conheço nenhuma outra ferramenta de linha de comando S3, mas se nada aparecer aqui, pode ser mais fácil escrever a sua própria.
Escolha o idioma e o Amazon SDK / Toolkit de sua preferência. Então você só precisa listar / recuperar o conteúdo do intervalo de origem e copiar cada arquivo (em paralelo, obviamente)
Olhando para o código - fonte para s3cmd-modify (e eu admito que não sei nada sobre python), parece que eles não paralelizaram o código bucket-to-bucket, mas talvez você possa usar o código paralelo de upload / download padrão como ponto de partida para faça isso.
fonte
um simples
aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursive
funciona bem (supondo que você tenha uma configuração de aws cli)fonte