만자의 개발일지

[AWS] AWS Athena로 ALB Log 분석하기 본문

AWS

[AWS] AWS Athena로 ALB Log 분석하기

박만자 2022. 2. 17. 11:05

AWS에서 ELB,ALB 옵션중에 로그를 남겨주는 옵션을 제공해주는데요, 이 로그를 가지고 분석을 해야하는 경우가 종종 생깁니다. AWS에서는 Athena 라는 서비스로 이를 쉽게 분석할 수 있도록 제공합니다.

 

AWS Athena

AWS Athena는 표준 SQL을 사용해 Amazon S3에 저장된 데이터를 간편하게 분석할 수 있는 대화식 서버리스 쿼리 서비스 입니다. 

 

서버리스 이기 때문에 실행한 만큼만 비용을 지불하면 됩니다.

자세한 내용은 아래 사이트를 참고해주세요.

https://aws.amazon.com/ko/athena/pricing/

 

Amazon Athena 요금 - 서버리스 대화식 쿼리 서비스 - Amazon Web Services

크기가 같은 3개의 컬럼으로 구성된 테이블이 있고, 총 3TB의 압축되지 않은 텍스트 파일이 Amazon S3에 저장되어 있다고 가정해 보겠습니다. 이 테이블의 한 컬럼에서 데이터를 가져오도록 쿼리를

aws.amazon.com

 

그럼 바로 S3에 있는 ALB 로그를 Athena로 분석하는 방법에 대해 다뤄보도록 하겠습니다.

 

S3 생성

앞서 ALB Log들을 담을 S3를 생성해줍니다.

 

필자는 다음과 같이 생성해주었고, ALB Log 데이터가 담겨있는 data 폴더와 쿼리 결과가 저장될 result 폴더를 생성해 주었습니다.

 

Athena 테이블 생성

이제 Athena에서 ALB Log에 대한 테이블을 생성후 데이터 분석까지 해보도록 하겠습니다.

 

먼저 콘솔창에서 Athena를 검색해줍니다.

 

Athena로 들어가주신 후 DataSource는 AwsDataCatalog, Database는 default, Workgroup은 primary로 지정해 주도록 하겠습니다.

 

그 다음 왼쪽 메뉴에 Workgroups로 들어가 줍니다.

방금 지정한 Workgroup을 선택한 후 Edit 버튼을 눌러줍니다.

 

그 다음 쭉 내려서 Query result configuration 옵션에서 아까 S3에서 생성한 result 폴더의 경로로 지정해줍니다.

쿼리의 결과를 S3 result 폴더에 저장하겠다는 뜻입니다.

그 다음 아래 Save Changes 버튼을 눌러 변경한 설정을 저장합니다.

 

그 다음 다시 Query editor로 넘어가 다음과 같은 코드를 복사해 붙여넣어 줍니다.

LOCATION은 ALB Log가 담겨있는 S3 폴더를 지정해 주시면 됩니다.

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' = 
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\"')
            LOCATION 's3://pmj-athena-test-bucket/data/';

 

코드를 복사한후 실행하면 왼쪽에 테이블이 하나 생성된 것을 보실 수 있습니다.

 

쿼리를 하나 더 생성한 후 SELECT 절로 조회 해보면 다음과 같이 데이터가 잘 파싱되어 담겨있는 것을 보실 수 있습니다.

 

만약 ALB 200을 응답한 횟수를 알고싶다면 다음과 같이 쿼리문을 작성해 주시면 됩니다.

SELECT COUNT(*)
FROM alb_logs
WHERE elb_status_code = 200;

 

더 자세한 내용은 AWS 공식 문서를 참고하시길 바랍니다.

https://docs.aws.amazon.com/ko_kr/athena/latest/ug/application-load-balancer-logs.html

 

Application Load Balancer 로그 쿼리 - Amazon Athena

다음 CREATE TABLE 문에는 최근에 추가된 classification 및 classification_reason 열이 포함됩니다. 이러한 항목을 포함하지 않은 Application Load Balancer 액세스 로그에 대한 테이블을 생성하려면 CREATE TABLE 문에

docs.aws.amazon.com

 

'AWS' 카테고리의 다른 글

[AWS] AWS Lambda란  (0) 2022.02.18
[AWS] IAM Custom Policy 생성하기  (0) 2022.02.17
[AWS] CloudWatch Logs Metric filter 생성하기  (0) 2022.01.26
[AWS] EC2에서 Spring Boot 프로젝트 실행  (0) 2022.01.24
[AWS] EC2에 SSM 으로 접속하기  (0) 2022.01.13
Comments