s3 버킷에서 로그 검색

s3 버킷에서 로그 검색

Amazon S3 버킷의 하위 폴더에 있는 다수의 .gz 파일에서 문자열을 검색하는 방법은 무엇입니까? s3fs와 zgrep을 통해 설치를 시도했지만 너무 느렸습니다. 사용하는 다른 방법이 있나요?

Amazon 서비스를 사용하여 빠르게 zgrep할 수 있을까요?

답변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 명령을 실행하는 데만 30초가 걸립니다. 파일 용량도 200MB 정도라서 전체 시간이 매우 깁니다. 수백 개의 파일에 대해 이 작업을 수행해야 합니다.

제 경우에는 람다 함수를 작성하고 여러 .gz 파일에 대해 병렬로 실행했습니다. /tmp 스토리지를 사용하여 람다 인스턴스의 .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)

람다의 여러 인스턴스를 사용하면 속도가 최소한 몇 배 더 빨라질 수 있습니다. 람다의 tmp 저장 공간은 500MB에 불과하다는 점을 명심하세요.

답변4

이제 2023년까지:

  • "Amazon S3용 마운트포인트"를 사용한 다음 grep을 사용하십시오.

  • cloudgrep을 사용하여 다음을 수행합니다.

    cloudgrep --bucket your_bucket --query your_query

관련 정보