본문 바로가기

AWS DevOps/AWS CICD 서비스

AWS CodeDeploy

AWS CodeDeploy는 Amazon EC2, Amazon ECS, AWS Lambda 및 On-Premise 서버와 같은 다양한 컴퓨팅 서비스에 대해 소프트웨어 배포를 자동화하여 제공하는 완전 관리형 배포 서비스

 

AWS CodeDeploy는 지속적인 배포(Continuous Deploy)를 지원하는 대표적인 CD 도구로써, AWS CodeDeploy를 사용하게 되면 새로운 기능 및 문제가 되는 코드에 대해 빠르고 신속하게 배포할 수 있다.

 

AWS CodeDeploy를 사용하면 AWS Console 또는 AWS CLI를 통해 배포를 시작하고, 배포 상태에 대한 추적을 할 수 있으며, 상세한 보고서를 통해 애플리케이션의 수정 버전이 언제 어디에 배포되었는지 확인할 수 있고, 푸시 알림을 통해 배포에 대한 라이브 업데이트를 받을 수 있다.

 

AWS CodeDeploy를 사용하면 소프트웨어 배포 프로세스 진행 시 애플리케이션의 가용성을 최대화하면서, 다양한 배포 방식을 통해 가동 중지 시간을 최소화 할 수 있다.

 

AWS CodeDeploy는 플랫폼과 언어에 구애를 받지 않고, 모든 애플리케이션과 연동이 가능하며, EC2, Fargate, Lambda에 동일한 환경을 제공할 수 있다. 또한 기존 설정 코드를 손쉽게 재 사용할 수 있으며, 기존 소프트웨어 릴리스 워크플로우나 지속적인 배포 도구(AWS CodePipeline, GitHub, Jenkins)와도 통합하여, 지속적인 배포(Continuous Deploy)를 지원할 수 있다.

 

구분 내용
서비스명 AWS CodeDeploy
설명 코드 배포를 자동화하여 애플리케이션 가동 시간 유지
주요 특징 - 효율적인 서버에 코드 배포
- 높은 확장성 및 신뢰성 제공
- 애플리케이션에 상관 없으며, Windows, Linux, EC2, On-Premise 등 지원
- Amazon S3, CodeCommit, CodePipeline, Git, ELB, Auto-Scaling 등과 통합
프리티어 - Amazon EC2, Lambda에서 사용하는 경우 추가 비용 없음
- On-Premisedp Agent 설치 사용 시 업데이트당 $0.02 비용 지불

 

ㅁ AWS CodeDeploy 특징

 

 ㅇ 첫번째 자동화된 배포

 

AWS CodeDeploy는 반복적인 배포를 손쉽게 수행할 수 있으며, On-Premise 환경에 대한 배포와 Auto Scaling 배포 지원을 통해 서비스의 확장성을 지원한다.

 

구분 내용
반복적인 배포 - 인스턴스 그룹을 통해 애플리케이션을 손쉽고 반복적으로 배포
- 수동 배포를 없애고, 배포의 신뢰성과 속도를 향상시킬 수 있음
- command-line 또는 Install, AppSpec.yaml 통해 코드 재사용 가능
- EC2, Lambda 등 다른 환경에도 코드를 재활용하여 배포 가능
On-Premise 환경의 배포 - 다양한 인스턴스, 다양한 환경에서 배포 수행 가능
- 단일 서비스로 데이터 센터를 포함하여 애플리케이션의 배포 가능
자동화된 확장성 - 애플리케이션을 최신 상태로 유지 및 배포, 확장 수행 가능
- Auto-Scaling과 연동하여, 조건에 따라 EC2의 확장/축소 기능
- 새 인스턴스가 Auto Scaling으로 시작되면, 이를 알려주고 해당 인스턴스에 대한 배포 작업을 수행한 다음 로드밸런서 추가
- Lambda는 응답 트래픽이 증가되면 AWS CodeDeploy와 통합을 통해 최신 코드가 배포됨

 

 ㅇ 두번째: 서비스 가동 중지 시간 최소화

 

AWS CodeDeploy는 서비스 다운타임을 방지하거나 최소화하며, 배포 수행 중 애플리케이션의 가용성을 극대화 할 수 있다. 다양한 배포 방법을 통해 점진적으로 업데이트를 수행할 수 있으며, 설정을 통해 배포 상태를 추적하거나 모니터링 할 수 있다.

 

구분 내용
Blue/Green 배포 - 서비스 다운타임 없이 새로운 버전으로 업데이트 수행 가능
- 배포 그룹을 구성하고, 기존의 배포 그룹이 신규로 배포된 소스가 적용된 배포 그룹으로 자동 대체되어 중지 최소화
- AWS Lambda 기능을 사용하여 트래픽을 이전 버전에서 새로운 버전으로 점진적으로 라우팅 수행
- Blue/Green 배포를 통해 새로운 코드에 대해 새로운 인스턴스 그룹으로 코드 배포 수행
In-Place 배포  - 배포 그룹의 각 인스턴스 애플리케이션 중지 후 애플리케이션 수정 버전이 설치되고 유효성 검사 수행
- 로드밸런서를 사용하여 배포 진행 시 인스턴스를 제외하고 배포를 수행하며, 테스트 완료 후 서비스로 복원 수행

 

 ㅇ 세번째: 배포 서비스에 대한 모니터링

 

AWS CodeDeploy는 AWS Management Console 또는 AWS CLI를 통해 배포를 수행하고 진행 상태를 추적할 수 있다. 또한 진행 상황에 대해 상세한 보고서를 제공하며 SNS(Amazon Simple Notification Service)에서 푸시 알림 설정을 통해 실시간 배포 상황에 대한 업데이트를 받을 수 있다.

 

구분 내용
모니터링 및 관리 - Console, SDK, CLI 사용하여 배포 수행 및 모니터링 및 제어 수행
배포 이력 관리 - AWS CodeDeploy  배포 기록의 추적 및 저장
- 배포 그룹별 현재 배포된 버전, 변경된 기록 배포의 성공률 조회
다중 배포 수행 - 애플리케이션을 여러 배포 그룹으로 배포 가능
- 배포 그룹은 서로 다른 구성 환경 사용
- 절차에 따라 스테이징 환경에 코드를 전개하고, 검증 확인 수행 후 운영 환경에 배포 작업 수행 가능

 

 ㅇ 네번째: 손쉬운 서비스 확장

 

AWS CodeDeploy는 플랫폼, 아키텍처 및 언어에 구애받지 않고 모든 종류의 애플리케이션과 연동 가능, 사용자는 Amazon EC2, Lambda에 배포를 수행하는 경우 동일한 방식으로 배포를 수행할 수 잇으며, 지속적인 배포(Continuous Deploy)의 워크플로우나 기존 소프트웨어 릴리스 프로세스와 손쉽게 통합할 수 있으며, 기존 코드를 재사용할 수 있다.

 

구분 내용
지원 언어 및 아키텍처 - Command-Line 기반 또는 설치 기반 모델을 사용하여 배포 가능
- 애플리케이션 배포를 위한 구성 파일인 AppSpec.yaml 사용
- 수명 주기에서 각 이벤트에 대한 테스트, 동작 및 확인 작업 실행
기존 서비스 통합 - CodeDeploy API는 배포를 기존 제공 툴체인과 쉽게 통합
- AWS CodeStar, CodePipeline 및 기타 AWS 서비스는 CI/CD용 AWS CodeDeploy를 통해 서비스의 통합 지원 수행

 

ㅁ AWS CodeDeploy의 구성 요소

 

CodeDeploy 주요 구성 요소

 

구분 내용
애플리케이션 배포할 응용 프로그램을 고유하게 식별하는 이름으로 AWS CodeDeploy가 배포를 수정하며, 수정, 배포 구성, 배포 그룹의 올바른 참조를 위한 컨테이너 역할 수행
컴퓨팅 플랫폼 AWS CodeDeploy가 애플리케이션을 배포하는 대상 플랫폼으로 EC2/On-Premise 인스턴스나 AWS Lambda, AWS ECS를 말함
애플리케이션 사양파일 배포할 애플리케이션에 대한 정보를 지정하는 YAML 형식 또는 JSON 형식의 파일이거나, EC2/On-Premise용 소스코드, 웹페이지, 실행 파일 및 배포 스크립트 등과 같은 소스 콘텐츠 및 application specification file(AppSpec file)을 포함하는 아카이브 파일
배포 구성 배포 중 AWS CodeDeploy에서 사용하는 배포 규칙과 배포 성공 및 실패 조건 세트로 EC2/On-Premise 인스턴스의 최소 개수를 지정하거나, Lambda 함수 버전으로 특정 트래픽이 라우팅되는 방식(Canary, Linear, All at-Once) 지정 가능
배포 그룹 개별 인스턴스들의 세트로 배포 그룹에는 개별적인 태그가 지정된 인스턴스 또는 Auto Scaling 그룹에 포함된 Amazon EC2 포함
배포 방식 배포를 수행하는 방식으로 실행 중 배포를 수행하는 인플레이스(In-Place) 배포와 대체 환경을 만들어 점진적인 배포를 수행하는 블루/그림(Blue/Green) 배포 방식이 있음
서비스 역할 AWS 리소스에 엑세스할 수 있는 권한을 지정하는 IAM 역할로 인스턴스, Auto Scaling, Load Balancer의 작업 등을 수행하기 위한 권한 부여
IAM 프로파일 Amazon EC2 인스턴스에 연결하는 IAM 역할로 IAM 프로파일에는 애플리케이션이 저장되는 Amazon S3 버킷 또는 GitHub 리포지토리에 엑세스할 때 필요한 권한 포함

 

ㅁ AWS CodeDeploy의 동작 방식

 

ㅇ 첫번째: In-Place 배포:

 

 - 배포 그룹 각 인스턴스의 애플리케이션에 대해 중지를 수행하고 애플리케이션 수정 버전(Revision)의 설치를 진행한 후 유효성이 검사를 수행하여 이상 유무를 확인

 

 - 로드밸런서를 사용하여 배포를 진행하는 경우 배포 대상인 인프선스를 로드 밸런스 서비스에서 제외한 후 배포를 수행하며, 테스트를 모두 완료하고 로드밸런스에 대상 인스턴스를 추가하여 서비스를 수행하는 방식

 

 - 이 인플레이스배포는 AWS Lambda에는 적용할 수 없다. 

 

CdeDeploy In-Place 방식 배포

  [1 단계]

   - 로컬 개발 머신에서 배포할 Revision을 만든 다음 application specification file(AppSpec file)을 추가,

   - AppSpec file은 CodeDeploy에 고유하며, CodeDeploy가 실행하려는 배포 작업을 정의

   - 배포 가능한 콘텐츠 및 AppSpec file을 아카이브 파일로 번들링한 다음 Amazon S3 버킷 또는 GitHub 리포지토리로 업로드

   - 이런 아카이브 파일을 애플리케이션 개정(Revision) 이라고 한다.

 

  [2단계]

   - CodeDeploy에 배포에 관한 정보를 제공 (개정(Revision)을 풀링하려는 Amazon S3 Bucket 또는 GitHub 리포지토리 및 개정의 내용을 배포하려는 Amazon EC2 인스턴스 세트)

   - CodeDeploy에서는 Amazon EC2 인스턴스 세트를 배포 그룹(Deployment Group)이라고 함

   - 배포 그룹에는 개별적으로 태그가 지정된 Amazon EC2 인스턴스, Amazon EC2 Auto Scaling 그룹의 Amazon EC2 인스턴스 또는 둘다 포함

 

  [3단계]

  - 각 인스턴스의 CodeDeploy 에이전트가 CodeDeploy를 폴링하여 지정된 Amazon S3 버킷 또는 GitHub 리포지토리에서 Pulling할 항목 및 시점을 결정

 

  [4단계]

  - 각 인스턴스의 CodeDeploy 에이전트가 Amazon S3 버킷 또는 GitHub 리포지토리에서 대상 개정을 풀링하고 AppSpec file의 지침을 따르면 콘텐츠가 인스턴스에 배포됨

 

ㅇ 두번째 블루/그린(Blue/Green) 배포

 

 [1단계]

 - 기존 인스턴스 세트와 동일한 대체 인스턴스 세트를 구성하여, 신규 기능 또는 변경된 사항을 해당 서버와 시스템에 적용

 - AWS Route 53에서 모든 네트워크 트래픽은 기존 인스턴스 세트로 100% 라우팅 되며, 대체 인스턴스 세트는 Standby 유지

 

 [2단계]

 - AWS Route 53의 가중치 기반(Weighted Based) 라운드로빈을 사용하여 트래픽의 일부를 대체 인스턴스로 전환하여, 새로운 기능과 서비스에 대해 테스트 진행

 - 새로운 기능 및 서비스 테스트 진행 중 문제 발생 시 손쉽게 롤백 수행

 

 [3단계]

 - AWS Route 53의 가중치 기반(Weighted Based) 라운드로빈을 사용하여 트래픽의 대체 인스턴스로 전환

 - 지속적인 테스트와 서비스 검증을 수행하며, 사용자의 Feedback 및 수정 사항 반영

 - 테스트 진행 중 문제 발생 시 손쉽게 롤백 수행 가능

 

[4단계]

 - 신규 기능 및 변경된 서비스에 대한 테스트와 검토가 완료된 후 전체 트래픽을 대체 인스턴스로 전환

 - 더 이상 기존 서비스로 트래픽이 발생되지 않는 시점에서 기존 인프라 서비스 중지 및 삭제

 

ㅁ AWS CodeDeploy의 라이프사이클 이벤트와 AppSpec.yaml 구성

 

EC2/On-Premise에 대한 배포 작업을 수행하는 경우 AppSpec 파일 참조를 통한 배포 Hook 작업을 수행하게 됨

본 작업은 배포 당 한번 실행되며, 진행중에 실행될 스크립트를 지정할 수 있다.

 

 ㅇ AppSpec을 활용한 배포 작업은 다음과 같은 프로세스로 수행

 

CodeDeploy 배포 참조 파일 (AppSpec.yaml) 및 프로세스

 ㅇ AppSpec file(Application specification file)은 AWS CodeDeploy가 배포를 관리하기 위해 사용하는 YAML 형식의 파일 또는 JSON 형식의 파일

 

version: 0.0
os: linux
files:
  - source: /
  destinatio: /var/ww/html
Perfmissions:
  - object: /var/www/html
  pattern: "*.html"
  owner: root
  group: root
  mode: 755
hooks:
  ApplicationStop:
    - location : scripts/deregister_from_elb.sh      # ELB에 인스턴스 제거
  BeforInstall:
    - location : scripts/install_dependencies.sh     # 종속성 패키지 설치
  ApplicationStart:
    - location : scripts/start_httpd.sh              # 아파치 서비스 시작
  ValidateSTart:
    - location : scripts/test_sit.sh                 # 배포 성공시 확인
    - location : scripts/register_with_elb.sh        # ELB에 인스턴스 추가

 

'AWS DevOps > AWS CICD 서비스' 카테고리의 다른 글

AWS CodePipeline  (0) 2021.02.21
AWS CodeBuild  (0) 2021.02.20
AWS CodeCommit  (0) 2021.02.20
CI/CD를 위한 도구들  (0) 2021.02.20
CD(Continuous Delivery/Continuous Deployment) - 지속적인 전달 및 배포  (0) 2021.02.20