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의 구성 요소
구분 | 내용 |
애플리케이션 | 배포할 응용 프로그램을 고유하게 식별하는 이름으로 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에는 적용할 수 없다.
[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을 활용한 배포 작업은 다음과 같은 프로세스로 수행
ㅇ 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 |