A maneira mais eficiente de excluir arquivos S3 em lote

7

Gostaria de excluir em lote milhares ou dezenas de milhares de arquivos por vez no S3. Cada arquivo estaria em qualquer lugar de 1MB a 50MB. Naturalmente, não quero que o usuário (ou meu servidor) esteja aguardando enquanto os arquivos estão sendo excluídos. Portanto, as perguntas:

  1. Como o S3 manipula a exclusão de arquivos, especialmente ao excluir um grande número de arquivos?
  2. Existe uma maneira eficiente de fazer isso e fazer a AWS fazer a maior parte do trabalho? Por eficiente, quero dizer, fazendo o menor número de solicitações para o S3 e gastando menos tempo usando a menor quantidade de recursos em meus servidores.
por SudoKill 02.04.2015 / 06:06

4 respostas

7

O AWS suporta a exclusão em massa de até 1.000 objetos por solicitação usando a API REST do S3 e seus vários wrappers. Este método pressupõe que você conheça as chaves de objeto do S3 que deseja remover (ou seja, ele não foi projetado para manipular algo como uma diretiva de retenção, arquivos acima de um determinado tamanho etc.).

A API REST do S3 pode especificar até 1000 arquivos a serem excluídos em uma única solicitação, o que deve ser mais rápido do que fazer solicitações individuais. Lembre-se, cada solicitação é uma solicitação HTTP (assim, TCP). Portanto, cada solicitação carrega a sobrecarga. Você só precisa conhecer as chaves dos objetos e criar uma solicitação HTTP (ou usar um wrapper no idioma de sua escolha). A AWS fornece ótimas informações sobre esse recurso e seu uso . Basta escolher o método com o qual você se sente mais confortável!

Estou assumindo que seu caso de uso envolve usuários finais especificando um número de arquivos específicos para excluir de uma só vez. Em vez de iniciar uma tarefa como "limpar todos os objetos que se referem a arquivos de imagens" ou "limpar todos os arquivos com mais de uma determinada data" (que, acredito, é fácil de configurar separadamente no S3).

Em caso afirmativo, você saberá as chaves que você precisa excluir. Isso também significa que o usuário vai gostar de mais comentários em tempo real sobre se o arquivo foi excluído com sucesso ou não. Referências a chaves exatas devem ser muito rápidas, uma vez que o S3 foi projetado para escalar de forma eficiente, apesar de lidar com uma quantidade extremamente grande de dados.

Se não, você pode procurar em chamadas de API assíncronas. Você pode ler um pouco sobre como eles funcionariam em geral a partir desta postagem no blog ou pesquise como fazer isso no idioma de sua escolha. Isso permitiria que a solicitação de exclusão ocupasse seu próprio encadeamento e o restante do código pudesse ser executado sem que um usuário esperasse. Ou você pode transferir a solicitação para uma fila. . . Mas essas duas opções desnecessariamente complicam seu código (o código assíncrono pode ser chato) ou seu ambiente (você precisaria de um serviço / daemon / container / servidor para lidar com a fila. Então, eu evitaria esse cenário, se possível.

Edit: Eu não tenho a reputação de postar mais de 2 links. Mas você pode ver os comentários da Amazon sobre a taxa de solicitações e o desempenho aqui: link E o s3 faq comenta que a maioria dele é o caminho a seguir, se possível.

    
por 02.04.2015 / 21:27
3

Fiquei frustrado com o desempenho do console da web para essa tarefa. Descobri que o comando AWS CLI faz isso bem. Por exemplo:

aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files

Para uma hierarquia de arquivos grande, isso pode levar um tempo considerável. Você pode definir isso em execução em uma sessão tmux ou screen e voltar mais tarde.

    
por 09.08.2017 / 21:01
3

A opção dolorosamente lenta é s3 rm --recursive se você realmente gosta de esperar.

A execução paralela s3 rm --recursive com padrões --include diferentes é um pouco mais rápida, mas muito tempo ainda é gasto aguardando, já que cada processo busca individualmente a lista de chaves inteira para executar localmente a correspondência de padrões --include .

Insira a exclusão em massa.

Descobri que consegui obter a maior velocidade ao eliminar 1000 chaves de uma só vez usando aws s3api delete-objects .

Veja um exemplo:

cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "{Key=%s}," "$@")],Quiet=true"' _
  • A opção -P8 em xargs controla o paralelismo. São oito neste caso, ou seja, oito instâncias de mil exclusões por vez.
  • A opção -n1000 informa xargs para agrupar 1000 chaves para cada aws s3api delete-objects de chamada.
  • Remover ,Quiet=true ou alterá-lo para false causará respostas do servidor.
  • Nota: há um _ facilmente perdido no final dessa linha de comando. @VladNikiforov postou um excelente comentário sobre o assunto no comentário , por isso vou me associar a isso.

Mas como você obtém file-of-keys ?

Se você já tem sua lista de chaves, é bom para você. Trabalho concluído.

Se não, aqui está uma maneira, eu acho:

aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | sed -nre "s|[0-9-]+ [0-9:]+ +[0-9]+ |SOME_SUB_DIR|p" >file-of-keys
    
por 22.06.2018 / 08:38
0

Sem saber como você está gerenciando os buckets s3, isso pode ou não ser particularmente útil.

As ferramentas da AWS CLI têm uma opção chamada "sync", que pode ser particularmente eficaz para garantir que o s3 tenha os objetos corretos. Se você ou seus usuários estiverem gerenciando o S3 a partir de um sistema de arquivos local, você poderá economizar uma tonelada de trabalho determinando quais objetos precisam ser excluídos usando as ferramentas CLI.

link

    
por 02.04.2015 / 21:42