CloudFront를 사용하면 한 번 요청한 객체에 대해서 캐싱을 해 전 세계에서 사용자와 가장 가까운 지역에 캐싱되어 있던 객체를 사용자에게 제공 한다. 그렇다면, 파이썬 코드로 어떻게 Cloudfront Invalidation을 실행할 수 있는지 알아보자. 그리고 이를 람다 환경에서 실행할 수 있도록 만들 것이다.
아래는 invalidation 메소드를 가진 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
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"]
는 "Completed"가 된다.여기서 끝이 아니다.
람다 환경에서 cloudfront invalidation이 일어나도록 만들기 위해서는 lambda 함수에 role을 생성해 주어야 한다.
여기를 참고해 role을 생성했다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": [
"<Your ARN>"
]
}
]
}