<aside> <img src="https://img.icons8.com/ios/250/FFFFFF/light-on.png" alt="https://img.icons8.com/ios/250/FFFFFF/light-on.png" width="40px" /> 이번 태스크의 목표는 Codel deploy 옵션을 사용하여 무정지 배포를 적용하고 되도록 콘솔이 아닌 CLI환경에서 빠르고 간단하게 배포할 수 있는 플로우를 만드는 것이다.

</aside>

CodeDeploy

CodeDeploy는 AWS에서 지원하는 서비스를 자동화 배포 및 무정지 배포(블루그린)를 하도록 지원하는 서비스이다. 특히 ECS에 대해서 태스크 별로 애플리케이션을 배포하는 데에 사용을 하며 태스크 정의를 선택하여 자동으로 로드밸런싱을 통해서 blue/green 배포를 가능하게 한다.

권한 설정

CodeDeploy의 애플리케이션을 생성하기 위해서는 먼저 CodeDeploy에 관련한 IAM 역할을 설정해야 한다. AWS에서 기본으로 제공되는 정책인 AWSCodeDeployRoleForECS를 사용하여 IAM 역할을 생성한다. → AWS 공식문서에 따르면 한정적인 권한을 주기위해서 IAM 정책을 새롭게 정의할 수도 있다고 한다.

블루그린 배포

배포가 진행되는 과정은 다음과 같이 정리할 수 있다.

  1. 기존(원본)의 컨테이너 인스턴스가 실행 중인 상태

    Untitled

  2. 새로운 대체 컨테이너 인스턴스에 컨테이너가 실행되기 시작한다.

    Untitled

    새로운 대체 컨테이너 인스턴스가 실행된다. 아직 트래픽이 분산되어 실행되지는 않는다.

  3. 트래픽이 분산되어 실행되게 된다.

    Untitled

    CodeDeploy의 옵션에 따라서 분산의 비율과 빠르기를 설정할 수 있다.

    → 현재는 1분에 10% 가량 이동하면서 트래픽이 분산된다.

  4. 트래픽이 완전히 전환되고 대기상태(1시간)가 지속된다.

    Untitled

    트래픽이 완전히 전환된 상태에서 1시간 가량 대기를 하면서 이상이 없는지 확인할 수 있다. 놀라운 점은 형태 모든 트래픽은 81번 포트로 전환이 되었음에도 80번 81번으로 전부 통신이 가능하다.

  5. 기존의 원본의 컨테이너가 down된다.

    Untitled

    대기상태를 지나서 추가적인 작업이 필요하지 않다고 판단이 된다면 기존의 원본 컨테이너 인스턴스가 실행이 된다. → 만약 문제가 생긴다면 롤백을 통해 바로 이전 버전으로 돌아갈 수 있다.

롤백(Rollback)

대체 컨테이너 인스턴스에 문제가 생기는 경우 롤백 버튼을 툴러서 아래와 같이 이전버전으로 손쉽게 돌아갈 수 있다.

Untitled

배포 플로우(Deployment flow)

CodeDeploy의 배포는 손수 수동으로 ECS의 서비스를 업데이틀 할 수있지만 AWS CLI를 이용하여 명령어를 통해서 실행이 가능하다.

위의 과정은 아래와 같이 요약할 수 있다. 실제 상황의 경우는 불필요한 yaml 파일의 생성과 json의 생성을 막기 위해서 아래와 같이 python 코드와 boto3 라이브러리를 이용하여 하나의 실행 파일에 위의 과정을 실행하였다.