본문 바로가기

AWS

[AWS] CodeDeploy를 이용한 Docker 이미지 EC2 배포

반응형

 

AWS CodeDeploy

 

AWS CodeDeploy 및 CI/CD 에 대한 설명은 아래 글로 대신합니다.

 

[AWS] CI/CD 파이프라인과 AWS CI/CD 서비스

CI/CD 도입 계기는 항상 필요로 생각하고 있는 부분이었지만 귀찮다는 생각에 시도를 하지 않았지만 시간이 지날 수록 프로젝트가 커지면서 배포 과정에 점점 더 많은 시간들이 낭비되고 있는게

kanoos-stu.tistory.com

 


 

CI/CD 파이프라인 구축을 위해 AWS CodeDeploy 설정

CodeDeploy가 CI/CD 파이프라인에서 담당할 과정은 다음과 같다

  • CodeBuild 빌드 작업이 완료되면 EC2에 접속 CodeDeploy agent 와 통신
  • AppSpec에 작성된 명령을 실행
  • ECR에 저장된 이미지를 풀
  • 풀 받은 이미지를 실행
  • 실행된 프로그램이 게이트웨이에 인식이 되었는지 확인 후 이전 버전의 프로그램 종료

 


 

AWS CodeDeploy 애플리케이션 생성

 

먼저 AWS 콘솔에서 CodeDeploy 서비스로 이동하고 '애플리케이션 생성' 버튼을 클릭한다

애플리케이션 생성 화면

애플리케이션의 이름을 입력하고 배포 대상의 서비스 유형을 선택한다.

 

 


 

AWS CodeDeploy 배포 그룹 생성

 

생성한 CodeDeploy 애플리케이션 선택 화면에서 배포 그룹 생성 버큰 클릭

 

  • 서비스 역할 - CodeDeploy는 EC2에 접속하여 배포를 진행해야하므로 그에 맞는 역할 부여가 필요하다.
    AWSCodeDeployRole 역할에  EC2 이외에 ElasticLoadbalancing, AutoSacling 등의 권한도 같이 들어있어 해당 역할만 추가해주면 된다
  • 배포 유형 - EC2 인스턴스 하나에서 배포를 하기 때문에 '현재 위치' 를 선택. 오토 스케일링 그룹이 있는 경우에는 '블루/그린' 업데이트를 선택해서 설정할 수 있다.
  • 환경 구성 - EC2 인스턴스를 선택하고 배포하려는 인스턴스를 지정할 수 있는 키와 값을 선택

 

  • AWS CodeDeploy 에이전트 설치 - 배포할 EC2에 에이전트가 설치할 여부를 선택
    • 안 함 - 에어전트 설치가 미리 되어있을 경우 새로 설치하지 않고 업데이트도 하지 않음
    • 한 번만 - 에이언트가 설치되어있지 않을 경우 새로 설치하고, 이미 설치되어있다면 아무런 작업을 하지 않음
    • 지금 업데이트 - 에이전트가 이미 설치되어 있으면 최신버전으로 즉시 업데이트
    • 업데이트 일정 예약 -  설정한 일정에 따라 에이전트를 업데이트 하도록 설정
  • 배포 구성 - 여러대의 인스턴스에 배포할 경우 인스턴스에 얼마나 많은 트래픽을 라우팅할지 결정하는 정책
    • CodeDeployDefault.OneAtTime - 한 번에 하나의 인스턴스에만 배포 수행. 배포 중에 서비스 중단이 없도록할 수 있지만 배포 시간이 길어질 수 있다.
    • CodeDeployDefault.HalfAtTime - 배포 단계에서 사용 가능한 인스턴스의 절반에 배포 수행. 
    • CodeDeployDefault.AllAtOnce - 모든 인스턴스에 동시에 배포 수행. 가장 빠르지만 배포 중 모든 서비스가 중단될 수 있다.

 

배포 환경에 맞게 나머지 설정을 마치고 배포 그룹 생성

 


 

AWS CodeDeploy 배포 생성

 

생성된 배포 그룹으로 이동 후 '배포 생성' 버튼 클릭

 

개정이란 배포를 위해 필요한 애플리케이션 수정 사항을 의미하며 개정은 두 가지 구성 요소로 구성된다.

  1. 애플리케이션 수정 사항 - 애플리케이션 코드, 웹 서버, 실행 파일, 관련 라이브러리 Asset 등이 포함된다.
  2. AppSpec 파일 - 애플리케이션 배포 방법에 대한 지침이 포함된 yml 이나 json 형식의 파일. 이 파일을 통해 CodeDeploy 에이전트에게 애플리케이션을 인스턴스에 어떻게 배포할지, 어떤 순서로 서비스를 중지하고 시작할지를 명령한다.
  • 개정 유형 - 개정 파일이 저장된 위치
  • 개정 위치 - S3에 저장을 선택했을 경우 저장된 버킷 위치

개정은 CodePipelin 으로 빌드 및 배포를 실행 시 CodeBuild의 빌드 프로세스에서 개정 파일을 저장할 수 현재는 CodePipeline 생성 전이기에 S3 임의의 버킷에 저장해 배포를 진행하도록 한다.

 


 

개정파일(appspec.yml) S3에 저장 및 script 작성

 

애플리케이션 배포 및 실행, 종료 명령어가 담긴 개정파일을 작성한다.

version: 0.0
os: linux
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/start_app.sh
      timeout: 300
      runas: root

 

  • version - appspec 파일의 버전
  • os - 대상 운영체제를 명시. linux와 windows 만 지원
  • files - CodeDeploy 에이전트가 소스 위치에서 대상 위치로 파일을 복사해야 하는지 지정
  • permissions - 파일이나 디렉토리에 설정할 권한을 지정. linux 만 사용 가능
  • hooks - 배포의 생명주기 이벤트에 대한 CodeDeploy가 실행해야 하는 스크립트를 지정한다. 각 후크는 미리 정의된 스크립트를 포함할 수 있다.
    • ApplicationStop - 새 버전을 배포하기 전에 이전 버전의 애플리케이션을 중지하는 단계
    • BeforeInstall - 애플리케이션이 복사되기 전에 실행하는 단계. 여기서 종속성을 설치하거나 기타 사전 설지 작업을 수행한다.
    • Install - 애플리케이션 파일이 인스턴스로 복사되는 단계
    • AfterInstall - 파일이 복사된 후 실행하는 단계
    • ApplicationStart - 애플리케이션을 시작하는 단계
    • ValidateService - 애플리케이션 배포를 검증하는 단계

location에 지정된 스크립트는 각자의 환경에 맞게 이미지 풀, 이미지 런, 이전 버전 종료 등을 작성하고 경로도 맞게 설정하여 s3에 업로드 해준다.

확장자는 zip, tar, tgz

'배포 생성'의 '개정 위치'에 개정파일 업로드 경로를 입력해준다.

 


 

배포 결과 확인

 

docker ps 명령어를 통해 아래와 같이 배포한 이미지가 생성된것을 확인할 수 있다.

docker ps

 

배포 그룹 배포 내역

 


 

AWS Pipeline의 장점

 

모든 파이프라인 구축이 성공했고 AWS Pipeline을 통해 CI/CD를 구축했을경우의 장점은 다음과 같다.

  • AWS 서비스와의 통합성 - CodePipeline은 AWS 서비스로 Jenkin와 같은 다른 서비스들에 비해 EC2, ECR 등과 같은 서비스에 통합이 쉽고, IAM을 통한 보안 및 엑세스 관리 기능을 사용할 수 있다.
  • 유지 관리의 편리함 - CodePipeline은 완전히 관리되는 서비스로, Jenkins와 같은 자체 호스팅된 도구에 비해 서버 설정, 유지 보수, 업그레이드 등에 대한 부담이 적다.
  • 확장성 및 내구성 - AWS에서 제공되는 서비스인 만큼 확장성과 내구성에대한 검증이 되어있고 여러 파이프라인을 동시에 실행함에 따라 필요한 리소스를 자동으로 확장할 수 있다.

그러나 Jenkins와 같은 서비스들은 매우 유연하며, 다양한 플러그인을 통해 거의 모든 CI/CD 작업을 수행할 수 있는 등의 장점이 있을 수 있다.

따라서 각 서비스는 요구사항이나 서비스 환경에 따라 선택이 달라질 수 있다.

 

 

반응형