[AWS] CI/CD 환경구축(3) - CodeDeploy

2020. 11. 17. 09:07AWS/AWS_Service

반응형

안녕하세요, 달콤한달팽이입니다.🐌🙂


오늘은 AWS를 사용하여 CI/CD 환경을 구축하는 방법 그 세 번째 시간을 가져보겠습니다.


CodeDeploy란?

CodeDeploy이란, EC2, 온프레미스 서버, Lambda, ECS 서비스로 애플리케이션 배포를 지원해는 서비스입니다.

 

앞서 실습한 CodeBuild와 유사하게 appspec.yaml이라는 참조 파일을 토대로 배포 이후의 서버에서 실행할 명령어를 단계별로 지정할 수 있습니다.


1) 배포 서버 구성

CodeDeploy를 수행하기 위해선 배포가 진행되어야 할 서버를 우선적으로 생성해야합니다.

(이미 배포가 진행되고있는 서버가 존재한다면, 해당 서버에서 선행작업만  진행하도록 합시다!)

 

이제, 배포가 진행될 서버에서 CodeDeploy가 수행될 수 있도록 몇가지 선행작업을 진행하도록 하겠습니다.

 

[첫 번째, 태그 설정]

이번 실습은 단일 인스턴스에만 배포를 진행하는 것이므로, 이를 구분할 태그가 필요합니다.

물론 Name 태그만으로도 식별이 가능하겠지만, 하나의 태그를 더 만들어 두었습니다!

 

[두 번째, IAM Role을 부여]

서버가 CodeDeploy를 수행될 수 있도록 Role을 부여하는 역할로,

IAM Role에서 신뢰할 수 있는 개체를 EC2로, 연결된 정책은 AmazonEC2RoleforAWSCodeDeploy로 설정하여 생성합니다.

 

이후, 해당 Role을 배포가 진행될 서버에 부착합니다.

 

[ 번째, CodeDeploy Agent 설치]

CodeDeploy Agent란, 서버에서 CodeDeploy에서 사용할 수  있게 해주는 소프트웨어 패키지입니다.

  install ruby
  curl -O https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
  chmod +x ./install
  sudo ./install auto
  service codedeploy-agent start
  service codedeploy-agent status

 

설치가 완료되면 상태를 출력할 경우 PID가 출력됩니다.

 

2) 코드 작성 및 배포 후 명령어(appspec) 선언

이제 서버에 배포될 애플리케이션을 구현하고, 배포 후 진행할 명령어의 모음집 appspec.yaml을 작성하도록 하겠습니다.

 

애플리케이션 코드 및 appspec.yaml은 AWS 공식사이트에서 제공하는 코드를 사용했습니다.

(작성일 기준으로 차이가 많이 발생할 경우, 코드 수정이 필요할 수 있습니다!)

 

appspec.yaml 파일의 구성을 살펴보도록 합시다. (주의: appspec.yaml이라는 파일명은 변경하면 안됩니다!)

  (1) version: codedeploy의 버전

  (2) OS: 배포가 진행될 OS 종류

  (3) files: 파일이 복사될 source 경로와 대상 서버의 destination 경로

  (4) hooks: 배포 수명 주기 동안 지정된 이벤트

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/WordPress
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/change_permissions.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
    - location: scripts/create_test_db.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root

 

이러한 파일을 모두 codedeploy.zip파일로 묶어 이전에 구성해두었던 S3에 업로드 해두었습니다.

 

3) CodeDeploy 생성

이제 서버에 배포를 도와줄 CodeDeploy를 생성합니다.

CodeDeploy는 애플리케이션과 배포 그룹 그리고 배포를 생성해야합니다.

 

[애플리케이션 생성]

애플리케이션 생성탭은 컴퓨팅 플랫폼을 지정이 목적이므로 EC2/온프레미스를 선택합니다

 

[배포그룹 생성]

배포그룹 생성탭은 배포 방식과 대상 지정이 목적으로,

우선 CodeDeploy가 배포를 수행할 수 있도록 역할을 주어야 합니다.

(해당 Role은 CodeDeploy와 신뢰관계를 맺으며 AWSCodeDeployRole이 부여되어 있습니다.)

 

배포 유형은 현재 위치와 블루/그린이 존재합니다.

현재 위치는 기존 서버에 애플리케이션을 업데이트하는 방식이며(중단 배포),

블루/그린은 완전히 새로운 서버에 애플리케이션을 배포한 후 기존 서버와 갈아끼는 방식(무중단 배포)입니다.

 

실제 운영하는 서비스일 경우 블루/그린을 선호하나, 이번에는 테스트이므로 현재위치를 선택합니다.

 

환경 구성탭에서 배포가 진행되는 서버를 선택할 수 있습니다.

AutoScaling 그룹를 선택할 경우 특정 AutoScalingGroup을 선택할 수 있지만.

인스턴스를 선택할 경우 태그를 기반으로 대상 서버를 선택합니다.

 

선행작업으로 대상 서버에 태그를 달아두었으므로, 이를 사용하여 구분짓도록 하겠습니다.

(만약 대상을 더욱 특정짓고 싶다면 태그 그룹을 여러개 추가해주도록 합시다!)

 

이제 서버에 CodeDeploy Agent 설치 지원 여부를 묻는 탭이 나오게 됩니다.

아직 CodeDeploy Agent를 설치하지 않았다면 한 번만을 선택하여 구성합니다.

(이는 System Manager를 통해 설치되는 것이므로, 해당 서버는 System Manager Agent가 설치되어 있어야합니다!)

 

저희는 앞서 CodeDeploy Agent를 설치해놓았으므로 안 함을 선택합니다.

 

이후 배포 방식을 결정하고, 로드 밸런서 유무를 선택합니다.

배포 방식은 3가지(블루/그린 제외)를 지원합니다.

  (1) OneAtaTime: 한 번에 한 한대의 서버에만 배포합니다.(속도가 오래걸리나, 안정적입니다.)

  (2) HalfAtaTime: 한 번에 절반의 서버에 배포합니다.

  (3) AllAtOnce: 한 번에 모든 서버에 배포합니다.(시간이 단축되나, 서비스에 이슈가 발생할 수 있습니다.)

 

또한, 로드 밸런싱을 선택할 수 있지만 이번 대상 서버는 로드밸런서를 사용하지 않으므로 체크 해지했습니다.

 

[배포 생성]

배포 생성탭은 배포 코드, 배포 동작, 롤백 등을 지정합니다.

 

배포 설정 탭에서는 애플리케이션이 담겨있는 코드가 어디에 있는지 위치를 지정합니다.

(저희는 S3에 저장해두었으므로, codedeploy.zip의 S3 URI를 가져오도록 합시다.)

 

이제 추가 배포 동작 설정탭에서 동일한 이름의 파일이 배포될 경우 어떻게 동작할지,

배포 실패시 롤백을 어떻게 진행할 것인지 선택합니다.

 

4) 결과 및 로그 확인

여기까지 완료했다면 이제 배포가 정상적으로 진행되고 있는지 결과를 확인하고,

실패했을 경우 로그를 확인하는 것만 남아있습니다.

 

배포 하단 수명 주기 이벤트의 View events 탭을 통해 현재 어디까지의 배포 훅(Hook)이 진행되었는지 확인할 수 있습니다.

 

배포가 실패했을 경우 어떠한 이벤트에서 실패했는지 간략한 원인을 출력해줍니다.

(이번에는 CodeDeploy Agent를 설치하지 않고 진행하여 발생하였습니다!)

 

만약 정상적으로 실행됐을 경우, 배포 내역에 아래와 같이 성공로그가 쌓이게 됩니다.

 

지금까지 CI/CD 환경 구성, 그 중 세 번째 단계인 CodeDeploy를 통한 소스코드 배포 방법을 알아보았습니다.

다음 시간에는 CodePipeline을 사용해 앞선 서비스들을 하나로 묶는 방법을 알아보도록 하겠습니다.

 

감사합니다!


관련 글

반응형