top of page

안 쓰면 아까운 CloudFront 캐시 관련 간단한 사용 팁

AWS Hand-on Lab #7 안 쓰면 아까운 CloudFront 캐시 관련 간단한 사용 팁

AWS Hands-on Lab #7 안 쓰면 아까운 CloudFront 캐시 관련 간단한 사용팁

Written by Minhyeok Cha


어느 서비스든 빠른 시간 내에 최대한 안전하게 데이터를 전달하여 서비스의 질을 향상시키고 싶어합니다. 그걸 위한 CDN이고 AWS를 이를 인지한 CDN 서비스인 CloudFront는 다들 알고 이미 사용 중에 있으실 겁니다.


특히 CDN을 통해 S3의 콘텐츠를 미리 캐싱해 사용자에게 전달하는 정적 컨텐츠 Delivery와 DB나 API의 데이터를 이어받아 사용되는 실시간으로 수정되는 동적 콘텐츠 Delivery는 이 CDN의 기본적인 사용 방법입니다.


이번 글에서는 이런 기본적인 사용법이 아닌 더 다양한 기능들과 사용 방법에 대해 알려드리겠습니다.



1. CloudFront 캐싱 사이클

기본적으로 CloudFront는 사용자가 도메인 접근을 시도해 데이터를 얻으려 할 때 엣지 서버의 캐싱 유무에 따라 갖고 있는 콘텐츠를 제공하는지 또는 새 버전(latest)의 콘텐츠를 엣지 서버에 적재 후 사용자에게 콘텐츠를 제공하는 방식으로 돌아갑니다.

CloudFront 캐싱 사이클

이때 CloudFront의 엣지 서버에서 제공하는 모든 파일은 24시간 후에 만료되는데, 이는 많은 콘텐츠 유형에 비해 너무 낮은 시간입니다.


특히 장기간 유지되는 로고 이미지나 회사 소개 영상과 같은 콘텐츠에서 적절하게 캐싱을 조율하면 24시간 캐싱 사이클을 돌릴 필요가 없이 CloudFront를 더욱 효율적으로 사용할 수 있습니다.


이를 해결할 방법은 2가지가 있습니다.


1. 함수를 사용한 엣지 서버 개체 캐싱 기간 컨트롤

Cache-Control은 원본 서버에서 HTTP 헤더를 설정하여 클라이언트와 엣지 서버가 개체를 캐시 기간을 설정합니다.

함수를 사용한 엣지 서버 개체 캐싱 기간 컨트롤


function handler(event) {
    var response = event.response;
    var headers = response.headers;

    // Set the cache-control header
    headers['cache-control'] = {value: 'public, max-age=63072000'};

    // Return response to viewers
    return response;
}
    

위 사진과 같이 CloudFront의 함수에 들어가 다음의 코드를 사용하면 엣지 서버의 캐싱 사이클을 조율할 수 있습니다.


max-age 명령을 사용하면 CloudFront가 오리진 서버에서 객체를 다시 가져오기 전에 이 객체를 캐시에 보관하려는 시간(초)을 지정하는 방식입니다. CloudFront가 지원하는 만료 시간은 0초이며 최댓값은 100년입니다.


2. 캐시 정책을 사용한 TTL 변경

TTL 값을 직접 설정하여 자체 캐싱 정책을 구현하도록 엣지 서버에 지정합니다.

캐시 정책을 사용한 TTL 변경


💡 정책 적용은 CloudFront "동작" 부분에서 캐시 정책을 확인

2. CloudFront 무효화

위의 내용과 반대로 자주 바뀌어야 하는 콘텐츠라면 이 기능을 어떻게 다뤄야 할까요?


이 경우에는 Cloudfront의 Invalidation을 사용하여 TTL의 기본적인 하루 캐시 사이클을 무시하고 새로운 콘텐츠를 즉시 반영할 수 있습니다.


그러나 매번 수동으로 무효화를 실행할 수 없기 때문에 Lambda함수를 사용하여 S3 버킷에 새로운 파일이 업로드되거나 수정될 때마다 해당 파일의 경로를 추출하고, 이를 CloudFront의 캐시를 무효화하여 변경 내용이 적용되도록 하는 방법을 소개하겠습니다.

CloudFront 무효화

사용자가 S3에 새로운 파일을 업로드할 때 Lambda가 해당 파일 경로를 추출하고 이를 CloudFront의 무효화 경로에 적용되도록 합니다.


*사용한 Lambda 코드


import boto3
import time

def lambda_handler(event, context):
    paths = ["/" + record["s3"]["object"]["key"] for record in event["Records"]]
    print(paths)
    
    cloudfront = boto3.client('cloudfront')
    invalidation = cloudfront.create_invalidation(
        DistributionId='XXXXXXXXXXXXXX',
        InvalidationBatch={
            'Paths': {
                'Quantity': len(paths),
                'Items': paths
            },
            'CallerReference': str(time.time())
        }
    )

paths를 생성하여 새로 추가된 S3의 “key” 값을 받아 CloudFront의 Invalidation에 사용합니다.


CloudFront 또는 로그 그룹을 통해 결괏값을 확인받을 수 있습니다.

CloudFront 또는 로그 그룹을 통해 결괏값을 확인


※ 주의
CloudFront 배포를 생성하거나 업데이트할 때 엣지 서버 캐싱은 파일이 만료되기 전에 무효화하려는 경우 매달 무료로 1,000개의 경로로 무효화할 수 있지만 해당 제한 이후 무효화된 경로당 $0.005를 지불하게 됩니다.


마무리

수많은 AWS 사용자가 CloudFront 엣지 서버 특히 속도 부분만 활용하는 분들이 많기에 엣지 서버에 담고 있는 캐시 기능에 대해 설명 드렸습니다.


사실 캐싱 기간 컨트롤하는 Cache-Control에는 이번에 예시로 나온 max-age 뿐 아니라 브라우저 캐시에 보관하는 기간과 다르게 엣지 서버에만 보관하는 s-maxage 절대 만료 날짜와 시간을 직접 지정하는 Expires 등 CloudFront의 사용 방법은 캐시에 한에서만 다양한 사용 방법이 있습니다.

조회수 1,230회댓글 0개

관련 게시물

전체 보기

Comments


bottom of page