AWS Athena를 이용한 ALB Access Log 분석 방법

Jiyeon's TechNote·2023년 2월 22일
0
post-custom-banner

ALB의 Access log를 S3에 저장하고 저장된 로그를 AWS의 "Athena"를 이용해서 분석하는 방법

  1. ALB의 Access Log를 저장할 s3버킷 생성
    (버킷은 LB와 같은 리전에 생성해야하며, 접두사에는 "AWSLogs" 라는 문구가 포함되지 않아야합니다.)

S3 버킷 정책

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<elb-account-id: 600734575887(ap-northeast-2)>:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::aws-alb-log-s3-jay/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logdelivery.elb.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::aws-alb-log-s3-jay/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
  1. ALB에서 s3에 로그 수집 활성화
    < Access Log 비활성화 -> 활성화 설정 >

alb의 속성에서 로그수집을 위해 생성한 s3를 alb에 연결합니다.

alb에 로그가 활성화되면 lb에서 s3 버킷을 검증하고 버킷 정책에서 필수 권한이 지정됐는지 확인하는 테스트 파일을 생성합니다.
파일이 정상적으로 생성되지 않았다면 정책을 다시 확인해야합니다.

잠시후 lb에 요청이 있다면 아래와 같이 Access 로그가 정상적으로 저장됩니다.

  1. Athena를 이용한 Access Log 분석

    AWS Athena 란?
    Amazon Athena는 표준 SQL을 사용하여 Amazon S3(Amazon Simple Storage Service)에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스입니다. AWS Management Console에서 몇 가지 작업을 수행하면 Athena에서 Amazon S3에 저장된 데이터를 지정하고 표준 SQL을 사용하여 임시 쿼리를 실행하여 몇 초 안에 결과를 얻을 수 있습니다.

athena에서 작업 그룹을 생성합니다.

쿼리편집기의 설정을 위에서 생성한 작업그룹으로 변경합니다.

s3 폴더에 athena의 쿼리 결과를 저장할 수 있습니다.

쿼리 편집기에서 alb의 로그를 저장할 db를 생성합니다.

CREATE DATABASE jaytestalbdb;

쿼리 편집기에서 alb 로그의 테이블 생성

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://your-alb-logs-directory/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/'

테이블이 정상적으로 생성된것을 확인할 수 있습니다.

이제 Athena SQL를 이용해서 alb로그의 다양한 값을 구할 수 있습니다.
예를 들면 아래와 같은 쿼리로 alb의 시간대별 request_processing_time의 최고값을 구할 수 있습니다.

SELECT hour(parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')), MAX(target_processing_time) 
FROM alb_logs
WHERE (parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
     BETWEEN parse_datetime('2023-02-20-00:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2023-02-20-23:59:00','yyyy-MM-dd-HH:mm:ss'))
     AND(target_status_code = '200')
GROUP BY hour(parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z'))
ORDER BY hour(parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z'))

이처럼 Athena를 이용해서 간편하게 Log를 분석할 수 있으며, NLB또한 같은 방법으로 액세스 로그를 수집할 수 있지만 NLB의 경우 TLS리스너가 있어야 하며 액세스 로그가 TLS 요청에 관한 정보만 포함하는 경우에만 액세스 로그가 생성됩니다🧐

profile
바쁘다 바빠 현대사회 엔지니어🙋‍♀️
post-custom-banner

0개의 댓글