A AWS oferece suporte à exclusão em massa de até 1000 objetos por solicitação usando a API REST S3 e seus vários wrappers. Este método pressupõe que você conhece as chaves de objeto do S3 que deseja remover (ou seja, não foi projetado para lidar com algo como uma política de retenção, arquivos com mais de um determinado tamanho etc.).
A API REST S3 pode especificar até 1000 arquivos a serem excluídos em uma única solicitação, o que deve ser mais rápido que fazer solicitações individuais. Lembre-se, cada solicitação é uma solicitação HTTP (portanto, TCP). Portanto, cada solicitação é sobrecarregada. Você só precisa conhecer as chaves dos objetos e criar uma solicitação HTTP (ou usar um wrapper no seu idioma preferido). 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!
Suponho que o seu caso de uso envolva usuários finais especificando vários arquivos específicos para excluir ao mesmo tempo. Em vez de iniciar uma tarefa como "limpar todos os objetos que se referem a arquivos de imagem" ou "limpar todos os arquivos anteriores a uma determinada data" (que eu acredito que seja fácil de configurar separadamente no S3).
Nesse caso, você saberá as chaves que precisa excluir. Isso também significa que o usuário receberá mais feedback em tempo real sobre se o arquivo foi excluído ou não com sucesso. As referências às chaves exatas devem ser muito rápidas, pois o S3 foi projetado para ser dimensionado com eficiência, apesar de lidar com uma quantidade extremamente grande de dados.
Caso contrário, você pode procurar chamadas de API assíncronas. Você pode ler um pouco sobre como eles funcionariam em geral nesta postagem do blog ou procurar como fazê-lo 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 pode ser executado sem fazer o usuário esperar. Ou, você pode transferir a solicitação para uma fila. . . Mas essas duas opções complicam desnecessariamente o seu código (o código assíncrono pode ser irritante) ou o seu ambiente (você precisaria de um serviço / daemon / container / servidor para lidar com a fila. Portanto, evitaria esse cenário, se possível.
Editar: não tenho reputação de postar mais de 2 links. Mas você pode ver os comentários da Amazon sobre taxa de solicitação e desempenho aqui: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html E o FAQ do s3 comenta que o deleiton em massa é o caminho a percorrer, se possível.
aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys
e, em seguida, removendo objetos (bastava que um processo paralelo atingisse os limites de taxa para exclusão de objetos):tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
_
final :) Perdi e demorei um pouco para entender por que o primeiro elemento foi ignorado. O ponto é quebash -c
passa todos os argumentos como parâmetros posicionais, começando com$0
, enquanto "$ @" processa apenas parâmetros começando com$1
. Portanto, o manequim de sublinhado é necessário para preencher a posição de$0
.split -l 1000
dividir meu arquivo de chaves em 1000 lotes de chaves. Agora, para cada arquivo, posso emitir o comando delete e excluir o arquivo. Se algo der errado, eu posso continuar.aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'
que seria mais simples e você pode adicionar um| grep
para filtrar isso a partir daí.Fiquei frustrado com o desempenho do console da web para esta tarefa. Eu descobri que o comando da 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 grandes, isso pode levar uma quantidade considerável de tempo. Você pode configurá-lo em uma sessão
tmux
ouscreen
e verificar mais tarde.fonte
aws s3 rm --recursive
comando exclui arquivos individualmente. Embora mais rápido do que o console da web, ao excluir lotes de arquivos, poderia ser muito mais rápido se excluída a granelUm truque interessante é usar regras de ciclo de vida para lidar com a exclusão para você. Você pode enfileirar uma regra para excluir o prefixo ou os objetos desejados e a Amazon cuidará apenas da exclusão.
https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
fonte
Sem saber como você está gerenciando os buckets s3, isso pode ou não ser particularmente útil.
As ferramentas da CLI da AWS têm uma opção chamada "sincronização", 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, poderá economizar muito trabalho determinando quais objetos precisam ser excluídos usando as ferramentas da CLI.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
fonte
Já mencionamos o
s3 sync
comando antes, mas sem exemplo e palavra sobre a--delete
opção.Eu achei a maneira mais rápida de excluir o conteúdo da pasta no
S3
bucketmy_bucket
:fonte