본문 바로가기
Clone Coding/스프링 부트와 AWS

[AWS] Travis CI, AWS S3, CodeDeploy 연동하기

by 연로그 2021. 3. 15.
반응형

AWS S3

  • Amazon Web Service에서 제공하는 일종의 파일 서버
  • 정적 파일이나 배포 파일 등을 관리하는 기능 지원
  • 이미지 업로드 구현 시 자주 사용

 

CodeDeploy

  • AWS의 배포 서비스
  • 오토 스케일링 그룹 배포, 블루 그린 배포, 롤링 배포, EC2 단독 배포 등 많은 기능 지원

 

그 외 AWS의 배포 서비스 ▼

더보기

Code Commit

  • 깃허브 같은 코드 저장소
  • 프라이빗 기능 지원

 

Code Build

  • Travis CI 같은 빌드용 서비스
  • 멀티 모듈을 배포해야 하는 경우에 사용하기 괜찮음
  • 규모가 있는 서비스에서는 Jenkins, TeamCity 등을 더 자주 이용함

 

훌륭한 대체재가 많아 자주 사용하는 서비스들은 아니다.

 

앞으로의 프로젝트 구조 (예상)

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

 

위 과정을 살펴보면 Travis CI는 AWS S3에 jar파일을 주고, AWS S3은 AWS CodeDeploy에게 jar 파일을 준다.

 

왜 Travis CI에서 AWS CodeDeploy로 직접 전달하지 않는걸까?

-> AWS CodeDeploy에는 저장 기능이 없기 때문이다. Travis CI의 빌드 결과물을 저장했다가 CodeDeploy가 가져갈 수 있도록 보관하는 공간이 필요한데, 이 공간으로 AWS S3을 자주 사용한다고 한다.

 

CodeDeploy가 빌드, 배포 둘 다 할 수 있는데 왜 복잡하게 진행할까?

-> 빌드 없이 배포만 필요할 때 대응하기 어렵다. 빌드와 배포가 붙어 있으면 예전에 빌드했던 결과물인 jar파일을 재사용할 수가 없다. 웬만하면 빌드와 배포를 분리하는 것이 좋다.

 

 


Travis CI와 AWS S3 연동

 

1. AWS Key 발급

일반적으로 AWS 서비스에는 외부 서비스가 접근할 수 없어서 접근 가능 권한을 가진 key를 이용해야 한다.

AWS에서는 IAM이라는 기능을 제공해주는데 접근 방식 및 권한을 관리할 수 있다.

 

console.aws.amazon.com/iam/home 접속

 

https://console.aws.amazon.com/iam/home?region=ap-northeast-2#/home

 

console.aws.amazon.com

 

사용자 - 사용자 추가

 

세부 정보 설정

 

권한 설정에 관해서는 S3과 CodeDeploy를 따로 관리하는 경우가 많다.

이 예제에서는 간단한 수준으로 진행될 것이니 따로 분리하지 않고 관리하겠다.

권한 설정
태그 설정
사용자 정보 체크

 

 

키 생성 결과

 

 

2. Travis CI에 Key 등록

이제 Travis CI에 접속하자. travis-ci.org/

 

Travis CI - Test and Deploy Your Code with Confidence

 

travis-ci.org

 

프로젝트 - Settings - Environment Variables에 액세스 키 등록

이 등록한 키들은 .travis.yml에서 $AWS_ACCESS_KEY 형식으로 사용할 수 있다.

 

3. S3 버킷 생성

s3.console.aws.amazon.com/s3/ 접속

 

https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-2

 

s3.console.aws.amazon.com

버킷 만들기

 

퍼블릭 액세스를 허용하면 누구나 내려받을 수 있어 코드, 설정값, 주요 키값들이 탈취될 수 있다.

퍼블릭 액세스 차단을 꼭 해줄 것!!!

 

3-1. 동일한 버킷 이름이 이미 존재합니다. 에러

버킷 생성한 적도 없고 목록에도 아무것도 안 뜨는데 버킷 이름이 존재한다는 에러가 뜬다...

혹시나 해서 4번 과정을 통해 빌드를 진행해봤는데 버킷이 존재하지 않는다는 에러가 뜬다.

결국 별다른 확인 방법을 찾지 못하고 다른 이름의 버킷을 생성했다. (ㅠㅠ)

 

4. .travis.yml 수정 

language: java
jdk:
  - openjdk8

branches:
  only:
    - master

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

script: "./gradlew clean build"

before_install:
  - chmod +x gradlew

before_deploy:
  - zip -r freelec-springboot2-webservice *
  - mkdir -p deploy
  - mv freelec-springboot2-webservice.zip deploy/freelec-springboot2-webservice.zip
  
deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    bucket: freelec-springboot-build
    region: ap-northeast-2
    skip_cleanup: true
    acl: private
    local_dir: deploy
    wait-until-deployed: true

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

코드 설명 ▼

더보기

before_deploy

  • deploy 명령어 실행 전에 수행
  • CodeDeploy는 jar 파일을 인식하지 못하므로 기타 설정 파일들을 모아 압축(zip)
  • zip -r ~ *  // 현재 위치의 모든 파일을 ~ 이름으로 압축
  • mkdir -p ~  // ~라는 디렉토리를 현재 위치에 생성
  • mv ~1.zip ~2.zip  // ~1.zip 파일을 ~2.zip로 이동

 

deploy

  • S3으로 파일 업로드, CodeDeploy로 배포 등
  • 외부 서비스와 연동될 행위들 선언
  • local_dir: ~  // ~ 디렉토리 지정. 해당 위치의 파일들만 S3으로 전송.
  • acl: private  // zip 파일 접근 설정

 

5. 연동 확인

4에서 수정한 yml파일을 푸시한 뒤, travis에서 빌드가 성공되었는지 확인하자.

S3에서도 객체가 업로드된 것을 확인할 수 있다.

travis / s3 성공 화면


Travis CI와 AWS S3, CodeDeploy 연동

 

1. IAM 역할 생성

EC2가 CodeDeploy를 연동 받을 수 있게 하는 IAM 역할을 하나 추가하겠다.

 

사용자와 역할의 차이가 궁금하다면? ▼

더보기

역할

  • AWS 서비스에만 할당할 수 있는 권한
  • EC2, CodeDeploy, SQS, ...

 

사용자

  • AWS 서비스 외에 사용할 수 있는 권한
  • 로컬 pc, IDC 서버, ...

 

2. EC2에 IAM 역할 연결

연결 후에는 ec2 인스턴스를 재부팅 해준다.

 

3. CodeDeploy 에이전트 설치

CodeDeploy의 요청을 받을 수 있게 에이전트를 설치해보겠다.

ec2에 접속 후 다음 명령어를 입력한다.

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

성공 화면

 

$ chmod +x ./install    #실행 권한 추가
$ sudo ./install auto   #install 파일로 설치 진행
$ sudo service codedeploy-agent status #agent 정상 실행 확인. 상태 검사

성공 화면

(성공 화면의 PID 번호는 다를 수 있다.)

 

3-1. /usr/bin/env: ruby: No such file or directory 에러

예상 원인: ruby 미설치

해결 방법: 아래 명령어를 통해 ruby 설치

$ sudo yum install ruby

 

4. CodeDeploy를 위한 권한 생성

CodeDeploy -> EC2 접근을 위해서는 마찬가지로 권한이 필요하다.

IAM 역할을 생성하자.

역할 이름이나 Name 태그 등은 위와 같이 원하는대로 지어도 된다.

IAM - 역할 - 역할만들기 

 

5. CodeDeploy 생성

ap-northeast-2.console.aws.amazon.com/codesuite/codedeploy/deployments 접속

 

https://ap-northeast-2.console.aws.amazon.com/codesuite/codedeploy/deployments

 

ap-northeast-2.console.aws.amazon.com

애플리케이션 생성

 

배포 그룹 생성

 

서비스 역할은 4에서 생성한 CodeDeploy용 IAM 역할을 선택하면 된다.

현재 프로젝트의 경우 EC2 하나만 배포하면 되므로 배포 유형- 현재 위치, 로드 밸랜서- 비활성화 설정을 해두었다.

 

6. 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을 수정한다.

...
deploy:
  - provider: s3
    ...
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
    bucket: freelec-travis-build # S3 버킷
    key: freelec-springboot2-webservice.zip # 빌드 파일을 압축해서 전달
    bundle_type: zip
    application: freelec-springboot2-webservice # 웹 콘솔에서 등록한 CodeDeploy 어플리케이션
    deployment_group: freelec-springboot2-webservice-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹
    region: ap-northeast-2
    wait-until-deployed: true
...

 

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: 덮어쓴다.

 

6-1. Version 2 of the Ruby SDK will enter maintenance mode as of November 20, 2020. To continue receiving service updates and new features, please upgrade to Version 3. 에러

같은 오류가 난 사람들의 원인을 찾아보니 다음과 같다. 

  1. appspec.yml 파일 에러 (오타, 들여쓰기 등)
  2. CodeDeploy 그룹의 태그를 잘못 입력함 (키를 Name이 아닌 임의의 값으로 설정)
  3. .travis.yml 파일 에러 (오타)

나는 3번의 경우.. 파일명이 freelec-springboot2-webservice.zip이어야 하는데 freelec-springboot2-webvservice.zip로 오타가 났었다(ㅜㅜ)

해결 후에 안건데, 위에 Version 2 ~ 이건 에러가 난게 아니다. 배포 그룹에 들어가서 배포 내역에 들어가면 정확한 오류 명을 찾을 수 있다.

 

배포 그룹에서 배포 내역을 확인할 수 있다.

 

6-2. 빌드는 성공했는데 배포 파일이 존재하지 않는 경우

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

$ cd app/step2/zip
$ ll

원래대로라면 배포된 파일들이 zip 폴더 안에 있어야하는데 없다

=> app 폴더 위치로 돌아가서 차근차근 ls와 cd 명령어를 반복하며 찾아보니.. step2가 아닌 step3 폴더에 있었다. appspec.yml 파일에서 오타가 난건데 폴더명이라 에러에 걸리진 않았나보다.

 


해당 게시글은 [ 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱 ] 책을 따라한 것을 정리하기 위한 게시글입니다. 요약, 생략한 부분이 많으니 보다 자세한 설명은 책 구매를 권장합니다.

 

이슈 참고

github.com/jojoldu/freelec-springboot2-webservice/issues/474

github.com/jojoldu/freelec-springboot2-webservice/issues/420

반응형