본문 바로가기
Dev/AWS

Travis CI,CodeDeploy,S3,Nginx로 EC2에 무중단 배포하기(1) - Travis CI,S3 연동

by ssyoni 2022. 4. 5.
반응형

스프링부트와 JPA를 사용한 토이 프로젝트를 진행하면서 CI/CD 구축 과정을 정리한 글입니다.
Travis CI를 활용해 프로젝트를 빌드하고, AWS S3와 AWS CodeDeploy, Nginx를 통해 EC2 서버에 무중단으로 배포하는 환경을 구축하였습니다.
이번 포스팅에서는 Travis CI를 통해 SpringBoot 프로젝트를 자동 빌드하고 AWS S3 버킷으로 빌드한 파일을 전송하는 과정까지를 정리하였습니다.


Travis CI 와 깃허브 연동

프로젝트를 테스트하고 빌드하는 과정을 수동으로 하게 되면, 먼저 깃허브에 PUSH를 하고 배포하고자 하는 환경(EC2)에서 소스를 PULL 받아 Clean&Build를 하여 Jar파일을 생성하여 배포합니다.
이러한 과정을 대신 해주는 툴이 바로 Travis CI입니다. 수동으로 배포할 경우에는 직접 배포 대상 서버에 접속하여 소스를 받고 빌드하여 jar파일을 생성하였지만, Travis CI를 사용하게 되면 로컬에서 깃허브에 소스를 푸시할 경우 자동으로 빌드하여 파일을 S3(일종의 파일서버)에 파일을 전달해줍니다.
Jenkins를 사용할 수도 있지만 설치형이기 때문에 EC2를 하나 더 생성해야 합니다. 그래서 깃허브에서 무료로 제공하는 Travis CI 툴을 사용하였습니다.

깃허브와 연동하는 과정은 매우 간단합니다.
먼저 Travis CI 사이트에 깃허브 계정으로 로그인 하고 빌드하고자 하는 레파지토리를 활성화 해준 뒤, 프로젝트에서 .travis.yml 설정 파일을 생성해주면 됩니다.

1. Travis CI 연동

travis-ci.com 사이트에 깃허브로 로그인한 뒤 우측 상단 프로필을 클릭하여 Setting > Activate 경로로 이동합니다.

활성화 하고자 하는 저장소를 선택하고 저장하면 웹사이트에서의 설정이 끝납니다.


2. .travis.yml 설정 파일 생성

language: java
jdk: openjdk11

branches:
  only:
    - master    # master 브랜치로 푸쉬했을 때만 빌드

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

script: "./gradlew clean build"   # master 브랜치에 푸쉬했을 경우 실행될 스크립트

#CI 실행 완료 시 메일로 알람
notifications:
  email:
    recipients:
      - jsy950601@gmail.com


파일 생성 후 master 브랜치로 푸시하면 Travis CI 저장소 페이지에서 빌드 결과를 확인할 수 있다.

빌드 성공!


Travis CI와 AWS S3 연동

AWS S3는 Amazon에서 제공하는 일종의 파일서버 서비스입니다. Travis CI로 빌드한 jar파일을 S3 서버로 전달하고 이를 CodeDeploy를 통해 EC2로 배포하는 과정을 거치게 됩니다.
Travis CI가 AWS S3에 파일을 전달하는 방법은 위에서 작성한 .travis.yml 설정 파일에 S3 버킷과 그 외 설정들을 추가해주면 됩니다.
그전에, Travis CI와 같은 외부 서비스들은 AWS 서비스에 접근하기 위해서 접근 권한 기능을 가진 Key를 가지고 있어야 합니다.
이 키는 AWS IAM 서비스를 통해 특정 서비스에 접근 권한을 가진 '사용자'를 추가하면 액세스 키를 발급받을 수 있습니다.

 

1. IAM 사용자 추가로 액세스 키 생성

AWS IAM 서비스에서 좌측 카테고리 > 액세스 관리 > 사용자 페이지에서 사용자를 추가합니다.

AWS 자격증명 유형은 엑세스 키로 선택합니다.

권한 설정 페이지에서 기존 정책 직접 연결을 선택하고 AWSCodeDeployFullAccess, AmazonS3FullAccess 권한을 선택합니다.

사용자 생성 시 엑세스 키 ID와 비밀 액세스 키가 생성된 것을 확인할 수 있습니다.


3. Travis CI에서 엑세스 키 등록

Travis CI 저장소의 설정 화면으로 이동하여 Environment Variables 항목에서 액세스 키 아이디와, 비밀 액세스 키를 등록해줍니다.

AWS_ACCESS_KEY, AWS_SECRET_KEY 는 .travis.yml 설정 파일에서 사용될 변수입니다.

4. AWS S3 버킷 생성

S3 버킷 만들기를 클릭합니다.

버킷 생성 시 한가지 주의할 점은 모든 퍼블릭 액세스 차단을 해야 한다는 것입니다. 만약 배포할 중요할 파일이 퍼블릭일 경우에 누구나 내려받을 수 있게 되기 때문에 주요 키값들이나 설정 값들이 유출될 수 있습니다. IAM에서 발급받은 액세스 키로만 접근 가능하도록 퍼블릭 액세스 차단을 선택하고 S3 버킷을 생성합니다.


5. .travis.yml 수정

language: java
jdk: openjdk11
branches:
  only:
    - master
# Travis CI 서버의 HOME
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

script: "./gradlew clean build"

### S3 설정 추가 ###
before_deploy:
  - zip -r  miniproject *                     # 프로젝트 파일 압축 
  - mkdir -p deploy                           # 배포 폴더 생성 
  - mv miniproject.zip deploy/miniproject.zip # 압축한 파일을 배포할 대상 디렉토리로 이동

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    bucket: do-you-wanna-quit-build           # S3 버킷 이름 
    region: ap-northeast-2
    skip_cleanup: true
    acl: private
    local_dir: deploy                         # 해당 위치의 파일들만 전송 
    wait-until-deployed: true

### S3 설정 추가 ###

#CI 실행 완료 시 메일로 알람
notifications:
  email:

before-deploy : deploy(배포)되기 전에 실행되는 명령어를 정의합니다. CodeDeploy는 jar파일을 인식하지 못하기 때문에 zip 파일로 압축해서 S3에 전송합니다. 배포가 실행되는 위치인 deploy 폴더를 생성하고 압축파일을 전송하였습니다.
deploy : S3나 CodeDeploy 등과 같은 외부 서비스들과 연동될 때의 설정들을 정의합니다. 위에서 생성한 액세스 키와 아이디를 Travis CI에서 설정한 변수로 선언하고 배포할 디렉토리를 설정하였습니다.


여기까지 PUSH하면 S3로 자동 배포가 이루어집니다.

S3 버킷에 압축 파일 전달된 것 확인

S3와 연동 성공!

반응형

댓글