[Frontend] 배포 자동화 구축 (3) - Lambda로 CloudFront 캐시 무효화

이상엽·2024년 7월 30일
post-thumbnail

참고 자료

https://awstip.com/automating-cloudfront-cache-invalidation-with-lambda-a-codepipeline-and-s3-events-approach-df92efeea7dd

캐시 무효화 방법

참고 자료의 내용을 보면 캐시 무효화 시키기 위해 lambda 를 이용하지만 lambda 트리거를 호출하는 방법이 2가지가 있다.

1. codePipeline 에서 S3 배포 후 lambda 함수 실행
2. S3 버킷 변경이 생겼을 때 lambda 함수 실행

codePipeline 마지막에 lambda 함수를 실행하면 깔끔하여 해당 방법으로 시도했지만 그 당시 권한이 codePipeline 이 lambda 함수를 실행시킬 권한이 부족했기에 2번째 방법으로 바꿨다.
(지금은 해당 권한이 열린거 같다)

Lambda 함수 생성

참고 자료의 코드가 python 으로 되어있기에 런타임 환경을 파이썬 환경으로 설정해준다.

그리고 생성되는 lambda_function.py 에 아래 내용을 넣으면 된다.

import json
import boto3

cloud_front = boto3.client("cloudfront")

def lambda_handler(event, context):
    # Extract information from S3 event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    # Specify the CloudFront distribution ID
    distribution_id = "CloudFront distribution ID"

    # Specify the object path to be invalidated (e.g., '/*' to invalidate all)
    object_paths = ["/*"]

    try:
        # Create CloudFront invalidation
        cloud_front.create_invalidation(
            DistributionId=distribution_id,
            InvalidationBatch={
                'Paths': {
                    'Quantity': len(object_paths),
                    'Items': object_paths,
                },
                'CallerReference': str(hash(key)),  # You can use a different reference based on your needs
            }
        )
    except Exception as e:
        print(f"Error: {e}")
        raise e

distribution_id = "<cloudfront ID>"

위의 코드에서 해당 값만 본인 cloudfront 의 ID 값을 넣어주면 된다.

S3 이벤트 설정

그 다음 S3 본인 버킷 -> 속성 으로 들어가 하단에 이벤트 알림을 찾는다.

그 다음 이벤트 알림 생성 버튼을 눌러 아래와 같이 구성하면 된다.

여기서 접두사가 corea/index.html 로 되어있는데 corea 는 S3 버킷 내 디렉토리 명(본인 프로젝트) 이고 /index.html 을 설정해준 이유는 만약 S3 에 10개의 파일이 변경이 되면 Lambda 함수가 10번 일어나기에 이를 막고자 index.html 을 설정해 한 번만 Lambda 함수가 실행되게 해준다.

그리고 하단에 본인이 만든 Lambda 함수를 넣어주면 된다.

마무리

아마 이렇게 구성을 완료했다면 이런 흐름도를 가진 배포 자동화가 구성이 될 것이다. 정리를 하자면 아래와 같다. 👏👏👏

1. 특정 브랜치에 push 되었을 때 동작한다.
2. Github 에서 발생한 Hook 을 AWS CodePipeline 이 감지한다.
3. AWS CodeBuild 를 통해 해당 브랜치에 push 된 최신 코드를 빌드한다.
4. 빌드된 파일들을 AWS S3 에 저장한다.
5. 빌드된 파일을 cloudfront 에 연결되어 있는 S3 버킷으로 이동시킨다.
6. AWS Lambda 를 호출하여 cloudfront 에 invalid cache 를 적용한다.

2개의 댓글

comment-user-thumbnail
2024년 10월 18일

잘 보고 갑니다 다르 👍🏻

1개의 답글