본문 바로가기

Cloud/AWS

[AWS Developer Associate] AWS CI/CD 정리

버전 관리

- 시간이 지남에 따라 코드에 발생하는 다양한 변경 사항을 이해하고 롤백 할 수 있는 기능

 

CI/CD란?

- Continuous Integration/Continuous Delivery

- 애플리케이션 개발에 필요한 여러 단계에 대한 자동화를 통해 애플리케이션을 보다 빠르고 짧은 주기로 고객에게 제공하는 방법

- 지속적인 통합/지속적인 서비스 제공 및 지속적인 배포를 통해 새로운 코드의 통합, 테스트, 릴리스, 배포 등의 애플리케이션 라이프사이클 전체에 대한 자동화 과정을 모니터링 가능하도록 하는 것을 말한다.

 

CodeCommit

- 프라이빗 Git 리포지토리를 호스팅하는 안전하고 확장성이 뛰어난 관리형 소스 제어 서비스

- 일반적인 애플리케이션 개발을 진행하면서 개발된 소스를 저장하고 제어할 수 있는 기능을 제공

- 관리형 클라우드 서비스이므로 소스코드를 저장하기 위한 리포지토리를 생성만 하면 되며, 프로비저닝 및 확장할 하드웨어나 설치, 구성, 운영할 소프트웨어가 없다.

- HTTP/SSH를 활용하여 파일을 송수신할 수 있으며, 소스 저장에 사용되는 레포지토리는 KMS를 통해 저장 중 자동으로 데이터를 암호화한다. 

-IAM 정책을 이용해서 사용자와 특정 레포지토리에 대한 역할 권한을 관리할 수 있다.

 

Git 자격 증명

- AWS CodeCommit은 콘솔에서 파일 업로드, 추가, 편집을 수행할 수 있습니다.

- 여러 파일이나 브랜치 전반의 파일에 대해 직접적인 작업을 수행하기 위해서는 로컬 컴퓨터에서 AWS CodeCommit에 접속할 수 있도록 인증을 위한 설정을 수행하는 것이 필요합니다.

-> 이를 위하여 Git 자격 증명을 활용하여 AWS CodeCommit을 연결할 수 있도록 설정할 수 있습니다.

 

CodePipeline

- 빠르고 안정적으로 애플리케이션과 인프라의 업데이트를 위한 릴리스 파이프라인을 자동화할 수 있도록 서비스 형태로 제공되는 완전 관리형으로 지속적인 전달을 제공하는 서비스

- AWS내에서 CI/CD를 조정해주는 비주얼 워크플로 도구.

- 코드에 변경이 있을 때마다 사용자가 사전에 정의한 릴리스 모델을 기반으로 애플리케이션의 릴리스 프로세스의 빌드, 테스트, 배포 단계에 걸친 프로세스에 대해 자동화를 수행

- AWS CodeCommit, GitHub, ECR, S3 에서 바로 파이프라인에 대한 소스코드를 가져올 수 있으며, CodeBuild에서 빌드와 단위 테스트를 실행할 수 있다.

- Lamda와 통합된 CodePipeline을 사용하여 파이프라인의 어느 단계에서든 코드에서 정의한 사용자 정의 함수를 트리거할 수 있으며, 이를 통해 지속적인 전달 과정에서 필요한 자신만의 커스텀 워크플로우를 구현할 수 있다.

 

CodePipeline의 주요 기능

1. 지속적인 배포를 위한 워크플로우 모델링

2. AWS 서비스와의 통합. AWS CodeCommit, S3에서 소스 코드를 가져올 수 있으며, CodeBuild와 통합하여 단위 테스트를 수행할 수 있다. 또한 AWS CodeDeploy, AWS Elastic Beanstalk, ECS, AWS Fargate를 사용하여 변경 사항을 배포할 수 있다.

CloudFormation템플릿을 이용하여 리소스를 업데이트하거나 삭제할 수 있으며 이를 통해 SAM을 사용하며 AWS Lambda, Amazon API Gateway 및 Amazon DynamoDB와 같은 서버리스 애플리케이션에 대해 파이프라인을 적용할 수 있다.

또한 AWS CodePipeline의 어느 단계에서나 코드에서 정의한 사용자 정의 함수를 트리거할 수 있다.

3. 타사 개발자 도구 및 사용자 지점 시스템과의 통합. GitHub와 Jenkins 같은 타사 개발자 도구를 배포 프로세스에서 원하는만큼 통합할 수 있다.

4. 선언형 템플릿과 엑세스 제어. IAM을 사용하여 누가 릴리스 워크플로를 변경 및 제어할 수 있는지 관리. IAM사용자, IAM역할, SAML 통합 디렉터리를 통해 사용자에게 엑세스 권한을 부여하여, 배포 프로세스에 대한 제어를 수행할 수 있습니다.

 

CodeBuild

- 소프트웨어에 필요한 소스코드를 컴파일하는 단계에서부터 테스트 후 소프트웨어 배포까지의 단계를 지원하는 완전 관리형 지속적 통합 서비스

- CodeBuild를 사용하면 자체 빌드 서버가 필요하지 않으며, 빌드 서버를 프로비저닝하거나, 운영/관리 및 확장을 수행할 필요가 없습니다.

- 빌드를 수행할 볼륨에 따라 인프라가 자동으로 확장 및 축소를 지원하여, 제출되는 빌드에 대해 즉각적으로 처리되므로, 여러 빌드를 동시에 처리할 수 있기 때문에 빌드를 위해 대기하지 않고 빠르고 효율적으로 빌드 작업을 수행할 수 있다.

- KMS를 이용하여 빌드 아티팩트가 암호화되며, IAM을 통해 권한을 관리할 수 있다. 

- 빌드 구성 : buildspec.yml (코드의 루트에 위치해야함) 파일을 통해서 단위 테스트, 코드 패키지 및 Built-To-Package 설치와 같은 명령을 지정할 수 있으며, 수행 단계별로 실행하도록 구성할 수 있다.

- 애플리케이션이 구축되면 출력 로그가 S3와 CloudWatch로그에 저장되어 나중에 분석할 수 있다.

- Java, Node.js, Python, Go, Ruby, Android 및 Docker를 위한 사전 구성된 빌드 환경을 제공. Docker 이미지 또는 퍼블릭 Docker Hub에 업로드하거나 ECR을 관리하기 위해 런타임과 도구를 패키징하여 자신만의 빌드 환경을 구성할 수 있다.

 

CodeDeploy

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

- 지속적인 배포를 지원하는 대표적인 CD 도구

- 새로운 기능 및 문제가 되는 코드에 대해 빠르고 신속하게 배포

- 애플리케이션을 배포하는 동안 기존 서비스에 영향을 최소화하면서 배포를 수행할 수 있는 다양한 배포 방법을 지원

 

[실행 절차]

1. EC2 인스턴스 또는 온프레미스 서버에서 CodeDeploy 를 사용하여면 CodeDeploy 에이전트를 먼저 설치해야 한다.

2. 코드를 CodeCommit에 푸시하거나, 배포할 준비가 된 코드 아티팩트는 S3나 GitHub에 저장돼야 한다.

3. CodeDeploy에서 배포를 실행하면 빌드 코드와 appspec.yml파일을 GitHub나 Amazon S3에서 불러오게 되고, CodeDeploy Agent는 appspec.yml파일의 모든 배포 지침을 실행

4. 배포가 실행되고 배포에 대한 성공이나 실패 등의 결과가 Agent에서 CodeDeploy서비스로 보고된다.

 

[배포 방식]

1. Blue/Green배포

- 서비스 다운타임 없이 새로운 버전으로 업데이트 수행 가능

- 배포 그룹을 구성하고, 기존의 배포 그룹이 신규로 배포된 소스가 적용된 배포 그룹으로 자동 대체되어 중지 최소화

- AWS Lambda 기능을 사용하여 트래픽을 이전 버전에서 새로운 버전으로 점진적으로 라우팅 수행

- Blue/Green 배포를 통해 새로운 코드에 대해 새로운 인스턴스 그룹으로 코드 배포 수행

2. In-Place 배포

- 배포 그룹의 각 인스턴스 애플리케이션 중지 후 애플리케이션 수정 버전이 설치되고 유효성 검사 수행

- 로드밸런서를 사용하여 배포 진행 시 인스턴스를 제외하고 배포를 수행하며, 테스트 완료 후 서비스로 복원 수행

 

[CodeDeploy실행 순서]

ApplicationStop

DownloadBundle

BeforeInstall

Install

AfterInstall

ApplicationStart

ValidationService

BeforeAllowTraffic

AllowTraffic

AfterAllowTraffic

 

[배포 구성]

1. One At A Time : EC2인스턴스를 하나씩 올리고 내림. 배포가 중간에 실패하면 바로 중지

2. Half At A Time : EC2인스턴스를 버전1에서 2로 반만 업그레이드하고 다음 반을 처리하는 방식

3. All At Once : 아주 빠른 대신 정상 호스트가 없으며 다운타임이 발생

4. Custom : 사용자 지정 방식. ex) 적어도 정상 호스트가 75%가 되어야 한다.