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?
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?
Respostas:
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:
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.
aws s3 sync s3://source s3://destination
encaixa?
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
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.
--cross-account-copy
opção ( -C
para 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.
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.
No intervalo perdedor, selecione o (s) arquivo (s) que você deseja copiar para outro intervalo.