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/형식으로 버킷 이름과 접두사를 포함해야 해요.
- https://console.aws.amazon.com/athena/에서 Athena 콘솔을 엽니다.
- 쿼리 편집기에서 데이터베이스에 부여하려는 이름으로
s3_access_logs_db를 바꿔 다음과 유사한 명령을 실행합니다.
CREATE DATABASE s3_access_logs_db
참고: S3 버킷과 같은 AWS 리전에 데이터베이스를 만드는 것이 모범 사례예요.
- 쿼리 편집기에서 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/'
- 탐색 창의 Database 아래에서 자신의 데이터베이스를 선택합니다.
- 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 조회 섹션을 참고하세요.