IT/AWS

AWS에서 CI/CD 환경 구축 (CodeCommit, CodeBuild, CodeDeploy, Codepipeline)

joobly 2020. 2. 17. 23:11
728x90

1. 구성 소개

1.1 구성 아키텍처

AWS에서 제공하는 서비스를 이용한 CI/CD 구성은 다음과 같다.

AWS CodePipeline을 이용한 CI/CD 구성

1.2 AWS에서 제공하는 CI/CD 솔루션

AWS 서비스명 설명
CodeCommit  먼저 기존 코드를 Github에서 AWS CodeCommit으로 마이그레이션 한다. AWS CodeCommit은 AWS에서 호스팅하는 버전 제어 서비스로 클라우드에서 자산을 비공개로 저장하고 관리하는 데 사용한다.
CodeBuild  애플리케이션 코드를 빌드하기 위해 CodeBuild를 구성한다. AWS CodeBuild는 소스 코드를 컴파일하고 테스트를 실행하며 배포 준비가 된 소프트웨어 패키지를 생성하는 완전히 관리된다.
CodeDeploy  코드를 EC2 서버에 배포한다. AWS CodeDeploy는 Amazon EC2 인스턴스, 온 프레미스 인스턴스 또는 서버리스 Lambda 기능에 대한 애플리케이션 배포를 자동화하는 배포 서비스이다.
CodePipeline 코드를 지속적으로 제공하는 파이프 라인을 구축한다. AWS CodePipeline은 소프트웨어 배포에 필요한 단계를 모델링, 시각화 및 자동화하는 데 사용할 수 있는 지속적인 제공 서비스이다. 코드를 프로덕션에 전달하기 전에 파이프 라인에 승인 프로세스를 통합한다.

 

2. 구성 방법

2.1. Codecommit 리포지토리 생성

CodeCommit 리포지토리 목록

CodeCommit에서 리포지토리를 생성한다.

 (파이프라인이 실행되면 이 리포지토리에서 소스 코드를 가져오게 된다.)

 

CodeCommit 리포지토리 생성 (이름 설정)

 

리포지토리 페이지에서 리포지토리 생성을 선택한다.

리포지토리 생성 페이지에서 리포지토리 이름(예: joohyun-repo)를 입력한다.

 

2.2. Codecommit 리포지토리에 코드 추가

GitHub와 동일한 명령어로 Codecommit에 접근한다.

git init

git add -A

git commit -m "commit message"

git remote add origin https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/joohyun-repo

git push -u origin master
 
git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/joohyun-repo

 

2.3. CodeBuild에서 빌드 프로젝트 생성

CodeBuild 프로젝트 목록

빌드 프로젝트 생성을 선택한다.

 

CodeBuild 프로젝트 생성

 

빌드 프로젝트 생성 페이지의 프로젝트 구성에 이 빌드 프로젝트의 이름을 지정한다.

각 AWS 계정에서 빌드 프로젝트 이름은 고유해야 한다.

소스 공급자에서 해당되는 소스 코드 공급자 유형을 선택한다.

 

CodeBuild 프로젝트 환경 설정

 AWS CodeBuild가 관리하는 도커 이미지를 사용하려면 관리형 이미지를 선택한다. 다른 도커 이미지를 사용하려면 사용자 지정 이미지를 선택한다. (ARM, Linux, Linux GPU, or Windows 등)

 사전에 CodeBuild 서비스 역할을 생성하여, 기존 서비스 역할을 선택한다. 추후 Amazon S3 버킷에 빌드 출력을 저장하려면 Amazon S3를 선택한다. 또한 Amazon CloudWatch Logs 로그나 Amazon S3 로그를 생성할 수 있다.

 

소스 코드에 buildspec 파일이 있는 경우 빌드 사양 파일 사용을 선택한다. 

buildspec은 CodeBuild가 빌드를 실행하는 데 사용하는 YAML 형식의 빌드 명령 및 관련 설정의 모음이다.

다음과 같이 작성될 수 있다.

version: 0.2
 
phases:
  install:
    commands:
      - npm install
  pre_build:
    commands:
      - npm run lint
  build:
    commands:
      - npm test
  post_build:
    commands:
      - echo Build completed
artifacts:
  files:
    - '**/*'
  • version : 사용 중인 빌드 사양 표준의 버전이다.
  • phases : CodeBuild가 명령을 실행하도록 지시할 수 있는 빌드 단계이다. 빌드 단계 이름의 철자는 변경할 수 없으며 추가로 빌드 단계 이름을 생성할 수 없다.
  • artifact : CodeBuild가 출력 버킷에 업로드하는 빌드 출력 결과물이다.
  • buildspec은 YAML 형식에 맞아야하고, 디렉터리 구조를 맞춰야한다.

 

2.4. 배포 EC2 인스턴스 생성  CodeDeploy 에이전트 설정

CodeDeploy를 통해 배포될 서버를 생성하고 설정한다.

CodeDeploy 에이전트는 배포에서 사용할 수 있게 해주는 소프트웨어 패키지이다.

 

EC2 인스턴스 생성

CodeDeploy가 해당 EC2 인스턴스에서 웹 서버를 설정하는 데 사용할 수 있는 스크립트이다.

 

CodeDeploy 설치

CodeDeploy에서 설정하기 위해 식별할 태그를 지정한다.

 

EC2 태그 설정

 

2.5. CodeDeploy 애플리케이션 생성

애플리케이션: 배포하고자 하는 소프트웨어 애플리케이션이 포함된 리소스이다.

해당 애플리케이션을 Codepipeline과 함께 사용하여 배포를 자동화할 수 있다.

 

CodeDeploy 애플리케이션 목록

애플리케이션을 생성한다.

 

CodeDeploy 애플리케이션 생성

애플리케이션 이름을 입력하고, 컴퓨팅 플랫폼에서 EC2/온프레미스를 선택한다.

 

2.6. CodeDeploy 배포그룹 생성

배포 그룹: 배포할 인스턴스, 배포 속도와 같은 배포 관련 설정을 정의하는 리소스이다.

 

CodeDeploy 애플리케이션 내 배포그룹 생성

 

애플리케이션이 표시되는 페이지에서 배포 그룹 생성을 선택한다.

 

CodeDeploy 애플리케이션 내 배포그룹 생성

 

배포 그룹 이름과 CodeDeployRole 서비스 역할을 선택한다.

 

CodeDeploy 애플리케이션 내 배포그룹 설정

 

배포 유형은 현재 위치로 선택한다. 환경 구성에서 Amazon EC2 인스턴스를 선택한다.

키 필드에서 배포할 인스턴스를 선택한다.

 

CodeDeploy 애플리케이션 내 배포그룹 설정

 

배포 설정에서 해당하는 것을 선택한다.

(CodeDeployDefault.OneAtaTime) 배포 설정에서 선택할 수 있는 사항은 다음과 같다.

  • CodeDeployDefault.AllAtOnce : 한 번에 가급적 많은 수의 인스턴스에 애플리케이션 개정을 배포한다. 어떤 인스턴스에도 애플리케이션 개정이 배포되지 않으면 전체 배포 상태가 실패로 표시된다.

  • CodeDeployDefault.HalfAtATime : 최대 절반의 인스턴스에 한번에 배포한다. 애플리케이션 개정이 인스턴스의 절반 이상에 배포되면 전체 배포가 성공한다. 그렇지 않으면 배포가 실패이다.

  • CodeDeployDefault.OneAtATime : 한 번에 한 인스턴스에만 애플리케이션 개정을 배포한다.

 

CodeDeploy 애플리케이션 내 배포그룹 생성 확인

 

배포 그룹 설정이 완료된 것을 확인한다.애플리케이션이 EC2/온프레미스 컴퓨팅 플랫폼을 사용하는 경우, AppSpec file이 필요하다.

AppSpec file은 appspec.yml이라는 YAML 형식 파일이어야 하며 애플리케이션 소스 코드의 루트에 저장해야 한다.

appspec은 다음과 같이 작성될 수 있다.

version: 0.0
os: linux
files:
  - source: app.js
    destination: /var/www/
hooks:
  BeforeInstall:
    - location: install_dependencies.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: start_server.sh
      timeout: 300
  ApplicationStop:
    - location: stop_server.sh
      timeout: 300
      runas: root
  ValidateService:
    - location: validate_server.sh
      timeout: 300
      runas: root
  • source : 인스턴스에 복사할 업데이트 파일 또는 디렉터리를 식별한다.
  • destination : 인스턴스에서 파일이 복사되어야 하는 위치를 식별한다.

 

마지막으로, 배포할 EC2 인스턴스에서 CodeDeploy 에이전트가 실행 중인지 여부를 확인한다.

다음은 CodeDeploy 에이전트 상태를 확인 및 시작하는 명령어이다.

sudo service codedeploy-agent status

sudo service codedeploy-agent start

 

2.7. CodePipeline 생성 및 연결

이전에 만들었던 CodeCommit, CodeBuild, CodeDeploy를 연결하게 되면, 바로 CodePipeline을 통해 배포 가능하다.

 

CodePipeline 생성

 

파이프라인 설정 선택의 파이프라인 이름을 입력하고, 서비스 역할에서 CodePipeline이 IAM에 서비스 역할을 생성하도록 허용한다.

아티팩트 스토어 및 암호화 키를 지정한다.

 

CodePipeline 내 소스 스테이지

소스 단계 추가의 소스 공급자에서 AWS CodeCommit를 선택한다.

이전 단계에서 생성한 CodeCommit 리포지토리 이름을 선택한다. 브랜치 이름에서 master를 선택한다.

 

CodePipeline 내 빌드 스테이지

 

빌드 단계 추가에서 이전 단계에서 진행했던 프로젝트를 선택한다.

빌드 단계 또는 배포 단계는 스킵이 가능하다. 하지만 빌드 단계와 배포 단계 모두 스킵할 수 없다.

 

CodePipeline 내 배포 스테이지

 

배포 단계 추가의 배포 공급자에서 AWS CodeDeploy를 선택한다.

애플리케이션과 배포그룹은 이전 단계에서 생성한 이름을 선택한다.

 

CodePipeline 검토

 

검토에서 정보를 검토한 다음, 파이프라인 생성을 선택한다.

 

CodePipeline 대시보드

파이프라인이 성공적으로 실행되었는지 확인하려면, 파이프라인의 초기 진행 상황을 확인해야 한다.

각 단계의 상태는 [No executions yet]에서 [In Progress]로 바뀌며, 다시 [Succeeded]나 [Failed] 중 하나로 바뀐다. 파이프라인 상태가 성공 또는 실패로 표시되면 Staging 단계의 상태 영역에서 세부 정보를 통해 자세한 상태를 확인할 수 있다.

 

3. 구현 결과

  AWS 인프라만 이용해야 할 경우 또는 GitHub 이외의 다른 저장소를 이용할 경우, 유용한 구성 방법이다. AWS EC2 서버 이용 시, 유기적으로 빠른 배포와 AWS로 관리 포인트 통합될 수 있다. AWS Code Pipeline는 소스코드를 가져오고, 어떠한 툴을 통해 빌드하고, 배포할지 전체 Flow를 관리함에 있어서 편리하다. 정해진 기간(월단위) 동안 빌드 개수 및 걸리는 시간이 유동적일 경우, 본 방법을 고려한다. 하지만, 가격과 AWS에 종속될 수 있음을 고려해야 한다. 예를 들어 CodeDeploy 서비스의 경우, 배포를 위하여 AWS-CLI 환경 세팅을 위한 IAM이 필요하다.

300x250