← 블로그 목록
작성일: 2026-06-01 AWSCloudFrontCDN

AWS CloudFront 로그 분석으로 CDN 캐시 최적화하기

AWS CloudFront는 전 세계 엣지 로케이션에서 콘텐츠를 캐싱하여 속도를 높입니다. CloudFront 로그 분석으로 캐시 히트율, 지역별 성능, 비용 최적화 지점을 파악하는 방법을 알아봅니다.


CloudFront 로그 활성화

  1. CloudFront Console → Distributions → 해당 배포 선택
  2. Logs 탭 → Standard Logging → Enable
  3. S3 버킷 선택 (자동 생성 또는 기존 버킷)
  4. 로그 프리픽스 설정 (예: cloudfront/)
로그 파일은 매 1시간마다 S3에 저장됩니다.

CloudFront 로그 포맷

탭 구분(TSV) 형식:

`` #Version: 1.0 #Fields: date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version fle-status fle-encrypted-fields c-port time-to-first-byte x-edge-detailed-result-type sc-content-type sc-content-len sc-range-start sc-range-end `

주요 필드:


S3에서 로그 다운로드

`bash aws s3 sync s3://my-bucket/cloudfront/ ./cloudfront-logs/ --exclude "" --include ".gz" `

압축 해제:

`bash gunzip cloudfront-logs/*.gz `


캐시 히트율 분석

전체 히트율

`bash cat *.log | awk -F'\t' '{print $14}' | sort | uniq -c `

출력 예시:

` 45231 Hit 12431 Miss 1234 RefreshHit 421 Error `

히트율 = 45231 / (45231 + 12431) = 78.4%

80% 이상이 이상적


캐시 Miss 원인 분석

x-edge-result-type 값:

필드의미
------------
date time요청 시각 (UTC)
x-edge-location엣지 로케이션 코드 (예: SEL50)
sc-bytes응답 바이트 수
c-ip클라이언트 IP
cs-uri-stem요청 경로
sc-statusHTTP 상태 코드
x-edge-result-type캐시 결과 (Hit, Miss, Error 등)
time-taken처리 시간 (초)
의미원인
----------------
Hit캐시에서 제공정상
RefreshHit캐시 재검증 후 제공TTL 짧음
Miss캐시 없음, 오리진 요청최초 요청 또는 TTL 만료
Error오류 발생오리진 문제
LimitExceededRate limit 초과공격 또는 과도한 요청

Miss가 많은 경로

`bash awk -F'\t' '$14=="Miss" {print $8}' *.log | sort | uniq -c | sort -rn | head -20 `


엣지 로케이션별 성능

지역별 요청 분포

`bash awk -F'\t' '{print $3}' *.log | cut -c1-3 | sort | uniq -c | sort -rn `

출력 예시:

` 23421 SEL (서울) 12341 NRT (도쿄) 8234 SIN (싱가포르) 4231 LAX (로스앤젤레스) `

지역별 평균 응답시간

`bash awk -F'\t' '{loc=substr($3,1,3); time[loc]+=$19; count[loc]++} END {for(l in time) printf "%s: %.3f\n", l, time[l]/count[l]}' *.log `


비용 최적화: 전송 데이터 분석

가장 많은 대역폭 소비 경로

`bash awk -F'\t' '{bytes[$8]+=$4} END {for(p in bytes) print bytes[p], p}' *.log | sort -rn | head -10 `

큰 파일 전송 집계

`bash awk -F'\t' '$4 > 10000000 {print $8, $4}' *.log | sort -k2 -rn `

10MB 이상 응답 찾기


오리진 요청 감소 전략

1. Cache-Control 헤더 최적화

오리진 서버(S3/EC2)에서 긴 TTL 설정:

` Cache-Control: public, max-age=31536000, immutable `

2. Query String 제거

불필요한 쿼리 문자열은 캐시 키를 분리시킵니다:

` /image.jpg?v=1 /image.jpg?v=2 `

CloudFront Behavior 설정에서 "Query String Forwarding" = None

3. CloudFront Functions

헤더 조작으로 캐시 최적화:

`javascript function handler(event) { var response = event.response; response.headers['cache-control'] = {value: 'public, max-age=86400'}; return response; } `


4xx/5xx 에러 분석

오리진 에러 (502/503/504)

`bash awk -F'\t' '$10 ~ /^5/ {print $8}' *.log | sort | uniq -c | sort -rn `

403 Forbidden (서명 오류)

S3 Bucket Policy 또는 서명 문제:

`bash grep $'\t403\t' *.log | awk -F'\t' '{print $8}' | sort | uniq -c `


Athena로 대규모 로그 쿼리

AWS Athena를 사용하면 SQL로 CloudFront 로그를 직접 쿼리할 수 있습니다.

Athena 테이블 생성

`sql CREATE EXTERNAL TABLE cloudfront_logs ( date DATE, time STRING, location STRING, bytes BIGINT, request_ip STRING, method STRING, host STRING, uri STRING, status INT, referer STRING, user_agent STRING, query_string STRING, cookie STRING, result_type STRING, request_id STRING, host_header STRING, request_protocol STRING, request_bytes BIGINT, time_taken FLOAT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION 's3://my-bucket/cloudfront/' TBLPROPERTIES ("skip.header.line.count"="2"); `

캐시 히트율 쿼리

`sql SELECT result_type, COUNT(*) AS cnt, ROUND(100.0 COUNT() / SUM(COUNT(*)) OVER(), 2) AS pct FROM cloudfront_logs WHERE date >= DATE '2024-10-01' GROUP BY result_type; `


정리

CloudFront 로그는 x-edge-result-type으로 캐시 히트 여부를, x-edge-location`으로 지역별 성능을 분석할 수 있습니다. 캐시 히트율 80% 이상을 목표로 TTL, Query String, Cache-Control 헤더를 최적화하세요.