Amazon S3에 저장된 Apache 로그 쿼리
Amazon Athena를 사용하여 Amazon S3 계정에 저장된 Apache HTTP 서버 로그 파일
일반 로그 형식의 필드에는 클라이언트 IP 주소, 클라이언트 ID, 사용자 ID, 요청 수신 타임스탬프, 클라이언트 요청의 텍스트, 서버 상태 코드, 클라이언트로 반환된 개체의 크기가 포함됩니다.
다음 데이터 예제는 Apache 일반 로그 형식을 보여 줍니다.
198.51.100.7 - Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232 198.51.100.14 - Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165 198.51.100.22 - Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287 198.51.100.9 - Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230 198.51.100.2 - Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30 198.51.100.13 - Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608 198.51.100.11 - Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
Athena에서 Apache 로그용 테이블 생성
Amazon S3에 저장된 Apache 로그를 쿼리하기 전에 먼저 Athena용 테이블 스키마를 생성해야 로그 데이터를 읽을 수 있습니다. Apache 로그에 대한 Athena 테이블은 Grok SerDe를 사용해 만들 수 있습니다 . Grok SerDe를 사용하는 방법에 대한 자세한 내용은 AWS Glue 개발자 안내서의 Grok 사용자 지정 분류자 작성을 참조하세요.
Athena에서 Apache 웹 서버 로그에 대한 테이블 생성
https://console.aws.amazon.com/athena/
에서 Athena 콘솔을 엽니다. -
다음 DDL 문을 Athena 쿼리 편집기에 붙여 넣습니다. Amazon S3의 Athena 로그를 가리키도록
LOCATION 's3://amzn-s3-demo-bucket/
의 값을 수정합니다.apache-log-folder
/'CREATE EXTERNAL TABLE apache_logs ( client_ip string, client_id string, user_id string, request_received_time string, client_request string, server_status string, returned_obj_size string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{USERNAME:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/
apache-log-folder
/'; -
Athena 콘솔에서
apache_logs
테이블을 등록하는 쿼리를 실행합니다. 이 쿼리가 완료되면 로그를 Athena에서 쿼리할 수 있습니다.
쿼리 예제
예 - 404 오류 필터링
다음 쿼리 예제는 apache_logs
테이블에서 요청 수신 시간, 클라이언트 요청의 텍스트 및 서버 상태 코드를 선택합니다. WHERE
절은 HTTP 상태 코드 404
(페이지를 찾을 수 없음)를 필터링합니다.
SELECT request_received_time, client_request, server_status FROM apache_logs WHERE server_status = '404'
다음 이미지는 Athena 쿼리 편집기의 쿼리 결과를 보여줍니다.
예 - 성공적인 요청 필터링
다음 쿼리 예제는 apache_logs
테이블에서 사용자 ID, 요청 수신 시간, 클라이언트 요청의 텍스트 및 서버 상태 코드를 선택합니다. WHERE
절은 HTTP 상태 코드 200
(성공)을 필터링합니다.
SELECT user_id, request_received_time, client_request, server_status FROM apache_logs WHERE server_status = '200'
다음 이미지는 Athena 쿼리 편집기의 쿼리 결과를 보여줍니다.
예 - 타임스탬프별 필터링
다음 예제에서는 요청 수신 시간이 지정된 타임스탬프보다 큰 레코드를 쿼리합니다.
SELECT * FROM apache_logs WHERE request_received_time > 10/Oct/2023:00:00:00