주뇽's 저장소
S3와 CloudFront 캐시 무효화: Lambda와 Boto3를 활용한 두 가지 방법 🛠️ 본문
S3와 CloudFront 캐시 무효화: Lambda와 Boto3를 활용한 두 가지 방법 🛠️
AWS S3와 CloudFront는 웹 애플리케이션에서 정적 파일을 효율적으로 제공하기 위한 필수 도구이다. 특히, S3는 파일을 저장하고, CloudFront는 이러한 파일을 전 세계적으로 빠르게 제공할 수 있도록 돕는다. 하지만 웹 애플리케이션을 운영하면서 파일이 업데이트되었을 때 CloudFront의 캐시가 갱신되지 않는 문제가 발생할 수 있다. 이때 캐시 무효화를 통해 최신 파일을 사용자에게 즉시 제공할 수 있다.
이번 글에서는 S3와 CloudFront를 사용하는 이유부터 왜 캐시 무효화가 중요한지를 설명하고, 이를 해결하는 두 가지 방법(Lambda와 Boto3)을 소개한다. 이 방법들을 통해 웹사이트를 운영하는 사람들이 최신 파일을 빠르게 사용자에게 전달할 수 있다.
S3와 CloudFront를 사용하는 이유 🌍
- S3(Simple Storage Service)는 웹 애플리케이션의 정적 파일을 저장하고 관리하는 데 적합하다. 이미지, HTML, CSS, JavaScript 파일 등을 안전하게 저장하며, 대규모 트래픽 처리에 유리하다.
- CloudFront는 이러한 정적 파일을 사용자와 가까운 엣지 서버에 캐싱하여 더 빠르게 제공한다. 이는 글로벌 사용자들에게 저지연(낮은 응답 시간)을 보장하기 때문에 웹사이트의 성능 향상에 필수적이다.
왜 캐시 무효화가 필요한가? 🧐
CloudFront는 S3에서 제공하는 파일을 캐싱하여 빠르게 제공하지만, S3에서 파일을 업데이트했을 때, CloudFront는 이전 버전의 파일을 계속 제공할 수 있다. 예를 들어, 웹사이트의 JavaScript나 이미지 파일을 수정한 후에도 사용자가 변경 사항을 보지 못하는 상황이 발생할 수 있다.
이 문제를 해결하기 위해 CloudFront의 캐시를 무효화하여, S3에 새롭게 업로드된 파일이 사용자에게 바로 전달되도록 해야 한다. 이를 통해 웹사이트를 항상 최신 상태로 유지할 수 있다.
방법 1: Lambda를 사용한 자동 캐시 무효화 🛠️
Lambda를 사용하면 S3에 파일이 변경될 때 자동으로 CloudFront 캐시를 무효화할 수 있다. 이 방법은 개발자가 추가적인 수작업을 하지 않아도 파일이 변경되면 자동으로 최신 파일이 제공되도록 설정할 수 있다.
구현 단계
Lambda 함수 생성
AWS Lambda 콘솔에서 새로운 함수를 생성한다. 이 함수는 S3에서 파일이 생성되거나 수정될 때 CloudFront의 캐시를 무효화하는 역할을 한다.S3 이벤트 설정
S3 버킷에 이벤트 트리거를 설정하여, 파일이 변경되면 Lambda 함수가 자동으로 실행되도록 한다. 예를 들어, 파일이 생성되거나 수정되었을 때 Lambda 함수가 트리거된다.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)}")
IAM 권한 설정
Lambda가 S3와 CloudFront에 접근할 수 있도록 AmazonS3ReadOnlyAccess, CloudFrontFullAccess, AWSLambdaBasicExecutionRole을 부여한다.테스트
S3에 파일을 업로드하거나 수정하면, Lambda 함수가 실행되어 CloudFront 캐시를 자동으로 무효화하는지 확인한다.
방법 2: Boto3를 사용한 수동 캐시 무효화 🛠️
두 번째 방법은 Boto3를 사용하여 수동으로 CloudFront 캐시를 무효화하는 방법이다. 이 방법은 로컬 환경에서 사용하거나, 서버에서 주기적으로 실행하여 특정 파일의 캐시를 무효화할 때 유용하다.
구현 단계
Boto3 설치
Boto3는 AWS SDK for Python이다. 먼저 Boto3를 설치한다:pip install boto3
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()
AWS 자격 증명 설정
로컬에서 Boto3를 사용하려면 AWS CLI를 통해 자격 증명을 설정해야 한다:aws configure
코드 실행
Python 파일을 실행하여 CloudFront 캐시가 무효화되는지 확인한다:python invalidate_cloudfront.py
결론: S3와 CloudFront 캐시 무효화의 중요성 🔑
S3와 CloudFront를 사용하여 웹 애플리케이션의 성능을 극대화할 수 있지만, 파일이 변경될 때 캐시 무효화를 적절하게 관리하는 것이 중요하다. 이를 통해 사용자가 항상 최신 파일을 받아볼 수 있게 한다.
- Lambda를 사용하면 S3에서 파일이 변경될 때마다 자동으로 캐시가 무효화되어 배포 자동화에 유리하다.
- Boto3는 수동으로 캐시를 무효화할 때, 또는 특정 상황에서 CloudFront 캐시를 직접 관리할 때 유용하다.
상황에 따라 적절한 방법을 선택하여 CloudFront 캐시를 관리하면, 더 빠르고 안정적인 웹 서비스를 제공할 수 있다.
'클라우드서비스' 카테고리의 다른 글
AWS RDS에 PostgreSQL 설정 및 로컬 접속 가이드 (0) | 2024.08.19 |
---|---|
AWS Lambda + API Gateway를 이용해서 Fast API와 LangChain 서비스 배포 (0) | 2024.07.07 |
[AWS EC2 with Docker] 하나의 도커 컨테이너에서 프론트엔드와 백엔드 이미지를 만들어 AWS EC2에 배포하기 (0) | 2024.06.13 |