Amazon S3 서버 접근 로그로 요청 식별

Amazon S3 서버 접근 로그로 요청 식별

Amazon S3 서버 접근 로그로 Amazon S3 요청을 식별할 수 있어요.

참고:

  • Amazon S3 요청을 식별하려면 Amazon S3 서버 접근 로그 대신 AWS CloudTrail 데이터 이벤트를 사용할 것을 권장해요. CloudTrail 데이터 이벤트는 설정이 더 쉽고 더 많은 정보를 포함해요. 자세한 내용은 "CloudTrail로 Amazon S3 요청 식별"을 참고하세요.
  • 접근 요청 수에 따라 로그 분석이 CloudTrail 데이터 이벤트를 사용하는 것보다 더 많은 리소스나 시간이 필요할 수 있어요.

출처: 문서

본문

Amazon Athena로 요청 접근 로그 조회

Amazon Athena로 Amazon S3 접근 로그를 사용해 Amazon S3 요청을 식별할 수 있어요.

Amazon S3는 서버 접근 로그를 S3 버킷의 객체로 저장해요. Amazon S3의 로그를 분석할 수 있는 도구를 사용하는 것이 종종 더 쉬워요. Athena는 S3 객체 분석을 지원하며 Amazon S3 접근 로그를 조회하는 데 사용할 수 있어요.

예시 — 다음 예시는 Amazon Athena에서 Amazon S3 서버 접근 로그를 조회하는 방법을 보여줘요. 다음 예시에 사용된 user input placeholders를 자신의 정보로 바꾸세요.

참고: Athena 쿼리에서 Amazon S3 위치를 지정하려면 로그가 전달되는 버킷에 대한 S3 URI를 제공해야 해요. 이 URI는 s3://amzn-s3-demo-bucket1-logs/prefix/ 형식으로 버킷 이름과 접두사를 포함해야 해요.

  1. https://console.aws.amazon.com/athena/에서 Athena 콘솔을 엽니다.
  2. 쿼리 편집기에서 데이터베이스에 부여하려는 이름으로 s3_access_logs_db를 바꿔 다음과 유사한 명령을 실행합니다.
CREATE DATABASE s3_access_logs_db

참고: S3 버킷과 같은 AWS 리전에 데이터베이스를 만드는 것이 모범 사례예요.

  1. 쿼리 편집기에서 2단계에서 만든 데이터베이스에 테이블 스키마를 만드는 다음과 유사한 명령을 실행합니다. s3_access_logs_db.mybucket_logs를 테이블에 부여하려는 이름으로 바꾸세요. STRING과 BIGINT 데이터 유형 값은 접근 로그 속성이에요. Athena에서 이 속성을 조회할 수 있어요. LOCATION에는 앞서 언급한 대로 S3 버킷과 접두사 경로를 입력합니다.

날짜 기반 파티셔닝

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,
 `sourceregion` 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}')

날짜 비기반 파티셔닝

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,
  `sourceregion` 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://amzn-s3-demo-bucket1-logs/prefix/'
  1. 탐색 창의 Database 아래에서 자신의 데이터베이스를 선택합니다.
  2. Tables 아래에서 테이블 이름 옆의 Preview table을 선택합니다. Results 창에 bucketowner, bucket, requestdatetime 같은 서버 접근 로그 데이터가 보여야 합니다. 이는 Athena 테이블을 성공적으로 만들었다는 뜻이에요. 이제 Amazon S3 서버 접근 로그를 조회할 수 있습니다.

예시 — 누가 언제 객체를 삭제했는지 표시(타임스탬프, IP 주소, 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 coalesce(SUM(bytessent), 0) AS bytessenttotal
FROM s3_access_logs_db.mybucket_logs
WHERE remoteip='192.0.2.1'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2022-06-01','yyyy-MM-dd')
AND parse_datetime('2022-07-01','yyyy-MM-dd');

예시 — 특정 기간의 HTTP 5xx 오류에 대한 요청 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'

Signature Version 2 요청 식별

서버 접근 로그로 Signature Version 2 요청을 식별할 수 있어요. Amazon Athena로 로그를 조회하는 자세한 내용은 "로그를 일반 용도 Amazon S3 버킷으로 전달"의 Athena 조회 섹션을 참고하세요.

객체 접근 요청 식별

서버 접근 로그로 객체 접근 패턴을 식별할 수 있어요. Amazon Athena로 로그를 조회하는 자세한 내용은 "로그를 일반 용도 Amazon S3 버킷으로 전달"의 Athena 조회 섹션을 참고하세요.

더 알아보기 (Learn more)