Athena를 사용하여 Amazon S3 서버 액세스 로그를 분석하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 10월 7일

Amazon Athena에서 Amazon Simple Storage Service(Amazon S3) 서버 액세스를 쿼리하는 방법은 무엇입니까?

해결 방법

Amazon S3에서는 서버 액세스 로그를 S3 버킷에 객체로 저장합니다. Athena를 사용하여 서버 액세스 로그를 빠르게 분석하고 쿼리할 수 있습니다.

1.    아직 활성화하지 않은 경우 S3 버킷에 대한 서버 액세스 로깅을 활성화합니다. Target bucket(대상 버킷)Target prefix(대상 접두사)의 값을 기록해 둡니다. Athena 쿼리에서 Amazon S3 위치를 지정하려면 이 두 개의 값이 모두 필요합니다.

2.    Athena 콘솔을 엽니다.

3.    [쿼리 편집기(Query editor)]에서 DDL 문을 실행하여 데이터베이스를 만듭니다. S3 버킷과 동일한 리전에 데이터베이스를 생성하는 것이 모범 사례입니다.

create database s3_access_logs_db

4.    데이터베이스에 테이블 스키마를 생성합니다. 다음 예에서 STRING BIGINT 데이터 형식 값은 액세스 로그 속성입니다. Athena에서 이 속성을 쿼리할 수 있습니다. [위치(LOCATION)]에 1단계의 S3 버킷 및 접두사 경로를 입력합니다. 접두사 끝에 슬래시(/)를 포함해야 합니다(예: s3://doc-example-bucket/prefix/).

CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.mybucket_logs(
         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 BIGINT,
         ObjectSize BIGINT,
         TotalTime STRING,
         TurnAroundTime STRING,
         Referrer STRING,
         UserAgent STRING,
         VersionId STRING,
         HostId STRING,
         SigV STRING,
         CipherSuite STRING,
         AuthType STRING,
         EndPoint STRING,
         TLSVersion STRING
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
LOCATION 's3://doc-example-bucket/prefix/'

5.    왼쪽 창의 [테이블(Tables)]에서 테이블 이름 옆에 있는 메뉴 버튼의 [테이블 미리 보기(Preview table)]를 선택합니다. [결과(Results)] 창에 서버 액세스 로그의 데이터(예: bucketowner, bucketrequestdatetime)가 보이면 Athena 테이블을 성공적으로 생성한 것입니다. 이제 Amazon S3 서버 액세스 로그를 쿼리할 수 있습니다.

쿼리의 예

삭제한 객체의 로그를 찾으려면

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
key = 'images/picture.jpg' AND operation like '%DELETE%';

객체를 삭제한 사람과 시간(타임스탬프, IP 주소 및 AWS Identity and Access Management(IAM) 사용자)을 표시하려면

SELECT requestdatetime, remoteip, requester, key FROM s3_access_logs_db.mybucket_logs WHERE 
key = 'images/picture.jpg' AND operation like '%DELETE%';

IAM 사용자가 실행한 모든 작업을 표시하려면

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
requester='arn:aws:iam::123456789123:user/user_name';

특정 기간에 객체에 수행한 모든 작업을 표시하려면

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg' AND
parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2020-09-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2020-09-18:08:00:00','yyyy-MM-dd:HH:mm:ss');

특정 기간에 특정 IP 주소로 전송된 데이터의 양을 표시하려면

SELECT SUM(bytessent) as uploadtotal, 
SUM(objectsize) as downloadtotal, 
SUM(bytessent + objectsize) AS total FROM s3_access_logs_db.mybucket_logs WHERE remoteIP='1.2.3.4' and parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2020-07-01','yyyy-MM-dd') and parse_datetime('2020-08-01','yyyy-MM-dd');

서버 액세스 로그 버킷의 수명 주기 정책을 생성하는 것이 가장 좋습니다. 주기적으로 로그 파일을 제거하도록 수명 주기 정책을 구성하십시오. 그러면 Athena에서 쿼리마다 분석하는 데이터의 양이 줄어듭니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?