Intro

CloudFront는 html, css, js 및 이미지, 동영상 같은 정적 및 동적 웹 콘텐츠를 배포(제공)할 수 있도록 지원하는 AWS 서비스다. 원리는 전 세계에 앳지 로케이션이라는 데이터 센터의 초고속 네트워크에 연결되며, 가장 빠르게 답할 수 있는 곳으로 라우팅 해준다. 그 과정에서 캐시 정책을 설정해서 오리진(원본: S3, Web 서버 같은 데이터를 제공하는 서비스)으로 사용하는 서비스에 부하를 줄일 수 있다.  CDN 서비스에 사용하기 적합하다. 문제는 캐시를 사용하기 때문에 동적 콘텐츠는 어떻게 적용하며, 정적 콘텐츠의 변경 사항의 반영이다. 이것은 캐시 정책으로 설정할 수 있으며 하나씩 알아보자. 

 

CloudFront에는 캐시 키가 존재한다. 엣지 로케이션에 대한 사용자 요청이 캐시에 적중한 여부를 파악한다 객체 고유의 식별자다.
예를 들어서 /example/images/sample.jpg의 고유 캐시 키가 생성되고, 캐시가 살아있는 동안에는 해당 객체는 캐시 적중이 발생한다.

 

캐시 정책

사용자가 직접 캐시 정책을 만들 거나, 관리형 정책을 사용하면 된다. 관리형 캐시 정책을 알아보자 총 5개로 아래와 같다.

 

1. Aplify

2. CachingDisabled

3. CachingOptimized
4. CachingOptimizedForUncompressedObjects

5. Elemental-MediaPackage

 

Aplify, Elemental-MediaPackage 두 개는 별도의 서비스랑 연결하는 것으로 설명을 생략한다.

 

CachingDisabled

이름에서 알 수 있듯이 캐싱을 사용하지 않는 설정이다. 이 설정은 동적 콘텐츠와 같은 캐시를 사용하지 않는 곳에 적용할 수 있다. 정적 콘텐츠에 적용하면, CloudFront의 캐시라는 이점을 챙기지 못할 수 있다. 

 

CachingOptimized

캐시 키에 포함되는 값을 최소화하여 캐시 효율성이 최적화된 캐시 정책이다. 이 정책은 캐시 키에 쿼리 문자열, 쿠키를 포함하지 않으며, Accept-Encoding 헤더만 포함한다. CloudFront에서는 객체 자동 옵션을 킬 수 있고, 클라이언트는 Accept-Encoding 헤더를 사용해서 받을 수 있는 압축 방법을 CloudFront에 알려주는 것이다. (압축 파일 종류는 Gzip, Brotil이고, 둘 다 가능하면 Brotil로 준다.)

 

캐시 옵션은 아래와 같다.

 

최소 TTL: 1초

최대 TTL: 365일

기본 TTL: 24시간

압축된 객체 캐시 설정: 활성화

캐시 키에 포함된 헤더: 명시적으로 포함하지 않지만, 압축된 객체 캐시 설정이 켜져 있어서 Accept-Encoding 헤더가 포함됨

캐시 키에 포함된 쿠키: 없음

캐시 키에 포함된 쿼리 문자열: 없음

 

정적 콘텐츠 제공 시 가장 적절한 옵션이라고 생각한다.

 

CachingOptimizedForUncompressedObjects

CachingOptimized 정책과 동일하지만, 객체 압축에 대한 캐시를 지원하지 않는 정책이다.

 

최소 TTL: 1초

최대 TTL: 365일

기본 TTL: 24시간

압축된 객체 캐시 설정: 비활성화

캐시 키에 포함된 헤더: 없음

캐시 키에 포함된 쿠키: 없음

캐시 키에 포함된 쿼리 문자열: 없음

 

3개의 캐시 정책을 알아봤고, 정적 콘텐츠인 경우 캐시를 활용하는 것이 좋으므로 CachingOptimizedForUncompressedObject or 

CachingOptimized 적당해 보인다. 정적 콘텐츠도 변경될 여지가 있어서, 캐시를 날려주는 Invalidation 동작을 어떻게 구성할지 고민할 필요가 있다. 동적인 경우 CachingDisabled 하거나, 별도의 방법으로 캐싱을 날려주는 방법을 선택하면 될 거 같다. 

 

정적 + 동적 콘텐츠에 활용할 수 있는 캐시 정책을 알아봤다. 이 밖에도 다른 설정으로 캐시를 설정할 수가 있는데, 다음 글에서 추가적으로 알아보겠다.