[AWS] Travis CI와 AWS CodeDeploy를 사용한 자동배포 구축하기 #1
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 수행합니다.
- main 브런치에 push될 때 수행하는 명령어입니다.
- notifications: Travis CI 실행 완료 시 메일로 알람이 옵니다.
- branches
- 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 # 여기 바꿔도 됨!
주요 명령어
- before_deploy
- deploy 명령어가 실행되기 전에 실행됩니다.
- CodeDeploy는 Jar 파일은 인식하지 못하므로 Jar+기타 설정 파일들을 모아 압축(zip)합니다.
- zip -r travis-ci-service *
- 현재 위치의 모든 파일을 travis-ci-service 이름으로 압축(zip)합니다.
- 명령어의 마지막 위치는 본인의 프로젝트 이름이어야 합니다.
- mkdir -p deploy
- deploy라는 디렉터리를 Travis CI가 실행 중인 위치에서 생성합니다.
- mv travis-ci-service.zip deploy/travis-ci-service.zip
- travis-ci-service.zip 파일을 deploy/travis-ci-service.zip으로 이동시킵니다.
- deploy
- S3로 파일 업로드 혹은 CodeDeploy로 배포 등 외부 서비스와 연동될 행위들을 선언합니다.
- local_dir: deploy
- 앞에서 생성한 deploy 디렉토리를 지정합니다.
- 해당 위치의 파일들만 S3로 전송합니다.
- on: all_branches: true
- main을 포함한 모든 브런치에 권한을 허용한다.
- 해당 옵션 포함 안 하면 권한 허용 에러가 발생한다.
설정이 다 되었으면 깃허브로 푸시합니다.
Travis CI에서 자동으로 빌드가 진행되는 것을 확인하고, 모든 빌드가 성공하는지 확인합니다.
다음 로그가 나온다면 Travis CI의 빌드가 성공한 것입니다.
- S3 버킷에 업로드 성공한 것을 확인할 수 있습니다.
다음 글에서 배포 자동화 구성을 마무리하겠습니다.