Pesquise dentro do bucket s3 com logs

Pesquise dentro do bucket s3 com logs

Como procurar uma string dentro de vários arquivos .gz na subpasta do bucket do Amazon S3? Tentei montá-lo via s3fs e zgrep mas é muuuito lento. Você usa algum outro método?

Talvez exista algum serviço da Amazon que eu possa usar para fazer o zgrep rapidamente?

Responder1

Acho que a maneira mais rápida é copiá-los localmente primeiro e depois fazer um zgrep local:

aws s3 cp s3://bucket/containing/the/logs . --recursive

Isso copiará ( cp) todos os logs para o diretório atual ( .) e incluirá também todas as subpastas ( --recursive).

Então um local zgrep:

zgrep "search words" *.gz

Ou também para pesquisar subdiretórios recursivamente:

find -name \*.gz -print0 | xargs -0 zgrep "STRING"

(Tirado deunix.stackexchange.com.)

Responder2

Não é grep, mas agora você pode consultar logs comAtenas:

Primeiro,crie uma tabela do seu bucket S3:

CREATE EXTERNAL TABLE IF NOT EXISTS S3Accesslogs(
  BucketOwner string,
  Bucket string,
  RequestDateTime string,
  RemoteIP string,
  Requester string,
  RequestID string,
  Operation string,
  Key string,
  RequestURI_operation string,
  RequestURI_key string,
  RequestURI_httpProtoversion string,
  HTTPstatus string,
  ErrorCode string,
  BytesSent string,
  ObjectSize string,
  TotalTime string,
  TurnAroundTime string,
  Referrer string,
  UserAgent string,
  VersionId string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
 'serialization.format' = '1',
  'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)$'
) 
LOCATION 's3://s3-server-access/logs/'

Então, você pode consultá-lo com SQL:

SELECT requestdatetime, bucket, remoteip, requesturi_key
FROM s3accesslogs
WHERE bucket IN ('bucket1', 'bucket2')
    AND remoteip = '123.45.67.89'
ORDER BY requestdatetime DESC
LIMIT 100;

Responder3

Eu tive o mesmo problema. Tentei escrever um script python para baixar o arquivo e executá-lo através do zgrep. Mas demorou 30 segundos apenas para executar um comando grep. Os arquivos também tinham cerca de 200 MB, então o tempo geral foi muito alto. E tive que fazer isso para centenas de arquivos.

No meu caso, escrevi uma função lambda e executei-a paralelamente para diferentes arquivos .gz. Use o armazenamento /tmp para baixar o arquivo .gz para uma instância lambda e execute zgrep.

os.chdir('/tmp/') os.mkdir('s3_logs') os.chdir('s3_logs') s3.download_file(Bucket, s3object, '/tmp/s3_logs/file.gz') query = 'zgrep String file.gz' result = os.popen(query).read() print(result)

Várias instâncias de lambda podem torná-lo pelo menos algumas vezes mais rápido. Embora lembre-se de que o armazenamento tmp para lambda possui apenas 500 MB de armazenamento.

Responder4

Agora em 2023:

  • Use "Mountpoint for Amazon S3" e depois grep; OU

  • Use cloudgrep com:

    cloudgrep --bucket seu_bucket --query sua_consulta

informação relacionada