로그가 있는 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 명령 하나를 실행하는 데만 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

관련 정보