DevOps/AWS

[AWS] Travis CI와 AWS CodeDeploy를 사용한 자동배포 구축하기 #1

킵고잉 개발자 2022. 5. 29. 12:00

Spring Boot 기반의 서비스를 Travis CI와 AWS CodeDeploy를 사용해 자동 배포 시스템을 구축할 것입니다.

전체적인 구조는 다음과 같습니다.

 

  전달 과정
1 Travis CI AWS S3 jar 파일 전달
2 Travis CI AWS CodeDeploy 배포 요청
3 AWS S3 AWS CodeDeploy jar 파일 전달
4 AWS CodeDeploy AWS EC2 배포

스프링 부트 서비스는 이전 글을 기반으로 하고 있습니다.

 

 

목차

1. CI & CD 소개 (#1)

2. Travis CI 연동하기 (#1)

3. Travis CI와 AWS S3 연동하기 (#1)

4. Travis CI와 AWS S3, CodeDeploy 연동하기 (#2)

5. 배포 자동화 구성 (#2)

6. CodeDeploy 로그 확인 (#2)

 

1. CI & CD 소개

  • 코드 버전 관리를 하는 VCS 시스템(Git, SVN 등)에 PUSH가 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포 파일을 만드는 과정을 CI(Continuous Integration- 지속적인 통합)라고 하며, 이 빌드 결과를 자동으로 운영 서버에 무중단 배포까지 진행되는 과정을(Continuous Deployment- 지속적인 배포)라고 합니다.

 

2. Travis CI 연동하기

Travis CI는 깃허브에서 제공하는 무료 CI 서비스입니다.

젠킨스와 같은 CI 도구도 있지만, 젠킨스는 설치형이기 때문에 이를 위한 EC2 인스턴스가 하나 더 필요합니다. 즉 비용이 발생합니다.

AWS에서 Travis CI와 같은 CI 도구로 CodeBuild를 제공합니다. 하지만 빌드 시간만큼 요금이 발생합니다.

비용 없이 CI를 구축하기 위해 Travis CI를 사용해보겠습니다.

 

Travis CI 웹 서비스 설정

  • https://travis-ci.org/에 깃허브 계정으로 로그인 한 뒤, 오른쪽 위에 계정명 → Settings를 클릭한다.

  • 저장소 클릭

 

프로젝트 설정

  • Travis CI의 상세한 설정은 프로젝트에 존재하는 .travis.xml 파일로 할 것입니다.
  • 프로젝트 build.gradle과 같은 경로에 .travis.xml 파일 생성 및 다음과 같은 코드를 추가합니다.
language: java
jdk:
  - openjdk11

branches:
  only:
    - main # master 브런치에 push될 때 수행

# 같은 의존성은 캐싱처리를 할 디렉터리 
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

# 프로젝트 내부의 gradlew을 통해 clean & build 수행
script: "./gradlew clean build"

# CI 실행 완료시 메일로 알람
notifications:
  email:
    recipients:
      - keepseung@gmail.com # 여기 바꿔도 됨!
  • 주요 옵션 설명
    • branches
      • Travis CI가 어느 브랜츠가 푸시될 때 수행할 지 지정합니다. 현재는 main 브런치에 push 될 때 수행합니다.
    • cache
      • 그레이들을 통해 의존성을 받게 되면 이를 해당 디렉토리에 캐시 하여, 같은 의존성은 다음 배포 때부터 다시 안 받게 합니다.
    • script
      • main 브런치에 push될 때 수행하는 명령어입니다.
        • 프로젝트 내부의 gradlew을 통해 clean & build 수행합니다.
    • notifications: Travis CI 실행 완료 시 메일로 알람이 옵니다.
  • main 브런치에 커밋과 푸시를 하고, 전의 Travis CI 저장소 페이지를 확인합니다.
  • 빌드가 성공한 것이 확인되면. travis.yml에 등록한 이메일을 확인합니다. 빌드가 성공했다는 것이 메일로도 잘 전달받았을 겁니다.

 

3. Travis CI와 AWS S3 연동하기

S3란 AWS에서 제공하는 일종의 파일 서버입니다.

이미지 파일을 비롯한 정적 파일들을 관리하거나 배포 파일들을 관리하는 기능을 지원합니다.

Travis CI 연동 시 구조는 다음과 같습니다.

S3와 연동을 하는 이유는 jar 파일을 전달하기 위해서입니다.

 

AWS Key 발급

일반적으로 AWS 서비스에 외부 서비스가 접근할 수 없습니다. 그러므로 접근 가능한 권한을 가진 Key를 생성해서 사용해야 합니다.

AWS에서는 이러한 인증과 관련된 기능을 제공하는 서비스로 IAM(Identity and Access Management)이 있습니다.

IAM은 AWS에서 제공하는 서비스의 접근 방식과 권한을 관리합니다.

이 IAM을 통해 Travis CI가 AWS의 S3와 CodeDeploy에 접근할 수 있도록 해보겠습니다.

AWS 웹 콘솔에서 IAM을 검색하여 이동합니다.

  • IAM 페이지 왼쪽 사이드바에서 [사용자 => 사용자 추가] 버튼을 차례로 클릭합니다.
  • 기존 정책 직접 연결 클릭
  • 사용자 이름 및 액세스 키 클릭

  • S3 FullAccess 권한, CodeDeployFull 권한 추가

 

  • 식별 가능한 태그 값 설정

  • 사용자 생성 시 발생하는 Access Key와 Secret Key 확인

 

Travis CI에 Key 등록

설정 화면을 아래로 조금 내려보면 Environment Variables 항목이 있습니다. 여기에 AWS_ACCESS_KEY, AWS_SECRET_KEY를 변수로 해서 IAM 사용자에서 발급받은 키 값들을 등록합니다.

 

여기에 등록된 값들은. travis.yml에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY란 이름으로 사용할 수 있습니다. 쉘 스크립트에서 변수를 사용하는 것과 비슷합니다.

 

S3 버킷 생성

  • Travis CI에서 생성된 Build 파일을 S3에 저장하도록 구성하겠습니다. 저장된 파일은 이후에 CodeDeploy에서 가져가도록 구성할 것입니다.
  • all-springboot-build 이란 이름을 가진 버킷을 생성합니다.
  • 주의할 점은 모든 퍼블릭 액세스를 차단해야 합니다.
  • Jar 파일이 퍼블릭이면 누구나 내려받을 수 있어 코드, 주요 키들이 탈취당할 수 있습니다.
  • 우리는 IAM 사용자로 받은 키를 사용하기 때문에 접근이 가능합니다.

버킷 이름, 리전 설정
퍼블릭 엑세스 차단
버킷이 생성된 화면

 

.travis.yml 추가

language: java
jdk:
  - openjdk11

branches:
  only:
    - main # master 브런치에 push될 때 수행

# 같은 의존성은 캐싱처리를 할 디렉터리
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

# 프로젝트 내부의 gradlew을 통해 clean & build 수행
script: "./gradlew clean build"

# 1
before_deploy:
  - zip -r travis-ci-service * # 2
  - mkdir -p deploy  # 3
  - mv travis-ci-service.zip deploy/travis-ci-service.zip # 4

# 5
deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
    bucket: all-springboot-build    # S3 버킷
    region: ap-northeast-2
    skip_cleanup: true
    acl: private # zip 파일 접근을 private으로
    local_dir: deploy # 6
    wait-until-deployed: true
		on: # 7
      all_branches: true

# CI 실행 완료시 메일로 알람
notifications:
  email:
    recipients:
      - keepseung@gmail.com # 여기 바꿔도 됨!

주요 명령어

  1. before_deploy
    • deploy 명령어가 실행되기 전에 실행됩니다.
    • CodeDeploy는 Jar 파일은 인식하지 못하므로 Jar+기타 설정 파일들을 모아 압축(zip)합니다.
  2. zip -r travis-ci-service *
    • 현재 위치의 모든 파일을 travis-ci-service 이름으로 압축(zip)합니다.
    • 명령어의 마지막 위치는 본인의 프로젝트 이름이어야 합니다.
  3. mkdir -p deploy
    • deploy라는 디렉터리를 Travis CI가 실행 중인 위치에서 생성합니다.
  4. mv travis-ci-service.zip deploy/travis-ci-service.zip
    • travis-ci-service.zip 파일을 deploy/travis-ci-service.zip으로 이동시킵니다.
  5. deploy
    • S3로 파일 업로드 혹은 CodeDeploy로 배포 등 외부 서비스와 연동될 행위들을 선언합니다.
  6. local_dir: deploy
    • 앞에서 생성한 deploy 디렉토리를 지정합니다.
    • 해당 위치의 파일들만 S3로 전송합니다.
  7. on: all_branches: true
    • main을 포함한 모든 브런치에 권한을 허용한다.
    • 해당 옵션 포함 안 하면 권한 허용 에러가 발생한다.

설정이 다 되었으면 깃허브로 푸시합니다.

Travis CI에서 자동으로 빌드가 진행되는 것을 확인하고, 모든 빌드가 성공하는지 확인합니다.

다음 로그가 나온다면 Travis CI의 빌드가 성공한 것입니다.

  • S3 버킷에 업로드 성공한 것을 확인할 수 있습니다.

 


다음 글에서 배포 자동화 구성을 마무리하겠습니다.