Cloudfront Invalidation with Lambda Function

Jihun Kim·2022년 6월 3일
0

기타

목록 보기
7/12
post-thumbnail

CloudFront를 사용하면 한 번 요청한 객체에 대해서 캐싱을 해 전 세계에서 사용자와 가장 가까운 지역에 캐싱되어 있던 객체를 사용자에게 제공 한다. 그렇다면, 파이썬 코드로 어떻게 Cloudfront Invalidation을 실행할 수 있는지 알아보자. 그리고 이를 람다 환경에서 실행할 수 있도록 만들 것이다.

아래는 invalidation 메소드를 가진 CloudFrontManager라 명명한 클래스이다.


CloudFrontManager


class CloudFrontManager:
    def __init__(self):
        self.client = boto3.client("cloudfront")

    def get_invalidation_id(self, key_list_to_be_invalidated: list) -> str:
        response = self.client.create_invalidation(
            DistributionId=settings.CLOUDFRONT_INFO[
                "DISTRIBUTION_ID"
            ],
            InvalidationBatch={
                "Paths": {
                    "Quantity": 1,
                    "Items": key_list_to_be_invalidated,
                },
                "CallerReference": str(time.time()).replace(".", ""),
            },
        )
        invalidation_id = response["Invalidation"]["Id"]

        return invalidation_id

    def get_invalidation_status(self, key_list_to_be_invalidated: list) -> str:
        """
        If finished successfully, response['Invalidation']['Status'] would be "Completed"
        """

        response = self.client.get_invalidation(
            DistributionId=settings.CLOUDFRONT_INFO[
                "DISTRIBUTION_ID"
            ],
            Id=self.get_invalidation_id(
                key_list_to_be_invalidated=key_list_to_be_invalidated
            ),
        )
        return response["Invalidation"]["Status"]

  • get_invalidation_id
    - 이 메소드를 이용하면 invalidation에 사용할 id를 얻을 수 있다.
    - invalidation id를 얻기 위해서는 어떤 객체를 무효화 할 지에 대한 정보가 필요한데 여기에 사용되는 인자가 key_list_to_be_invalidated이다.
    - key_list_to_be_invalidated는 ['/path/to/invalidate/*']와 같은 형식으로 이루어져야 한다. 만약 'invalidate/' 디렉토리 내의 모든 객체를 무효화 하려면 '' 표시를 사용하고, 특정 객체를 지정하려면 ''을 없애고 특정 파일에 대한 key 값을 적으면 된다. 내가 무효화 하려는 객체는 invalidate 디렉토리 내의 모든 파일이기 때문에 위와 같이 key_list_to_be_invalidated를 넘겨 주었다.

  • get_invalidation_status
    - 이 메소드를 사용하면 무효화를 실행하고, 동시에 무효화 결과를 얻을 수 있다.
    - 무효화 결과는 response["Invalidation"]["Status"]에 들어간다. 독스트링에도 추가해 놓았듯이 성공적으로 무효화가 실행되면 response["Invalidation"]["Status"]는 "Completed"가 된다.
    - 해당 메소드를 실제 운영 서버에 사용할 때는 "Completed"가 아니면 Exception을 raise 하도록 작성했다.

Lambda Role for CreateInvalidation

여기서 끝이 아니다.
람다 환경에서 cloudfront invalidation이 일어나도록 만들기 위해서는 lambda 함수에 role을 생성해 주어야 한다.
여기를 참고해 role을 생성했다.

{
  "Version": "2012-10-17",
  "Statement": [
	{
        "Effect": "Allow",
        "Action": [
            "cloudfront:CreateInvalidation"
        ],
        "Resource": [
            "<Your ARN>"
        ]
    }
  ]
}
  • cloudfront에 대한 CreateInvalidation 액션이 필요하다.
  • 참고한 링크에서는 Resource를 '*'로 했는데, 운영 환경과 개발 환경을 분리해 두었기 때문에 운영 람다에 대해서는 운영 서버에서 사용하는 Cloudfront Distribution ID를, 개발용 람다에 대해서는 개발용 서버에서 사용할 Cloudfront Distribution ID를 이용해 ARN을 작성했다.
profile
쿄쿄

0개의 댓글