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

최종 업데이트 날짜: 2019년 5월 16일

Amazon Athena에서 Amazon Simple Storage Service(Amazon S3) 서버 액세스 로그를 쿼리하려면 어떻게 해야 합니까?

​해결 방법

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

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

s3://awsexamplebucket-logs/prefix

2.    Athena 콘솔을 엽니다.

3.    쿼리 편집기에서 다음과 유사한 명령을 실행하여 데이터베이스를 생성합니다.
참고: 모범 사례는 S3 버킷과 동일한 AWS 리전에 데이터베이스를 생성하는 것입니다.

create database s3_access_logs_db

4.    쿼리 편집기에서 다음과 유사한 명령을 실행하여 3단계에서 생성한 데이터베이스에 테이블 스키마를 생성합니다. STRINGBIGINT 데이터 유형 값은 액세스 로그 속성입니다. Athena에서 이러한 속성을 쿼리할 수 있습니다. LOCATION의 경우 1단계의 S3 버킷 및 접두사 경로를 입력합니다.

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://awsexamplebucket-logs/prefix'

5.    왼쪽 창의 [Tables] 아래, 테이블 이름 옆에 있는 메뉴 버튼에서 [Preview table]을 선택합니다.

[Results] 창에 서버 액세스 로그(예: bucketowner, bucketrequestdatetime)가 표시되면 Athena 테이블이 성공적으로 생성된 것입니다. 이제 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('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2017-02-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('2017-06-01','yyyy-MM-dd') and parse_datetime('2017-07-01','yyyy-MM-dd');

모범 사례는 서비스 액세스 로그 버킷에 대한 S3 수명 주기 정책을 생성하는 것입니다. 로그 파일을 주기적으로 제거하는 수명 주기 정책을 구성합니다. 이러한 정책을 구성하면 Athena에서 각 쿼리에 대해 분석되는 데이터의 양이 줄어듭니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?