본문 바로가기

카테고리 없음

AWS s3-Cloudfront 리액트 프로젝트 Codepipeline 자동화 (Lambda)

반응형

 

이전 글에서 s3 - Cloudfront에 리액트 프로젝트를 배포하는 법을 알아보았는데

 

이번에 Codepipeline을 이용해서 깃으로 푸쉬 할 때 마다 자동으로 배포와 Cloudfront의 배포 무효화 까지 한 번에 하는 방법을 알아보자

 

기존 CodePipeline 생성 시 기본적인 세팅들을 그대로 따라가주면 혹 buildspec.yml 파일을 작성하는데 어려움이 있다면 아래를 참고하면 되겠다. 

 

 

* buildspec.yml 파일 생성

 

 

 

base-directory 폴더명은 본인이 빌드 파일 떨구는 폴더 명을 적어주면 된다. 

 

 

기존 Codepipeline을 이용한 배포에서 추가적으로 해줘야 할 것이 있는데 바로 Deploy 다음에 스테이지 하나를 추가하여 

Cloudfront에 배포 무효화 해주는 것이다.

 

무효화는 AWS Lambda를 이용해서 해줄 건데 

 

런타임을 파이썬으로 선택해주고 생성해주고 (파이썬 몰라도 된다)

 

import json
import boto3

code_pipeline = boto3.client("codepipeline")
cloud_front = boto3.client("cloudfront")

def lambda_handler(event, context):
    job_id = event["CodePipeline.job"]["id"]
    try:
        user_params = json.loads(
            event["CodePipeline.job"]
                ["data"]
                ["actionConfiguration"]
                ["configuration"]
                ["UserParameters"]
        )
        cloud_front.create_invalidation(
            DistributionId=user_params["distributionId"],
            InvalidationBatch={
                "Paths": {
                    "Quantity": len(user_params["objectPaths"]),
                    "Items": user_params["objectPaths"],
                },
                "CallerReference": event["CodePipeline.job"]["id"],
            },
        )
    except Exception as e:
        code_pipeline.put_job_failure_result(
            jobId=job_id,
            failureDetails={
                "type": "JobFailed",
                "message": str(e),
            },
        )
    else:
        code_pipeline.put_job_success_result(
            jobId=job_id,
        )

 

 

위 코드를 입력해주고 

 

구성 탭 에서 역할 권한에 

 

{
    "Effect": "Allow",
    "Action": [
        "codepipeline:PutJobFailureResult",
        "codepipeline:PutJobSuccessResult",
        "cloudfront:CreateInvalidation"
        ],
    "Resource": "*"
}

 

위 권한을 추가해준뒤 

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codepipeline:PutJobFailureResult",
                "codepipeline:PutJobSuccessResult",
                "cloudfront:CreateInvalidation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:ap-northeast-2:***********:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:ap-northeast-2:***************/aws/lambda/******************:*"
            ]
        }
    ]
}

 

 

위와 같은 JSON이 될것이다. 

 

다시 Codepipeline Deploy 다음 스테이지를 하나 추가해준 뒤

 

공급자로 람다를 선택 해주고 만들었던 함수 명 검색해서 선택 해주고 

 

{"distributionId": "cloudfront-distributionId", "objectPaths": ["/*"]}

 

사용자 파라미터에 위 객체를 넣어주면 된다. 

 

저장하고 실행시켜 보고 만약 성공이 떳다면 Cloudfront에 무효화가 일어났는지, s3에 파일은 제대로 업데이트 되고 있는지 확인해보고 마무리 하면 될 것이다. 

 

 

 

반응형