CloudFront(클라우드 프론트)를 이용하다 보면 요청 로그를 직접 분석해야 할 필요가 있습니다.

CloudFront에서 제공하는 통계 메뉴에서도 전체 요청수, Hit, Miss, Error, 상태코드, 용량, 인기객체 등 많은 데이터를 볼 수 있지만 각 요청중 오래 걸리는 요청에 대해 분석하고 싶은 경우에는 CloudFront 로그를 직접 확인해야합니다.

CloudFront 로그파일 저장

CloudFront 기본 옵션은 요청 로그를 따로 저장하지 않습니다. 로그를 저장하기 위해 Distribution 설정에서 Logging 옵션을 On으로 변경하고 로그가 저장될 S3 버킷 이름과 경로를 지정합니다.

저장된 로그의 저장 기간을 설정하기 위해 S3 Bucket 설정에 가서 Management > Lifecycle 에서 Lifecycle Rule을 새로 생성후 Prefix에 따른 로그 삭제 기간을 설정합니다.

삭제에 대한 정책을 생성하지 않으면 용량이 점점 커져서 비용이 비싸지고 로그 분석하는 데도 오래 걸립니다. 문제 해결에 필요한 로그라고 판단되는 3일치 데이터만 놔두고 3일이 지나면 삭제되도록 설정했습니다. 기간은 서비스 특징에 따라서 조정하면 됩니다.

Athena 테이블 생성하기

Athena 에서는 데이터를 분석하기 전에 테이블 생성작업을 해야합니다. 생성할 테이블은 앞서 생성했던 S3 데이터를 참고 하도록 설정하는것이고 이 시점에는 논리적인 테이블만 생성되고 실제 S3 데이터를 읽지 않습니다.

Athena의 Query Editor에서 아래 쿼리를 입력후 실행하면 cloudfront_logs 테이블이 생성됩니다.

CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
  `date` date,
  `time` string,
  `location` string,
  bytes bigint,
  requestip string,
  method string,
  host string,
  uri string,
  status int,
  referrer string,
  useragent string,
  querystring string,
  cookie string,
  resulttype string,
  requestid string,
  hostheader string,
  requestprotocol int,
  requestbytes bigint,
  timetaken double,
  xforwardedfor string,
  sslprotocol string,
  sslcipher string,
  responseresulttype string,
  httpversion string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES
 (
 "input.regex" = "^(?!#)([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)$"
 )
LOCATION 's3://로그가저장된S3버킷이름/cf-logs/';

준비를 위한 작업이 모두 끝났습니다. 복잡하다고 생각할수도 있지만 다른 서비스를 이용하는 경우 여기까지의 준비 작업을 위해 데이터를 파싱하고 다시 저장하는등의 작업을 해야되는것을 생각하면 Athena의 준비 작업은 간단합니다.

느린 요청 로그만 추출하기

이미지 요청 속도가 특별히 느린 사용자들의 특징을 찾기 위해 응답시간이 느린 로그만 추출 해보겠습니다.

SELECT 
   date,
   time,
   timetaken,
   location,
   requestip,
   resulttype,
   responseresulttype,
   concat('https://', host, uri)
 FROM "default"."cloudfront_logs" 
 WHERE 
   timetaken > 1
 LIMIT 100;

위 SQL은 응답시간이 1초 이상 걸린 로그만 보여줍니다. 이를 통해 특정 엣지에서 요청이 느린것인지 아니면 특정 IP만 느린지 확인할 수 있습니다.

엣지 로케이션 별로 1초 이상 걸린 요청의 갯수를 알고 싶다면 아래 SQL을 실행합니다.

SELECT 
   location,
   count(*) as cnt
 FROM "default"."cloudfront_logs" 
 WHERE 
   timetaken > 1
 GROUP BY location
 ORDER BY cnt DESC

결과를 보니 별 의미는 없네요. ICN으로 시작하는건 한국 엣지 로케이션인데 절대적인 요청수가 많다보니 1초 이상 걸린것도 많이 나왔습니다.

이외에도 UserAgent를 분석해 기기나 OS에 따른 구분이나 HTTP 프로토콜 버전에 따른 구분등 할 수 있는것이 많습니다. 본인만의 SQL을 좀더 잘 만들어 본다면 CloudFront를 잘 사용하는데 도움이 될것입니다.

주의 할점

Athena는 데이터 분석에 필요한 데이터를 스캔하는 용량 만큼 과금됩니다. SQL을 잘못 작성해서 너무 많은 데이터를 참고 하게 되면 많은 비용이 청구 될 수 있으니 데이터를 적절히 제한해서 SQL 을 작성하는 노력이 필요합니다.

데이터가 많지 않으면 그냥 막 해도 상관 없습니다. 1TB 데이터를 스캔 하는데 $5 정도라서 데이터가 100기가 라면 500원 10 기가라면 50원이니까요 ^^

참고자료

대표 이미지 : Photo by NASA on Unsplash

원본 게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^