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

5분 분량
0

Amazon Athena에서 Amazon Simple Storage Service(S3) 서버 액세스 로그를 쿼리하고 싶습니다.

해결 방법

Amazon S3에서는 서버 액세스 로그를 S3 버킷에 개체로 저장합니다. 다음 단계에 따라 Athena를 사용하여 S3 쿼리 서버 액세스 로그를 분석하고 사용하세요.

  1. 아직 켜지 않았다면 S3 버킷의 서버 액세스 로깅을 켭니다. 대상 버킷대상 접두사의 값을 기록해 둡니다. Athena 쿼리에서 Amazon S3 위치를 지정하려면 두 가지 모두 필요합니다.
    참고: 로그 개체 키 형식의 경우 날짜 기반 파티셔닝을 선택하여 분석 및 쿼리 애플리케이션의 속도를 높일 수 있습니다.

  2. Amazon Athena 콘솔을 엽니다.
    참고: 첫 번째 쿼리를 실행하기 전에 Amazon S3에 쿼리 결과 위치를 설정해야 할 수 있습니다.

  3. 쿼리 편집기에서 DDL 문을 실행하여 데이터베이스 생성을 합니다.
    참고: S3 버킷과 동일한 AWS 리전에 데이터베이스를 생성하는 것이 가장 좋습니다.

    create database s3_access_logs_db
  4. 데이터베이스에 테이블 스키마를 생성합니다. 다음 예시에서 STRINGBIGINT 데이터 유형 값은 액세스 로그 속성입니다. Athena에서 이들 속성을 쿼리할 수 있습니다. LOCATION에 1단계의 S3 버킷과 접두사 경로를 입력합니다. 접두사 끝에 슬래시(/)를 포함해야 합니다(예: s3://doc-example-bucket/prefix/). 접두사를 사용하지 않는 경우, 버킷 이름 끝에 슬래시(/)를 포함하세요(예: s3://doc-example-bucket/).

    CREATE EXTERNAL TABLE s3_access_logs_db.mybucket_logs(
     `bucketowner` STRING,
     `bucket_name` STRING,
     `requestdatetime` STRING,
     `remoteip` STRING,
     `requester` STRING,
     `requestid` STRING,
     `operation` STRING,
     `key` STRING,
     `request_uri` 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,
     `accesspointarn` STRING,
     `aclrequired` STRING)
     PARTITIONED BY (
       `timestamp` string)
    ROW FORMAT SERDE
     'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
     'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$')
    STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION
     's3://bucket-name/prefix-name/account-id/region/source-bucket-name/'
     TBLPROPERTIES (
      'projection.enabled'='true',
      'projection.timestamp.format'='yyyy/MM/dd',
      'projection.timestamp.interval'='1',
      'projection.timestamp.interval.unit'='DAYS',
      'projection.timestamp.range'='2024/01/01,NOW',
      'projection.timestamp.type'='date',
      'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
  5. 왼쪽 창의 테이블 아래에서 테이블 이름 옆의 줄임표를 선택한 다음 테이블 미리 보기를 선택합니다. 결과 창에 서버 액세스 로그의 데이터가 표시되면, Athena 테이블을 성공적으로 생성한 것입니다. 데이터는 bucketowner, bucket_namerequestdatetime 등의 값처럼 보입니다.

이제 Amazon S3 서버 액세스 로그를 쿼리할 수 있습니다.

예시 쿼리

삭제된 개체의 요청을 찾으려면 다음 쿼리를 사용하세요.

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

403 Access Denied 오류가 발생한 요청의 Amazon S3 요청 ID를 표시하려면 다음 쿼리를 사용하세요.

SELECT requestdatetime, requester, operation, requestid, hostid FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus = '403';

키와 오류 코드가 포함된 특정 기간의 HTTP 5xx 오류의 Amazon S3 요청 ID를 찾으려면 다음 쿼리를 사용하세요.

SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid FROM s3_access_logs_db.mybucket_logs WHERE httpstatus like '5%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

타임스탬프, 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 timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간 동안 IP 주소로 전송된 데이터의 양을 확인하려면 다음 쿼리를 사용하세요.

SELECT coalesce(SUM(bytessent), 0) AS bytessentTOTAL
FROM s3_access_logs_db.mybucket_logs
WHERE RemoteIP='1.2.3.4'AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간에 수명 주기 규칙에 의해 수행된 모든 만료 작업을 표시하려면 다음 쿼리를 사용하세요.

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간에 만료된 개체 수를 계산하려면 다음 쿼리를 사용하세요.

SELECT count(*) as ExpireCount FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간에 수명 주기 규칙에 따라 실행된 전환 작업 전체를 표시하려면 다음 쿼리를 사용하세요.

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE operation like 'S3.TRANSITION%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Signature Version별로 그룹화된 요청자 전체를 표시하려면 다음 쿼리를 사용하세요.

SELECT requester, Sigv, Count(Sigv) as SigCount
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, Sigv;

특정 기간에 요청을 한 익명 요청자를 모두 표시하려면 다음 쿼리를 사용하세요.

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간에 PUT 개체 요청을 보낸 요청자를 모두 표시하려면 다음 쿼리를 사용하세요.

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간에 GET 개체 요청을 보낸 요청자를 모두 표시하려면 다음 쿼리를 사용하세요.

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

특정 기간에 처리 시간이 가장 긴 순서대로 정렬된 요청자를 모두 표시하려면 다음 쿼리를 사용하세요.

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE NOT turnaroundtime='-'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
ORDER BY CAST(turnaroundtime AS INT) DESC;

**참고:**시간이 지남에 따라 S3 버킷 내 개체 수가 증가하므로 쿼리는 더 많은 데이터를 처리합니다. 서버 액세스 로그 버킷의 수명 주기 정책을 만드는 것이 가장 좋습니다. 주기적으로 로그 파일을 제거하도록 수명 주기 정책을 구성합니다. 이렇게 하면 Athena가 각 쿼리를 분석하는 데이터의 양이 줄어듭니다.

관련 정보

Amazon OpenSearch Service를 사용한 Amazon S3 서버 액세스 로그 분석

Amazon S3 서버 액세스 로그 형식

AWS 서비스 로그 쿼리

AWS 공식
AWS 공식업데이트됨 3달 전