ログを含む s3 バケット内を検索する

ログを含む s3 バケット内を検索する

Amazon S3 バケットのサブフォルダにある多数の .gz ファイル内の文字列を検索するにはどうすればよいでしょうか? s3fs と zgrep を使ってマウントしようとしましたが、非常に遅いです。他の方法を使用していますか?

おそらく、それらをすばやく zgrep するために使用できる Amazon のサービスはありますか?

答え1

最も早い方法は、まずローカルにコピーしてから、ローカルで zgrep を実行することです。

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

cpこれにより、すべてのログが現在のディレクトリ ( ) にコピーされ ( ) .、すべてのサブフォルダも含まれます ( --recursive)。

次にローカルzgrep

zgrep "search words" *.gz

または、サブディレクトリも再帰的に検索するには:

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

(出典:出典: unix.stackexchange.com

答え2

ではありませんgrepが、ログを照会できるようになりました。アテナ:

初め、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/'

次に、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;

答え3

私も同じ問題を抱えていました。ファイルをダウンロードして zgrep で実行する Python スクリプトを書いてみました。しかし、grep コマンドを 1 つ実行するだけで 30 秒かかりました。ファイルも 200 MB ほどあったので、全体の時間は非常に長くなりました。そして、何百ものファイルに対して同じことを実行する必要がありました。

私の場合は、lambda 関数を記述し、それをさまざまな .gz ファイルに対して並列実行しました。/tmp ストレージを使用して、lambda インスタンスの .gz ファイルをダウンロードし、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)

複数の lambda インスタンスを使用すると、少なくとも数倍高速化できます。ただし、lambda の tmp ストレージには 500 MB のストレージしかないことに注意してください。

答え4

2023年現在:

  • 「Amazon S3のマウントポイント」を使用してgrepするか、

  • cloudgrep を次のように使用します。

    cloudgrep --bucket your_bucket --query your_query

関連情報