Back-End/Springboot와 AWS로 혼자 구현하는 웹 서비스

Chapter 09. 코드가 푸시되면 자동으로 배포해 보자 - Travis CI 배포 자동화 (3)

yeonx 2022. 4. 30. 17:09
728x90

9.4 Travis CI와 AWS S3, CodeDeploy 연동하기

AWS의 배포 시스템인 CodeDeploy를 이용하기 전에 배포 대상인 EC2가 CodeDeploy를 연동 받을 수 있게 IAM 역할을 하나 생성한다.

 

EC2에 IAM 역할 추가하기

S3와 마찬가지로 IAM을 검색하고, 이번에는 [역할] 탭을 클릭해서 이동한다. [역할 -> 역할 만들기] 버튼을 차례로 클릭한다.

 

앞에서 만들었던 IAM의 사용자와 역할은 어떤 차이가 있을까?

 

  • 역할
    • AWS 서비스에만 할당할 수 있는 권한
    • EC2, CodeDeploy, SQS등
  • 사용자
    • AWS 서비스 외에 사용할 수 있는 권한
    • 로컬 PC, IDC 서버 등

지금 만들 권한은 EC2에서 사용할 것이기 때문에 사용자가 아닌 역할로 처리한다. 서비스 선택에서는 [AWS 서비스 -> EC2]를 차례로 선택한다.

서비스 선택

 

정책에서는 EC2RoleForA를 검색해서 AmazonEC2RoleforAWSCodeDeploy를 선택한다.

정책 선택

태그는 본인이 원하는 이름으로 짓는다.

마지막으로 역할의 이름을 등록하고 나머지 등록은 최종적으로 확인한다.

 

이렇게 만든 역할을 EC2서비스에 등록한다. EC2 인스턴스 목록으로 이동한 뒤, 본인의 인스턴스를 마우스 오른쪽 버튼으로 눌러 [인스턴스 설정 -> IAM 역할 연결/바꾸기]를 차례로 선택한다.

역할 선택이 완료되면 해당 EC2 인스턴스를 재부팅한다. 재부팅을 해야만 역할이 정상적으로 적용되니 꼭 재부팅을 한다.

 

 

CodeDeploy 에이전트 설치

 

EC2에 접속해서 다음 명령어를 입력한다.

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install .--region ap-northeast-2

 

내려받기를 성공했다면 다음과 같은 메시지가 콘솔에 출력된다.

download: s3://aws-codedeploy-ap-northeast-2/latest/install to./install

 

install 파일에 실행 권한이 없으니 실행 권한을 추가한다.

chmod +x ./install

 

install 파일로 설치를 진행한다.

sudo ./install auto

 

설치가 끝났으면 Agent가 정상적으로 실행되고 있는지 상태를 검사한다.

sudo service codedeploy-agent status

 

다음과 같이 running 메시지가 출력되면 정상이다.

The AWS CodeDeploy agent is running as PID xxx

 

 

CodeDeploy를 위한 권한 생성

CodeDeploy에서 EC2에 접근하려면 마찬가지로 권한이 필요하다. AWS의 서비스이니 IAM역할을 생성한다. 서비스는 [AWS 서비스 -> CodeDeploy]를 차례로 선택한다.

CodeDeploy서비스 선택

 

CodeDeploy는 권한이 하나 뿐이라서 선택 없이 바로 다음으로 넘어가면된다.

 

태그 역시 본인이 원하는 이름으로 짓는다.

 

CodeDeploy를 위한 역할 이름과 선택 항목들을 확인한 뒤 생성 완료를 한다.

 

 

CodeDeploy 생성

CodeDeploy는 AWS의 배포 삼형제 중 하나이다. 배포 삼형제에 대해 간단하게 소개하면 다음과 같다.

 

  • Code Commit
    • 깃허브와 같은 코드 저장소의 역할을 한다.
    • 프라이빗 기능을 지원한다는 강점이 있지만, 현재 깃허브에서 무료로 프라이빗 지원을 하고 있어서 거의 사용되지 않는다.
  • Code Build
    • Travis CI와 마찬가지로 빌드용 서비스이다.
    • 멀티 모듈을 배포해야 하는 경우 사용해 볼만하지만 규모가 있는 서비스에서는 대부분 젠킨스/팀시티 등을 이용하니 이것 역시 사용할 일이 거의 없다.
  • CodeDeploy
    • AWS의 배포 서비스이다.
    • 앞에서 언급한 다른 서비스들을 대체재가 있고, 딱히 대체재보다 나은 점이 없지만, CodeDeploy는 대체제가 없다.
    • 오토 스케일링 그룹 배포, 블루 그린 배포, 롤링 배포, EC2 단독 배포 등 많은 기능을 지원한다.

 

이 중에서 현재 진행 중인 프로젝트에서는 Code Commit의 역할은 깃허브가 , Code Build 역할은 Travis CI가 하고 있다. 그래서 우리가 추가호 사용할 서비스는 CodeDeploy이다.

  1. CodeDeploy서비스로 이동해서 화면 중앙에 있는 [애플리케이션  생성] 버튼을 클릭한다.
  2. 생성할 CodeDeploy의 이름과 컴퓨팅 플랫폼을 선택한다. 컴퓨팅 플랫폼에선 [EC2/온프레미스]를 선택하면 된다.
  3. 생성이 완료되면 배포 그룹을 생성하라는 메시지를 볼 수 있다. 화면 중앙의 [배포 그룹 생성] 버튼을 클릭한다.
  4. 배포 그룹 이름과 서비스 역할을 등록한다 서비스 역할은 좀 전에 생성한 CodeDeploy용 IAM 역할을 선책하면 된다.
  5. 배포 유형에서는 현재 위치를 선책한다 만약 본인이 배포할 서비스가 2대 이상이라면 블루/그린을 선택하면 된다. 여기선 1대의 EC2에만 배포하므로 선택하지 않는다.
  6. 환경 구성에서는 [Amazon EC2 인스턴스]에 체크한다.
  7. 마지막으로 배포 구성을 선택하고 로드 밸런싱은 체크 해제한다.

배포 구성이란 한번 배포할 때 몇 대의 서버에 배포할지를 결정한다. 2대 이상이라면 1대씩 배포할지, 30% 혹은 50%로 나눠서 배포할지 등등 여러 옵션을 선택하겠지만 1대 서버다 보니 전체 배포하는 옵션으로 선택하면 된다.

배포 그룹까지 생성되었다면 CodeDeploy 설정은 끝이다.

 

Travis CI, S3, CodeDeploy 연동

먼저 S3에 넘겨줄 zip파일을 저장할 디렉토리를 하나 생성한다. EC2 서버에 접속해서 다음과 같이 디렉토리를 생성한다.

mkdir ~/app/step2 && mkdir ~/app/step2/zip

 

Travis CI의 Build가 끝나면 S3에 zip파일이 전송되고, 이 zip파일은 /home/ec2-user/app/step2/zip로 복사되어 압푹을 풀 예정이다. Travis CI설정은 .travis.yml로 진행했다.

AWS CodeDeploy의 설정은 appspec.yml로 진행한다.

 

코드는 다음과 같다.

version: 0.0
os : linux
files:
  - source:
    destination : /home/ec2-user/app/step2/zip/
    overwrite : yes
① version : 0.0
 - CodeDeploy 버전을 이야기
 - 프로젝트 버전이 아니므로 0.0 외 다른 버전을 사용하면 오류가 발생

② source
 - CodeDeploy에서 전달해 준 파일 중 destination으로 이동시킬 대상을 지정한다.
 - 루트 경로(/)를 지정하면 전체 파일을 이야기

③destination
 - source에서 지정된 파일을 받을 위치이다.
 - 이후 Jar를 실행하는 등은 destination에서 옮긴 파일들로 진행

④ overwrite
 - 기존에 파일들이 있으면 덮어 쓸지를 결정한다.
 - 현재 yes라고 했으니 파일들을 덮어쓰게 된다. 

 

.travis.yml에도 CodeDeploy 내용을 추가한다. deploy 항목에 다음 코드를 추가한다.

- provider: codedeploy
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_KEY
    
  bucket: springboot-study-build
  key : springboot-study-webservice.zip
  bundle_type : zip
  application : springboot-study-webservice
  deployment-group : springboot-study-webservice-group
  region: ap-northeast-2
  wait-until-deployed: true

 

S3 옵션과 유사하다 . 다른 부분은 CodeDeploy의 애플리케이션 이름과 배포 그룹명을 지정하는 것이다. 

전체 코드는 다음과 같다.

language: java
jdk:
  - openjdk8

branches:
  only:
    - master

# Travis CI 서버의 Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

script: "./gradlew clean build"

before_deploy:
  - zip -r springboot-study-websevice *
  - mkdir -p deploy
  - mv springboot-study-websevice.zip deploy/springboot-study-websevice.zip

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY

    bucket: springboot-study-build
    region: ap-northeast-2
    skip_cleanup : true
    acl : private #zip 파일 접근을 private로
    local_dir : deploy
    wait-until-deployed : true

  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY

    bucket: springboot-study-build
    key : springboot-study-webservice.zip
    bundle_type : zip
    application : springboot-study-webservice
    deployment-group : springboot-study-webservice-group
    region: ap-northeast-2
    wait-until-deployed: true


#CI 실행 완료 시 메일로 알람
notifications:
  email:
    recipients:
      - 이메일 주소

 

모든 내용을 작성했다면 프로젝트를 커밋하고 푸시한다. 깃허브로 푸시가 되면 Travis CI가 자동으로 시작된다. 

 

배포가 끝났다면 다음 명령어로 파일들이 잘 도착했는지 확인해본다.

cd /home/ec2-user/app/step2/zip

 

파일 목록을 확인해본디.

ll

 

파일들이 잘 도착한 것을 확인할 수 있다.

 

 

 

출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 [이동욱 지음]