본문 바로가기
클라우드

Cloudfront - s3 캐시 무효화

by CleanCoder 2024. 6. 5.



첫 번째 로직은 Cloudfront 에서 해당 오브젝트에 처음으로 요청이 올 경우

로직
1. Client -> Internet -> CloudFront
2. CloudFront -> Origin S3 -> jeju.mp4 호출 후 캐시 서버에 적재
3. jeju.mp4 확인 (Miss From CloudFront 헤더 문구확인)

두 번째 로직은 캐시서버에 적재 후 같은 오브젝트를 호출 할 경우

로직

1. Client -> Internet -> CloudFront -> 캐시버서에서 jeju.mp4 확인
2. jeju.mp4 확인 ( Hit From CloudFront 헤더 문구 확인)

이 두 가지 로직 중 가장 큰 차이점은 Origin S3에 접근하는지 여부

 

 

다만 한 가지 이슈가 있다.

같은 이름에 오브젝트 파일이 변경이 되었을 경우에 TTL 시간 동안 오브젝트가 자동으로 업데이트가 이루어 지지 않는다.

예를 들어 jeju.mp4 파일이 변경 되어도 CloudFront 상 에서는 실시간 업데이트 가 아닌 TTL 기준으로 오브젝트 업데이트가 이루어진다. 이럴 경우 수동으로 CloudFront 에서 제공하는 무효화(Invalidations)를 사용하여 캐시서버에 적재된 오브젝트를 강제로 업데이트 하는 방법이 있습니다. 하지만 오브젝트가 업데이트 될 때 마다 수동으로 무효화를 진행해야 한다.

이런 번거로움과 불필요한 리소스 낭비를 줄이기 위해 Origin S3에 Put 이벤트가 발생할 경우 해당 오브젝트에 관해 자동으로 무효화가 될 수 있게 Lambda를 도입하게 되었다. 


1. 신규 컨텐츠 S3 Upload
2. S3에서 해당 컨텐츠 감지
3. Invalidations를 담당하는 Lambda 호출
4. Lambda에서 해당하는 CloudFront에 Invalidations 수행

 

 

 

 

 

 

lambda 코드

import boto3
import time
import os


def lambda_handler_s3_xosoft(event, context):
  paths = []
  for record in event["Records"]:
    bucket = record["s3"]["bucket"]["name"]  # S3 버킷 이름 추출
    key = record["s3"]["object"]["key"]  # 업로드된 파일 경로 추출
    
    # 경로 검사 및 필터링
    if key.startswith("/test"):
      # 유효한 경로이면 전체 경로 추가
      paths.append("/" + key)
  
  if not paths:
      print("무효화할 대상이 없습니다.")
      return

  print(f"다음 경로 무효화 요청: {paths}")
  
  client = boto3.client('cloudfront')
  batch = {
    'Paths': {
      'Quantity': len(paths),
      'Items': paths
    },
    'CallerReference': str(time.time())
  }
  invalidation = client.create_invalidation(
    DistributionId=os.environ['CLOUDFRONT_DISTRIBUTION_ID'],
    InvalidationBatch=batch,
  )
  return batch



캐시 무효화 확인

댓글