주뇽's 저장소

S3와 CloudFront 캐시 무효화: Lambda와 Boto3를 활용한 두 가지 방법 🛠️ 본문

클라우드서비스

S3와 CloudFront 캐시 무효화: Lambda와 Boto3를 활용한 두 가지 방법 🛠️

뎁쭌 2024. 10. 24. 14:56
728x90
반응형

S3와 CloudFront 캐시 무효화: Lambda와 Boto3를 활용한 두 가지 방법 🛠️

AWS S3CloudFront는 웹 애플리케이션에서 정적 파일을 효율적으로 제공하기 위한 필수 도구이다. 특히, S3는 파일을 저장하고, CloudFront는 이러한 파일을 전 세계적으로 빠르게 제공할 수 있도록 돕는다. 하지만 웹 애플리케이션을 운영하면서 파일이 업데이트되었을 때 CloudFront의 캐시가 갱신되지 않는 문제가 발생할 수 있다. 이때 캐시 무효화를 통해 최신 파일을 사용자에게 즉시 제공할 수 있다.

이번 글에서는 S3와 CloudFront를 사용하는 이유부터 왜 캐시 무효화가 중요한지를 설명하고, 이를 해결하는 두 가지 방법(Lambda와 Boto3)을 소개한다. 이 방법들을 통해 웹사이트를 운영하는 사람들이 최신 파일을 빠르게 사용자에게 전달할 수 있다.


S3와 CloudFront를 사용하는 이유 🌍

  1. S3(Simple Storage Service)는 웹 애플리케이션의 정적 파일을 저장하고 관리하는 데 적합하다. 이미지, HTML, CSS, JavaScript 파일 등을 안전하게 저장하며, 대규모 트래픽 처리에 유리하다.
  2. CloudFront는 이러한 정적 파일을 사용자와 가까운 엣지 서버에 캐싱하여 더 빠르게 제공한다. 이는 글로벌 사용자들에게 저지연(낮은 응답 시간)을 보장하기 때문에 웹사이트의 성능 향상에 필수적이다.

왜 캐시 무효화가 필요한가? 🧐

CloudFront는 S3에서 제공하는 파일을 캐싱하여 빠르게 제공하지만, S3에서 파일을 업데이트했을 때, CloudFront는 이전 버전의 파일을 계속 제공할 수 있다. 예를 들어, 웹사이트의 JavaScript나 이미지 파일을 수정한 후에도 사용자가 변경 사항을 보지 못하는 상황이 발생할 수 있다.

이 문제를 해결하기 위해 CloudFront의 캐시를 무효화하여, S3에 새롭게 업로드된 파일이 사용자에게 바로 전달되도록 해야 한다. 이를 통해 웹사이트를 항상 최신 상태로 유지할 수 있다.


방법 1: Lambda를 사용한 자동 캐시 무효화 🛠️

Lambda를 사용하면 S3에 파일이 변경될 때 자동으로 CloudFront 캐시를 무효화할 수 있다. 이 방법은 개발자가 추가적인 수작업을 하지 않아도 파일이 변경되면 자동으로 최신 파일이 제공되도록 설정할 수 있다.

구현 단계

  1. Lambda 함수 생성
    AWS Lambda 콘솔에서 새로운 함수를 생성한다. 이 함수는 S3에서 파일이 생성되거나 수정될 때 CloudFront의 캐시를 무효화하는 역할을 한다.

  2. S3 이벤트 설정
    S3 버킷에 이벤트 트리거를 설정하여, 파일이 변경되면 Lambda 함수가 자동으로 실행되도록 한다. 예를 들어, 파일이 생성되거나 수정되었을 때 Lambda 함수가 트리거된다.

  3. Lambda 함수 코드 작성
    아래 코드를 사용하여 S3에서 발생한 파일 경로를 받아 해당 파일의 CloudFront 캐시를 무효화한다.

import boto3
import time
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        cloudfront_client = boto3.client('cloudfront')
        distribution_id = '배포 ID를 입력하세요'

        paths_to_invalidate = []
        for record in event['Records']:
            s3_object_key = record['s3']['object']['key']
            paths_to_invalidate.append(f"/{s3_object_key}")

        response = cloudfront_client.create_invalidation(
            DistributionId=distribution_id,
            InvalidationBatch={
                'Paths': {
                    'Quantity': len(paths_to_invalidate),
                    'Items': paths_to_invalidate
                },
                'CallerReference': str(time.time())  # 고유한 요청 ID
            }
        )
        logger.info(f"CloudFront 캐시 무효화 요청 완료: {response}")
    except Exception as e:
        logger.error(f"CloudFront 캐시 무효화 중 오류 발생: {str(e)}")
  1. IAM 권한 설정
    Lambda가 S3와 CloudFront에 접근할 수 있도록 AmazonS3ReadOnlyAccess, CloudFrontFullAccess, AWSLambdaBasicExecutionRole을 부여한다.

  2. 테스트
    S3에 파일을 업로드하거나 수정하면, Lambda 함수가 실행되어 CloudFront 캐시를 자동으로 무효화하는지 확인한다.


방법 2: Boto3를 사용한 수동 캐시 무효화 🛠️

두 번째 방법은 Boto3를 사용하여 수동으로 CloudFront 캐시를 무효화하는 방법이다. 이 방법은 로컬 환경에서 사용하거나, 서버에서 주기적으로 실행하여 특정 파일의 캐시를 무효화할 때 유용하다.

구현 단계

  1. Boto3 설치
    Boto3는 AWS SDK for Python이다. 먼저 Boto3를 설치한다:

    pip install boto3
  2. Boto3 코드 작성
    아래 코드를 사용하여 CloudFront의 캐시를 수동으로 무효화한다.

import boto3
import time
import logging

logging.basicConfig(level=logging.INFO)

def invalidate_cloudfront_cache():
    try:
        cloudfront_client = boto3.client('cloudfront')
        distribution_id = '배포 ID를 입력하세요'

        paths_to_invalidate = ['/json/snsmeme_services_parsing.json']
        response = cloudfront_client.create_invalidation(
            DistributionId=distribution_id,
            InvalidationBatch={
                'Paths': {
                    'Quantity': len(paths_to_invalidate),
                    'Items': paths_to_invalidate
                },
                'CallerReference': str(time.time())
            }
        )
        logging.info(f"CloudFront 캐시 무효화 요청 완료: {response}")
    except Exception as e:
        logging.error(f"CloudFront 캐시 무효화 중 오류 발생: {str(e)}")

# 함수 호출
invalidate_cloudfront_cache()
  1. AWS 자격 증명 설정
    로컬에서 Boto3를 사용하려면 AWS CLI를 통해 자격 증명을 설정해야 한다:

    aws configure
  2. 코드 실행
    Python 파일을 실행하여 CloudFront 캐시가 무효화되는지 확인한다:

    python invalidate_cloudfront.py

결론: S3와 CloudFront 캐시 무효화의 중요성 🔑

S3와 CloudFront를 사용하여 웹 애플리케이션의 성능을 극대화할 수 있지만, 파일이 변경될 때 캐시 무효화를 적절하게 관리하는 것이 중요하다. 이를 통해 사용자가 항상 최신 파일을 받아볼 수 있게 한다.

  • Lambda를 사용하면 S3에서 파일이 변경될 때마다 자동으로 캐시가 무효화되어 배포 자동화에 유리하다.
  • Boto3는 수동으로 캐시를 무효화할 때, 또는 특정 상황에서 CloudFront 캐시를 직접 관리할 때 유용하다.

상황에 따라 적절한 방법을 선택하여 CloudFront 캐시를 관리하면, 더 빠르고 안정적인 웹 서비스를 제공할 수 있다.