지금까지 구성한 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임

  • 배포 작업이 완료되었으므로 원래 작업 세트 종료 버튼을 선택해 원본 작업은 종료 처리