Como mover arquivos entre dois buckets S3 com custo mínimo?

44

Tenho milhões de arquivos em um bucket do Amazon S3 e gostaria de movê-los para outros buckets e pastas com custo mínimo ou sem custo, se possível. Todos os baldes estão na mesma zona.

Como eu pude fazer isso?

Daniel Cukier
fonte

Respostas:

53

Milhões é um número grande - voltarei a isso mais tarde.

Independentemente da sua abordagem, o mecanismo subjacente precisa ser copiado diretamente de um depósito para outro - dessa maneira (como os depósitos estão na mesma região), você não incorre em nenhum custo pela largura de banda. Qualquer outra abordagem é simplesmente ineficiente (por exemplo, baixar e reenviar os arquivos).

A cópia entre os buckets é realizada usando 'PUT copy' - que é uma solicitação PUT que inclui o cabeçalho 'x-amz-copy-source' - acredito que isso seja classificado como uma solicitação COPY. Isso copiará o arquivo e, por padrão, os metadados associados. Você deve incluir um 'x-amz-acl' com o valor correto se desejar definir a ACL ao mesmo tempo (caso contrário, ela será padronizada como particular). Você será cobrado pelos seus pedidos de COPY (US $ 0,01 / 1.000). Você pode excluir os arquivos desnecessários depois que eles foram copiados (solicitações DELETE não são cobradas). (Um ponto sobre o qual não estou muito claro é se uma solicitação COPY também incorre na cobrança de uma solicitação GET, pois o objeto deve ser buscado primeiro no bucket de origem - se houver, a cobrança será de US $ 0,01 / 10.000 adicionais solicitações de).

As cobranças acima são aparentemente inevitáveis ​​- para um milhão de objetos você está vendo cerca de US $ 10 (ou US $ 11). Como, no final, você deve realmente criar os arquivos no bucket de destino, outras abordagens (por exemplo, compactar os arquivos com tar-tar, Amazon Import / Export, etc.) não contornam esse custo. Não obstante, pode valer a pena entrar em contato com a Amazon se você tiver mais de alguns milhões de objetos para transferir.

Dado o preço acima (preço inevitável), a próxima coisa a considerar é o tempo, que será um grande fator ao copiar 'milhões de arquivos'. Todas as ferramentas que podem executar a cópia direta entre baldes incorrem na mesma taxa. Infelizmente, você precisa de uma solicitação por arquivo (para copiar), uma solicitação para excluir e, possivelmente, uma solicitação para ler os dados da ACL (se seus arquivos tiverem ACLs variadas). A melhor velocidade virá de qualquer coisa que possa executar as operações mais paralelas.

Existem algumas abordagens de linha de comando que podem ser bastante viáveis:

  • A modificação s3cmd (essa solicitação pull específica) inclui comandos paralelos cp e mv e deve ser uma boa opção para você.
  • O console da AWS pode executar a cópia diretamente - não posso falar por quão paralela ela é.
  • O script aws de Tim Kay pode fazer a cópia - mas não é paralela - você precisará executá-lo para executar a cópia completa desejada (provavelmente não é a melhor opção neste caso - embora seja um ótimo script).
  • O CloudBerry S3 Explorer , o Bucket Explorer e o CloudBuddy devem ser capazes de executar a tarefa, embora eu não saiba como a eficiência de cada uma se compara. No entanto, acredito que os recursos multithread da maioria deles exigem a compra do software.
  • Crie seu próprio script usando um dos SDKs disponíveis.

Há alguma possibilidade de que o s3fs funcione - é bastante paralelo, suporta cópias entre o mesmo bucket - NÃO suporta cópias entre diferentes buckets, mas pode suportar movimentos entre diferentes buckets.

Eu começaria com a modificação s3cmd e veria se você tem algum sucesso com ela ou entre em contato com a Amazon para obter uma solução melhor.

cyberx86
fonte
Balde o Explorer parece estar funcionando bem para mim (transferência de arquivos entre dois baldes no momento)
Noodles
3
Onde se aws s3 sync s3://source s3://destinationencaixa?
Olivier Lalonde 10/10
7

Tópico antigo, mas isso é para qualquer um que investigue o mesmo cenário. Junto com o tempo que levou, mais de 20.000 objetos. Executando no AWS Linux / Centos, cada objeto sendo imagens em sua maior parte, junto com alguns vídeos e vários arquivos de mídia.

Usando as ferramentas da CLI da AWS para copiar os arquivos do balde A para o balde B.

A. Crie o novo bucket

$ aws s3 mb s3://new-bucket-name

B. Sincronize o balde antigo com o novo balde

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Copiando mais de 20.000 objetos ...

Iniciado às 17:03

Terminou 17:06

Tempo total para mais de 20.000 objetos = aproximadamente 3 minutos

Depois que o novo depósito estiver configurado corretamente, ou seja, permissões, política etc. e você deseja remover o antigo depósito.

C. Remova / exclua o balde antigo

$ aws s3 rb --force s3://old-bucket-name
user1360528
fonte
Salvador da vida. Estou copiando mais de 300 GB. Uma dica: se você copiar de baldes na mesma região é muito mais rápido do que em outra região (e eu li que é menos caro).
Marcelo Agimóvel 20/08/19
Eu tive um problema com seu método: a privacidade dos arquivos foi definida como PRIVATE, mesmo a maioria dos objetos sendo públicos, o que aconteceu?
Marcelo Agimóvel 24/08
5

Não sei se é a melhor abordagem, mas o console de gerenciamento da AWS possui um recurso de recortar / copiar / colar. muito fácil de usar e eficiente.

Itikos Kleinos
fonte
6
Não é provável que funcione bem com um milhão de arquivos.
James
@ James pode dolorosamente confirmar que;)
Rob
3

Eu imagino que você provavelmente já encontrou uma boa solução até agora, mas para outras pessoas que estão enfrentando esse problema (como eu era recentemente), criei um utilitário simples especificamente com o objetivo de espelhar um bucket S3 para outro no uma maneira altamente simultânea, mas com CPU e memória eficientes.

Está no github sob uma licença Apache aqui: https://github.com/cobbzilla/s3s3mirror

Se você decidir experimentá-lo, entre em contato se tiver algum comentário.

cobbzilla
fonte
Eu tive uma ótima experiência com o s3s3mirror. Consegui configurá-lo em um nó EC2 m1.small e copiar 1,5 milhão de objetos em cerca de 2 horas. A instalação foi um pouco difícil, devido à minha falta de familiaridade com o Maven e Java, mas foram necessários apenas alguns comandos apt-get no Ubuntu para instalar tudo. Uma última observação: se (como eu) você estiver preocupado em executar um script desconhecido em um grande e importante bucket s3, crie um usuário especial com acesso somente leitura no bucket copy-from e use essas credenciais. Chance zero de exclusão acidental.
Micah
Isso pode ser aplicado a intervalos entre contas diferentes?
Oliver Burdekin 06/06
@OliverBurdekin sim, existe uma --cross-account-copyopção ( -Cpara abreviar) de fazer isso. Observe que, ao copiar entre contas, as ACLs não são copiadas; o proprietário do bloco de destino terá permissões totais para os dados copiados.
cobbzilla
Obrigado @rfcreader Como posso estimar o custo disso? Conheço a calculadora de custos da AWS, mas não tenho idéia do que esse processo envolverá em termos de número de solicitações de get put ls etc. Imagino que seja muito fácil contar essas métricas usando a CLI, mas se você souber mais, entre em contato. O suporte da AWS sugere "o solicitante paga". ha!
Oliver Burdekin
O @OliverBurdekin s3s3mirror controla o número de solicitações da AWS por tipo (GET, COPY, DELETE etc.). Essas estatísticas são impressas periodicamente durante a execução e uma última vez no final. Você pode executar uma execução limitada / teste para copiar um pequeno subconjunto dos objetos. Isso deve dar uma ideia geral de quantas solicitações totais serão necessárias para copiar todo o conjunto de dados.
cobbzilla
2

A CLI da AWS fornece uma maneira de copiar um bucket para outro em processos paralelos. Retirado de https://stackoverflow.com/a/40270349/371699 :

Os comandos a seguir instruirão a CLI da AWS a usar 1.000 threads para executar tarefas (cada um pequeno arquivo ou uma parte de uma cópia com várias partes) e analisar 100.000 tarefas:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Depois de executá-los, você pode usar o comando simple sync da seguinte maneira:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Em uma máquina m4.xlarge (na AWS - 4 núcleos, 16 GB de RAM), no meu caso (arquivos de 3 a 50 GB), a velocidade de sincronização / cópia passou de cerca de 9,5MiB / s para 700 + MiB / s, um aumento de velocidade de 70x sobre a configuração padrão.

hora de voar
fonte
0

No intervalo perdedor, selecione o (s) arquivo (s) que você deseja copiar para outro intervalo.

  • Em Ações, escolha 'Copiar'.
  • Vá para o balde de ganhos.
  • Em Ações, escolha 'Colar'
John
fonte
1
Por que repetir uma solução que outras pessoas mencionaram um ano antes?
22713 Benjamin