Como você pesquisa um bucket da amazon s3?

Respostas:

31

O S3 não possui uma "pesquisa neste depósito" nativa, pois o conteúdo real é desconhecido - além disso, como o S3 é baseado em chave / valor, não há maneira nativa de acessar muitos nós ao mesmo tempo, além de mais datastores tradicionais que oferecem um (SELECT * FROM ... WHERE ...)(em um SQL modelo).

O que você precisará fazer é executar ListBucketpara obter uma lista de objetos no bucket e iterar sobre cada item que executa uma operação personalizada que você implementa - que é sua pesquisa.

Cody Caughlan
fonte
42
Este não é mais o caso. Veja a resposta da rhonda abaixo: stackoverflow.com/a/21836343/1101095
Nate
11
Para todos os defensores do comentário acima: o OP não indica se eles estão querendo pesquisar os nomes dos arquivos ou o conteúdo da chave (por exemplo, o conteúdo do arquivo). Portanto, a resposta de @ rhonda ainda pode não ser suficiente. Parece que, em última análise, este é um exercício deixado para o consumidor, pois o uso do console S3 dificilmente está disponível para os usuários do aplicativo e para os usuários em geral. Basicamente, é apenas uma revelação do proprietário do bucket e / ou das funções do IAM.
Cody Caughlan
Existe algum serviço de indexação como o lucene.net para indexar esses documentos do bucket.
Munavvar 8/08/16
Continuei voltando a esta resposta e construí uma ferramenta para ajudar: bucketsearch.net - permite pesquisa de caracteres curinga etc.
Jon M
251

Apenas uma observação para adicionar aqui: agora, três anos depois, essa postagem está no topo do Google quando você digita "Como pesquisar em um balde S3".

Talvez você esteja procurando por algo mais complexo, mas se você chegou aqui tentando descobrir como simplesmente encontrar um objeto (arquivo) por seu título, é uma loucura simples:

abra o bucket, selecione "none" no lado direito e comece a digitar o nome do arquivo.

http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html

rhonda bradley
fonte
43
Era exatamente isso que eu estava procurando. Terrível design de experiência do usuário para ter zero pistas visuais
Keith Entzeroth
2
É necessário selecionar um arquivo no balde e começar a digitar.
Cabe56
30
Ainda assim, vamos procurar pelo prefixo do nome do item.
Daniel Flippance
21
Isso é absolutamente irritante! As pessoas estão falando sobre algo no lado direito ou sobre uma caixa amarela, mas não consigo encontrar nada. Apenas a mesma mensagem "Digite um prefixo ...". Como o "Balde de Pesquisa" não é o padrão? É quase como não detectável como software Atlassian ...
vegather
40
Essa resposta ainda é atual? Não vejo nenhum "" nenhum "no lado direito" e o link da documentação na resposta agora encaminha para uma página diferente.
BiscuitBaker
112

Aqui está uma maneira curta e feia de pesquisar nomes de arquivos usando a CLI da AWS :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Abe Voelker
fonte
1
aws s3 ls s3: // seu balde - recursivo | grep sua pesquisa Foi bom o suficiente para a minha pesquisa, obrigado Abe Voelker.
precisa saber é o seguinte
3
Todos os baldes: aws s3 ls | awk '{print $ 3}' | enquanto lê linha; faça eco de $ line; aws s3 ls s3: // $ line --recursive | grep sua pesquisa; feito
Akom
1
o que é cut -c 32 sem esta também busca está trabalhando
Sunil
1
cut -c 32-apenas retira as informações de data e hora do tamanho do arquivo da saída, que no meu sistema ocupa 32 caracteres. Você não precisa, mas se estiver canalizando a saída para outro comando, pode ser útil ter uma saída "limpa".
Abe Voelker
CLI suporta include/exclude. Então,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish
25

Existem (pelo menos) dois casos de uso diferentes que podem ser descritos como "pesquisar no bucket":

  1. Procure algo dentro de cada objeto armazenado no balde; isso assume um formato comum para todos os objetos desse bloco (por exemplo, arquivos de texto), etc. etc. Para algo assim, você é forçado a fazer o que Cody Caughlan acabou de responder. A documentação do AWS S3 possui um código de exemplo que mostra como fazer isso com o AWS SDK para Java: Listando Chaves Usando o AWS SDK para Java (lá você também encontrará exemplos de PHP e C #).

  2. Item de lista Pesquise algo nas chaves do objeto contidas nesse bucket; S3 faz ter parcial de suporte para esta, sob a forma de prefixo permitindo correspondências exactas + colapso partidas após um delimitador. Isso é explicado em mais detalhes no AWS S3 Developer Guide . Isso permite, por exemplo, implementar "pastas" usando como chaves de objeto algo como

    pasta / subpasta / arquivo.txt
    Se você seguir esta convenção, a maioria das GUIs do S3 (como o AWS Console) mostrará uma exibição de pasta do seu bucket.

Eduardo Pareja Tobes
fonte
docs para o uso do prefixo em ruby
James
22

A AWS lançou um novo serviço para consultar os buckets S3 com SQL: Amazon Athena https://aws.amazon.com/athena/

hellomichibye
fonte
2
argh ... eu entendo ... "Athena não está disponível no oeste dos EUA (norte da Califórnia). Por favor, selecione outra região."
Clintm
2
É uma sobrecarga com toda essa SQL consulta considerando eu só grep queria
Ali Gajani
4
@Clintm - mude para us-east-1 (N. Virginia)
slocumro
21

Existem várias opções, nenhuma sendo a solução de texto completo "one shot" simples:

  1. Pesquisa de padrão de nome de chave : pesquisando chaves começando com alguma string - se você projetar nomes de chave com cuidado, poderá ter uma solução bastante rápida.

  2. Pesquise metadados anexados às chaves : ao postar um arquivo no AWS S3, você pode processar o conteúdo, extrair algumas informações meta e anexá-las na forma de cabeçalhos personalizados à chave. Isso permite que você busque nomes de chaves e cabeçalhos sem precisar buscar conteúdo completo. A pesquisa deve ser feita sequencialmente, não existe uma opção de pesquisa "semelhante ao sql" para isso. Com arquivos grandes, isso pode economizar muito tráfego e tempo da rede.

  3. Armazene metadados no SimpleDB : como o ponto anterior, mas com o armazenamento dos metadados no SimpleDB. Aqui você tem sql como instruções select. No caso de conjuntos de dados grandes, você pode atingir os limites do SimpleDB, que podem ser superados (particionar metadados em vários domínios do SimpleDB), mas se você for realmente longe, poderá precisar usar outro tipo de banco de dados de metedados.

  4. Pesquisa sequencial de texto completo do conteúdo - processando todas as chaves uma por uma. Muito lento, se você tiver muitas chaves para processar.

Estamos armazenando 1440 versões de um arquivo por dia (uma por minuto) por alguns anos, usando o depósito de versão, isso é facilmente possível. Mas obter uma versão mais antiga leva tempo, já que é preciso executar sequencialmente versão por versão. Às vezes, eu uso um índice CSV simples com registros, mostrando o tempo de publicação mais o ID da versão. Com isso, eu poderia pular para a versão mais antiga rapidamente.

Como você vê, o AWS S3 não é, por si só, projetado para pesquisas de texto completo, é um serviço de armazenamento simples.

Jan Vlcinsky
fonte
4

Pesquisa por prefixo no console S3

diretamente na exibição de bucket do AWS Console.

insira a descrição da imagem aqui

Copiar arquivos desejados usando s3-dist-cp

Quando você tem milhares ou milhões de arquivos, outra maneira de obter os arquivos desejados é copiá-los para outro local usando a cópia distribuída . Você executa isso no EMR em um trabalho do Hadoop. O interessante da AWS é que eles fornecem sua versão S3 personalizada s3-dist-cp . Permite agrupar arquivos desejados usando uma expressão regular no campo groupBy. Você pode usar isso, por exemplo, em uma etapa personalizada no EMR

[
    {
        "ActionOnFailure": "CONTINUE",
        "Args": [
            "s3-dist-cp",
            "--s3Endpoint=s3.amazonaws.com",
            "--src=s3://mybucket/",
            "--dest=s3://mytarget-bucket/",
            "--groupBy=MY_PATTERN",
            "--targetSize=1000"
        ],
        "Jar": "command-runner.jar",
        "Name": "S3DistCp Step Aggregate Results",
        "Type": "CUSTOM_JAR"
    }
]
H6
fonte
Parece que a exibição de bucket do console da AWS não vai de arquivo em arquivo que aplica um filtro. É capaz de retornar resultados extremamente rápidos, desde que uma substring do (s) arquivo (s) que eu estou procurando. Existe um cliente / ferramenta / API que eu possa usar que não seja o console da AWS para obter os resultados da mesma maneira oportuna. @ high6. No passado, tentei usar o boto, mas a melhor abordagem parecia iterar todo o intervalo, aplicando seus critérios de pesquisa a todos os nomes de arquivos. IE. extremamente lento
Copie e cole
4

Se você estiver no Windows e não tiver tempo para encontrar uma boa grepalternativa, uma maneira rápida e suja seria:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

e faça uma pesquisa rápida em myfile.txt

O bit "pasta" é opcional.

PS se você não tiver o AWS CLI instalado - aqui está uma lista usando o gerenciador de pacotes Chocolatey

choco install awscli

PPS Se você não possui o gerenciador de pacotes Chocolatey - compre! Sua vida no Windows ficará 10 vezes melhor. (Eu não sou afiliado ao Chocolatey de forma alguma, mas, ei, é realmente necessário).

Alex
fonte
Se o usuário pode choco instalar o awscli, ele pode instalar o grep, não? Ou use a localização nativa do Windows?
22619 Dean Radcliffe
2

Como você está na AWS ... Eu acho que você gostaria de usar as ferramentas do CloudSearch. Coloque os dados que deseja pesquisar no serviço deles ... aponte para as teclas S3.

http://aws.amazon.com/cloudsearch/

Andrew Siemer
fonte
7
Não é realmente o que o OP estava procurando em tudo
Clintm
para mim, isso significaria salvar lá todos os dados - duplicação de dados
BG de Bruno
1

Outra opção é espelhar o bucket do S3 no servidor da Web e percorrer localmente. O truque é que os arquivos locais estão vazios e usados ​​apenas como esqueleto. Como alternativa, os arquivos locais podem conter metadados úteis que você normalmente precisaria obter do S3 (por exemplo, tamanho do arquivo, tipo mimético, autor, carimbo de data / hora, uuid). Ao fornecer um URL para baixar o arquivo, pesquise localmente e forneça um link para o endereço S3.

A transferência de arquivos local é fácil e essa abordagem para o gerenciamento do S3 é independente de idioma. O deslocamento de arquivo local também evita manter e consultar um banco de dados de arquivos ou atrasos, fazendo uma série de chamadas remotas à API para autenticar e obter o conteúdo do bucket.

Você pode permitir que os usuários enviem arquivos diretamente para o servidor via FTP ou HTTP e depois transfira um lote de arquivos novos e atualizados para a Amazon nos horários de pico, recorrendo apenas aos diretórios de arquivos de qualquer tamanho. Na conclusão de uma transferência de arquivos para a Amazon, substitua o arquivo do servidor da web por um vazio com o mesmo nome. Se um arquivo local tiver algum tamanho de arquivo, atenda-o diretamente porque está aguardando transferência em lote.

Dylan Valade
fonte
Ótima maneira de explodir o espaço de armazenamento do nó em um disco EXTFS2 / 3 se você tiver milhões de arquivos no seu balde S3 ...
tpartee 17/03
1

O jeito que eu fiz é: tenho milhares de arquivos no s3. Eu vi o painel de propriedades de um arquivo na lista. Você pode ver o URI desse arquivo e eu copio colo no navegador - era um arquivo de texto e era renderizado de maneira adequada. Agora troquei o uuid no URL pelo uuid que eu tinha em mãos e bum lá está o arquivo.

Gostaria que a AWS tivesse uma maneira melhor de pesquisar um arquivo, mas isso funcionou para mim.

Rosa
fonte
1

Tente este comando:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

Em seguida, você pode canalizar isso para um grep para obter tipos de arquivos específicos e fazer o que quiser com eles.

Robert Evans
fonte
1
Nota: --output textespecifica que a saída será texto sem formatação, não JSON etc., e --query 'Contents[].{Key: Key, Size: Size}'apenas filtra a saída da lista para o nome e o tamanho do arquivo. Ele não procura Key: Keyou algo parecido.
Matt
1

Eu tentei da seguinte maneira

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

Isso gera o caminho real onde o arquivo existe

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv
Dheeraj
fonte
1

Esse é um tópico pouco antigo - mas talvez ajude alguém que ainda pesquisa - sou eu que procuro por um ano.

A solução pode ser " AWS Athena ", onde você pode pesquisar dados como este

'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

Atualmente, o preço é de US $ 5 para dados de 1 TB - por exemplo, se sua consulta pesquisar um arquivo de 1 TB três vezes o custo é de US $ 15 - mas, por exemplo, se houver apenas 1 coluna no "formato colunar convertido" que você deseja ler, pagará 1 / 3 de preço significa US $ 1,67 / TB.

BG Bruno
fonte
Não parece ser viável para qualquer aplicação que requer busca intensiva como o custo é bastante elevado, mas ...
tnkh
@tnkh Concordo - Eu gostaria de mais opções com # s3 também
BG de Bruno
0

Fiz algo como abaixo para encontrar padrões no meu balde

def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
    var s3Client = new AmazonS3Client()
    var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
    var objectListing: ObjectListing = null
    var res: List[String] = List()

    do {
      objectListing = s3Client.listObjects(listObjectsRequest)
      res = res ++ objectListing.getCommonPrefixes
      listObjectsRequest.setMarker(objectListing.getNextMarker)
    } while (objectListing.isTruncated)
    res
  }

Para depósitos maiores, isso consome muito tempo, pois todos os resumos de objetos são retornados pelo Aws e não apenas aqueles que correspondem ao prefixo e ao delimitador. Estou procurando maneiras de melhorar o desempenho e, até agora, descobri que devo nomear as chaves e organizá-las adequadamente em baldes.

Raghvendra Singh
fonte
0

Eu enfrentei o mesmo problema. Pesquisando no S3 deve ser muito mais fácil do que a situação atual. Por isso, implementei essa ferramenta de código aberto para pesquisar no S3.

SSEARCH é uma ferramenta de pesquisa S3 de código aberto completo. Ele foi implementado sempre tendo em mente que o desempenho é o fator crítico e, de acordo com os benchmarks, ele pesquisa no bucket que contém ~ 1000 arquivos em segundos.

A instalação é simples. Você só baixa o arquivo docker-compose e o executa com

docker-compose up

O SSEARCH será iniciado e você poderá pesquisar qualquer coisa em qualquer bucket que tiver.

Arda Güçlü
fonte
0

Avance para 2020, e use o aws-okta como nosso 2fa, o comando a seguir, enquanto lento demais para percorrer todos os objetos e pastas neste bucket em particular (+270.000) funcionou bem.

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
jamescampbell
fonte
0

Use o Amazon Athena para consultar o bucket do S3. Além disso, carregue dados na pesquisa do Amazon Elastic. Espero que isto ajude.

Me pergunte
fonte
0

Não é uma resposta técnica, mas criei um aplicativo que permite a pesquisa de caracteres curinga: https://bucketsearch.net/

Ele indexará assincronamente o seu bucket e permitirá que você pesquise os resultados.

É grátis (donationware).

Jon M
fonte