[DevOps] Spring boot, Travis,  AWS EC2, S3, CodeDeploy로 CI/CD 환경 구축 1
DevOps

[DevOps] Spring boot, Travis, AWS EC2, S3, CodeDeploy로 CI/CD 환경 구축 1

728x90

서비스를 운영할 때 배포 환경 구축은 필수 과제 중 하나이다. 여러 개발자의 코드가 실시간으로 병합되고, 테스트가 수행되는 환경, master 브랜치가 푸시되면 배포가 자동으로 이루어지는 환경을 구축하지 않으면 실수할 여지가 너무나도 많게 된다. 이번 시간에는 spring boot로 개발된 코드를 github에 푸시하면 자동으로 서버에 배포해주는 환경을 구축할 것이다.

 

Travis CI 연동하기

Travis는 github에서 제공하는 무료 CI 서비스이다. 유사 서비스로는 Jenkins, TeamCity 등이 있다. 

Travis와 github을 연동하기 위해 우선 https://travis-ci.org에 접속해서 github 계정으로 로그인을 한다.

 

로그인이 되었다면 좌측 상단에 [계정명 -> Settings]로 들어간다.

 

설정 페이지 하단을 보면 github 저장소 검색창이 있다. 검색창에 연동하고 싶은 github 레파지토리의 이름을 검색하여 오른쪽 상태바를 활성화시켜준다.

 

활성화한 저장소를 클릭하면 아래의 사진과 같이 저장소 빌드 히스토리 페이지로 이동하게 된다.

 

트래비스 웹사이트에서의 설정은 끝났으니 이제 상세한 설정을 위해 프로젝트 폴더에서 yml 파일을 작성해준다. Travis의 상세한 설정은 프로젝트에 존재하는 .travis.yml로 할 수 있다. yml 파일 확장자를 YAML(야믈)이라고 한다. .travis.yml 파일에 아래의 코드를 작성해준다.

language: java
jdk:
  - openjdk8

#Travis를 어느 브랜치가 푸시될 때 수행할지 지정
branches:
  only:
    - master

#Travis 서버의 Home, 같은 의존성은 다음 배포 때부터 다시 받지 않도록 설정
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

#master 브랜치에 푸시되었을 때 수행하는 명령어
script: "./gradlew clean build"

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

 

여기까지 마쳤으면 master 브랜치에 커밋과 푸시를 하고, Travis 저장소 페이지를 확인한다. 아래의 사진처럼 passed가 표시되면 정상적으로 빌드가 성공한 것이다.

 

빌드가 성공했다는 것을 메일로도 잘 전달받아 확인할 수 있다.

 

 

 

Travis와 AWS S3 연동하기

S3란 AWS에서 제공하는 일종의 파일 서버이다. 이미지 파일을 비롯한 정적 파일이나 배포 파일을 관리하는 등의 기능을 지원한다. 보통 이미지 업로드를 구현한다면 S3를 이용하여 구현하는 경우가 많다. Travis와 S3를 연동하는 이유는 빌드 후 생성된 Jar 파일을 저장 및 전달하기 위해서이다. 이후 AWS에서 제공하는 CodeDeploy에서 Jar 파일을 받아 배포해줄 것이다.

Travis와 S3를 연동하기 위해선 우선 AWS key를 발급받아야 한다. 일반적으로 AWS 서비스에 외부 서비스가 접근할 순 없다. 그러므로 접근 가능한 권한을 가진 Key를 생성해서 사용해야 한다. Key를 발급받기 위해 IAM 서비스를 사용한다. IAM을 통해 Travis가 S3와 CodeDeploy에 접근할 수 있도록 해준다. AWS 콘솔로 접속하여 IAM을 검색 후 들어가 보자.

 

IAM 페이지 왼쪽 사이드바에서 [사용자 -> 사용자 추가] 버튼을 클릭한다.

 

생성할 사용자의 이름과 액세스 유형을 선택한다.

 

권한 설정 방식은 [기존 정책 직접 연결]을 선택하고, 화면 아래 정책 검색 화면에서 s3full과 CodeDeployFull을 검색하여 나오는 정책에 체크해준다.

 

태그는 Name을 지정하는데, 본인이 인지 가능한 정도의 이름으로 만든다.

 

마지막으로 본인이 생성한 권한 설정 항목을 확인한다.

 

최종 생성 완료되면 다음과 같이 액세스 키와 비밀 액세스 키가 생성된다. 이 두 값이 Travis에서 사용될 키이다.

 

IAM에서 생성한 Key를 Travis에 등록해주어야 한다. 먼저 Travis의 설정 화면으로 이동한다.

 

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

 

IAM을 통해 사용자를 생성했다면 이제 S3 버킷을 생성해야 한다. S3는 일종의 파일 서버이다. 보통 게시글을 쓸 때 나오는 첨부파일 등록을 구현할 때 많이 이용한다. 여기서는 빌드 후 생성되는 Jar 파일을 저장하기 위해 사용된다. S3 버킷을 생성하기 위해 AWS 콘솔에서 S3를 검색하여 이동한다.

 

S3 서비스 화면으로 들어와서 [버킷 만들기] 버튼을 클릭하자.

 

원하는 버킷명을 작성한다. 이 버킷에 배포할 Zip 파일이 모여있는 장소임을 의미하도록 지어주자.

 

다음은 버전 관리 설정 부분인데, 별다른 설정 할 것이 없으므로 그냥 넘어가 주자.

 

다음은 버킷의 보안과 권한 설정 부분이다. 모든 퍼블릭 액세스 차단을 선택해주자. 실제 서비스를 할 때는 Jar 파일이 퍼블릭일 경우 누구나 내려받을 수 있어 코드나 설정값, 주요 키 값들이 전부 탈취될 수 있다. 퍼블릭이 아니더라도 우리는 IAM 사용자로 발급받은 키를 사용하니 접근 가능하다.

 

버킷이 생성되면 아래의 사진과 같이 버킷 목록에서 확인할 수 있다.

 

S3가 생성되었으니 이제 S3로 배포 파일을 전달해주는 코드를 작성한다. 앞서 만든 .travis.yml 파일에 아래의 코드를 추가해준다.

before_deploy:
  - zip -r spring-boot *
  - mkdir -p deploy
  - mv spring-boot.zip deploy/spring-boot.zip

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY   # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY
    bucket: spring-boot-build
    region: ap-northeast-2
    skip_cleanup: true
    acl: private # zip 파일 접근을 private으로
    local_dir: deploy # before_deploy에서 생성한 디렉토리
    wait-until-deployed: true

 

설정이 다 되었으면 github로 푸시한다. Travis에서 빌드가 성공하는지 확인하고 S3 버킷으로 가보면 업로드가 성공한 것을 확인할 수 있다.

 

 

Travis를 통해 S3로 Jar 파일을 업로드하는 데까지 구축하였다. 다음 글에서는 업로드된 Jar 파일을 CodeDeploy에서 받아서 배포하는 환경까지 구축해본다.

 

[DevOps] Spring boot, Travis, EC2, AWS S3, CodeDeploy로 CI/CD 환경 구축 2

지난 글에서는 Travis, S3를 연동하여 S3 버킷에 빌드 된 Jar 파일을 업로드 하는 부분까지 완료했다. 이번 글에서는 CodeDeploy까지 연동하여 자동으로 배포가 되게끔 설정을 해준다. Travis와 AWS S3, CodeDeplo..

leveloper.tistory.com

 

 

 

참고

https://jojoldu.tistory.com/265

728x90