
참고 자료
참고 자료의 내용을 보면 캐시 무효화 시키기 위해 lambda 를 이용하지만 lambda 트리거를 호출하는 방법이 2가지가 있다.
1. codePipeline 에서 S3 배포 후 lambda 함수 실행
2. S3 버킷 변경이 생겼을 때 lambda 함수 실행
codePipeline 마지막에 lambda 함수를 실행하면 깔끔하여 해당 방법으로 시도했지만 그 당시 권한이 codePipeline 이 lambda 함수를 실행시킬 권한이 부족했기에 2번째 방법으로 바꿨다.
(지금은 해당 권한이 열린거 같다)

참고 자료의 코드가 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 본인 버킷 -> 속성 으로 들어가 하단에 이벤트 알림을 찾는다.

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

여기서 접두사가 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 를 적용한다.
잘 보고 갑니다 다르 👍🏻