AWS에서 CI/CD 환경 구성 #5 - 파이프라인 구성(Blue/green), CodePipeline

지금까지 구성한 CodeCommit, CodeBuild, CodeDeploy 및 CodePipeline 서비스를 활용하여 코드를 통합, 빌드 및 배포하는 방법을 알아보겠습니다.
이 문서에서는 배포 방식으로 Blue/green deployment를 활용하겠습니다.
사전 준비
ECS(Elastic Container Service) 구성
이 문서에서는 애플리케이션을 배포할 서버로 ECS(Elastic Container Service) 서비스를 사용합니다.
아래 문서를 참고하여 ECS 환경을 구성할 수 있습니다.
AWS ECS 구성 및 활용하기 #1 - 사전 준비 및 클러스터 생성하기
AWS ECS 구성 및 활용하기 #2 - 작업 정의 구성하기(ECS Task)
AWS ECS 구성 및 활용하기 #3 - 서비스(ECS Service) 구성하기
경고
이 문서에서는 서비스(ECS Service) 구성하기에서 배포 방식을 Blue/green deployment로 선택해야합니다.
Branch 생성
Blue/green 배포를 위해 사용할 리포지토리를 생성합니다. CodeCommit의 cicd-demo 리포지토리에 blue/green branch를 생성해보겠습니다.
-
CodeCommit Console 접속 > 왼쪽 메뉴의 소스 > 리포지토리
-
리포지토리 리스트 > cicd-demo 선택 > 왼쪽 메뉴에서 브랜치 선택
-
메인 화면 > 브랜치 생성 버튼 선택
-
브랜치 이름에 bluegreen 입력 > 다음으로부터의 브랜치에 master 선택 > 브랜치 생성 버튼 선택
-
브랜치 리스트 > bluegreen 선택해 이동
App spec 변경
-
CodeCommit Console 접속 > 왼쪽 메뉴의 소스 > 리포지토리
-
리포지토리 리스트 > cicd-demo 선택 > bluegreen branch 선택
-
파일 추가 > 파일 생성 버튼 선택
-
파일 내용에 아래 내용 입력
version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "arn:aws:ecs:AWS_DEFAULT_REGION:AWS_ACCOUNT_ID:task-definition/TASK_NAME" LoadBalancerInfo: ContainerName: "CONTAINER_NAME" ContainerPort: CONTAINER_PORT
참고
AWS_DEFAULT_REGION과 같은 환경 변수는 코드 빌드 시 치환함
-
파일 이름에
appspec.yaml
파일을 입력 > 변경 사항 커밋 버튼 선택
Build spec 변경
-
CodeCommit Console 접속 > 왼쪽 메뉴의 소스 > 리포지토리
-
리포지토리 리스트 > cicd-demo 선택 > bluegreen branch 선택
-
buildspec.yaml
파일 아래와 같이 편집<buildspec.yaml> version: 0.2 phases: install: runtime-versions: java: openjdk8 docker: 18 pre_build: commands: - echo Logging in to Amazon ECR... - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION) build: commands: - echo Build started on `date` - echo Building the Docker image... - mvn clean package - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - sed -i s/AWS_DEFAULT_REGION/$AWS_DEFAULT_REGION/ appspec.yaml - sed -i s/AWS_ACCOUNT_ID/$AWS_ACCOUNT_ID/ appspec.yaml - sed -i s/TASK_NAME/$TASK_NAME/ appspec.yaml - sed -i s/CONTAINER_NAME/$CONTAINER_NAME/ appspec.yaml - sed -i s/CONTAINER_PORT/$CONTAINER_PORT/ appspec.yaml artifacts: files: - appspec.yaml cache: paths: - '/root/.m2/**/*'
추가된 내용은 아래와 같습니다.
appspec.yaml
파일의CONTAINER_NAME
과 같은 환경 변수를 치환appspec.yaml
파일을 artifacts file에 추가
환경 변수 설정
buildspec.yaml
파일의 환경 변수를 CodeBuild에서 설정하겠습니다.
-
CodeBuild Console 접속 > 왼쪽 메뉴의 프로젝트 빌드
-
메인 화면의 빌드 프로젝트 리스트에서 cicd-demo 선택 > 빌드 세부 정보 탭 선택
-
환경 > 편집 버튼 선택
-
추가 구성 확장 > 환경 변수 입력 > 환경 업데이트 버튼 선택
이름 값 AWS_DEFAULT_REGION 리전 이름 AWS_ACCOUNT_ID 계정 아이디 IMAGE_REPO_NAME ECR 이름 IMAGE_TAG Docker 이미지 태그 이름 TASK_NAME ECS Task 이름 CONTAINER_NAME 컨테이너 이름 CONTAINER_PORT 컨테이너 포트
배포 그룹 설정 변경
Blue/green 방식으로 배포한 후 기존 서버(Blue)의 트래픽을 신규 서버(Green)로 1)바로 이동시키거나 2)승인 후 이동하도록 설정할 수 있습니다.
이 문서에서는 승인 후 이동하도록 설정을 변경해보겠습니다.
-
CodeDeploy console 접속 > 왼쪽 메뉴의 애플리케이션 선택
-
애플리케이션 리스트 > AppECS-cicd-demo-cicd-demo 선택
-
배포 그룹 리스트 > DgpECS-cicd-demo-cicd-demo 선택
-
배포 그룹 > 편집 버튼 선택
-
배포 설정 > 트래픽을 언제 다시 라우팅할지 지정 선택 > 시간을 1시간으로 설정
파이프라인 구성(Blue/green deployment)
- CodePipeline 콘솔에 접속 > 왼쪽 메뉴의 파이프라인 > 파이프라인 선택
- 메인 화면 >
파이프라인 생성
버튼 선택
파이프라인 설정 선택
- 파이프라인 이름 > cicd-demo-bluegreen 입력
- 서비스 역할 > 기존 서비스 역할 선택
- 역할 이름 > codepipeline-cicd-demo-role 선택 > 다음 버튼 선택
소스 스테이지 추가
- 소스 공급자 > AWS CodeCommit 선택
- 리포지토리 이름 > cicd-demo 선택
- 브랜치 이름 > bluegreen 선택 > 다음 버튼 선택
빌드 스테이지 추가
- 빌드 공급자 > AWS CodeBuild 선택
- 프로젝트 이름 > cicd-demo 검색 및 선택 > 다음 버튼 선택
배포 스테이지 추가
- 배포 공급자 > Amazon CodeDeploy 선택
- 애플리케이션 이름 > AppECS-cicd-demo-cicd-demo 선택
- 배포 그룹 > DgpECS-cicd-demo-cicd-demo 선택 > 다음 버튼 선택
검토
- 파이프라인 검토 후 다음 파이프라인 생성 버튼 선택
파이프라인 실행
파이프라인을 생성하면 자동으로 소스코드 통합 > 빌드 > 배포 과정이 발생합니다.
이 후에는 1)수동으로 파이프라인을 실행하거나 2)CodeCommit의 소스코드 변경사항을 감지해 실행됩니다.
수동으로 파이프라인 실행
-
CodePipeline Console > 왼쪽 메뉴의 파이프라인 > 파이프라인 선택
-
메인 화면의 파이프라인 리스트 > cicd-demo-bluegreen 선택
-
변경사항 릴리스 버튼을 선택
변경사항에 의해 자동으로 실행
-
CodeCommit Console 접속 > 왼쪽 메뉴의 소스 > 리포지토리
-
리포지토리 리스트 > cicd-demo 선택 > bluegreen branch 선택
-
src/main/resources/messages/messages.properties
파일 아래와 같이 편집메세지의 welcome 프로퍼티를
Welcome(Version 2)
에서Welcome(Version 3)
로 변경 >변경 사항 커밋
버튼 선택 -
CodePipeline Console > 왼쪽 메뉴의 파이프라인 > 파이프라인 선택
-
메인 화면의 파이프라인 리스트 > cicd-demo-bluegreen 선택
소스코드 변경을 감지하고 자동으로 빌드와 배포 파이프라인이 실행됨
-
Deploy 단계가 넘어가면 세부 정보 선택해서 배포 상태 조회하면으로 이동
-
교체 작업(Green)을 배포 완료했으나 트래픽은 원본 작업(Blue)으로 연결된 상태
-
웹 브라우저 > ELB DNS 주소로 접속 > 원본 작업(Blue)이므로 Version이 2임
-
웹 브라우저 > 테스트 포트(ELB DNS 주소 +
:8080
) > 교체 작업(Green)이므로 Version이 3임 -
트래픽 다시 라우팅 버튼을 선택해 교체 작업(Green)으로 트래픽을 이동
-
트래픽 전환이 완료될때까지 대기
-
웹 브라우저 > ELB DNS 주소로 접속 > 트래픽이 교체 작업(Green)으로 완전히 라우팅 되었으므로 Version이 3임
-
배포 작업이 완료되었으므로 원래 작업 세트 종료 버튼을 선택해 원본 작업은 종료 처리