SpringBoot에 CI/CD 적용하기(with Travis CI, AWS CodeDeploy)(3) - S3 생성, 연동하기

zooju·2023년 3월 21일
1

1. Travis CI와 AWS S3 연동하기

이제 Travis CI와 S3를 연동하여 travis ci에서 빌드를 마친 jar 파일을 S3에 저장할 것이다.

다음과 같은 시스템이 되는 것이다.

S3에 저장된 jar 파일은 code deploy에 전달되어 배포가 될 것이다.

결론적으로, S3를 사용하는 이유는 jar 파일을 전달하기 위해서이다.

1. 개발한 코드를 github에 push
2. travis ci는 이를 알아채고 test + build.
3. travis ci는 build가 완료되면 빌드 파일을 S3에 업로드함
4. travis ci는 code deploy에 배포 요청을 함
5. code deploy는 jar 파일을 가져와 ec2 서버를 돌아가며 배포를 진행(무중단 서버를 위함)

AWS Key 발급받기

Travis CI같은 외부 서비스가 AWS에 접근하기 위해선 접근 권한을 가진 key가 필요하다.

AWS에선 인증과 관련된 기능은 IAM에서 관리한다.

이 IAM에서 Travis CI가 S3와 Code Deploy에 접근할 수 있도록 Key를 만들어보자.

  • AWS IAM에 접속한다.
  • IAM > 사용자 > 사용자 추가
  • 사용자 이름을 적절히 입력하고(travis-ci-deploy) 아래와 같은 두가지 정책을 연결한다.
    • s3 full access
    • code deploy full access

생성 완료하면 access key와 비밀 access key 두가지가 나오는데, 이 둘을 travis ci에 넣어줄 것이다.

Travis CI에 AWS access Key 넣기

다시 travis ci로 돌아와서 키를 넣어주자.

  • 레포지토리 왼쪽의 “More Options”

  • Environment Variables에 다음 두 키를 넣어준다.
    • AWS_ACCESS_KEY
    • AWS_SECRET_KEY

상수를 등록해줬으므로, 앞으로 .travis.yml에 $AWS_ACCESS_KEY, $AWS_SECRET_KEY 로 사용이 가능하다.

2. S3 버킷 생성

Travis CI 이후 생성된 Build File을 저장하도록 구성해보자.

이후 S3에 저장된 build 파일은 이후 CodeDeploy에서 배포할 파일로 가져가도록 구성할 것이다.

AWS의 S3에 접속한다.

  • 버킷 생성
  • 이름 입력 > 버킷 만들기

이 때 모든 퍼블릭 엑세스를 차단해줘야 한다. 빌드 파일이 고대로 올라가기 때문에 properties에 있는 private key들이 털릴 수 있기 때문이다.

버킷이 생성되었으니 이제 travis ci와 S3를 연결해보자!

3. Travis CI와 S3 연결

이제 travis ci에서 build를 마치면 s3에 파일을 올릴 수 있도록 코드를 추가해준다.

before_deploy:
  - zip -r 3tree_tmp_private
  - mkdir -p deploy
  - mv 3tree_tmp_private.zip deploy/3tree_tmp_private.zip

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    bucket: 3tree-springboot-build-old  # S3 버킷
    region: ap-northeast-2
    skip_cleanup: true
    acl: private  # zip 파일 접근을 private로
    local_dir: deploy   # before_deploy에서 생성한 디렉토리
    wait-until-deployed: true

before_deploy

  • deploy 명령어가 수행되기 전에 수행된다.
  • Code Deploy는 jar 파일을 인식하지 못하므로 jar + 기타 설정 파일을 모아 zip 파일로 압축한다.

zip -r [repository name]

  • 현재 위치의 모든 파일을 [repository] 이름의 폴더로 압축

mkdir -p deploy

  • deploy라는 디렉토리를 Travis CI가 실행중인 위치에서 생성

mv [repo name].zip deploy/[repo name].zip

  • zip 파일을 deploy 폴더 안으로 이동시킨다.

deploy

  • S3로 파일 업로드 혹은 Code Deploy로 배포 등 외부 서비스와 연동될 행위들을 선언한다.

local_dir: deploy

  • 앞에서 생성한 deploy 디렉토리를 지정합니다.
  • 해당 위치의 파일들만 S3로 전송한다.

전체 파일은 다음과 같다.

language: java
jdk:
  - openjdk11

branches:
  only:
    - master

cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

script: "./gradlew clean build"

before_deploy:
  - zip -r 3tree_tmp_private
  - mkdir -p deploy
  - mv 3tree_tmp_private.zip deploy/3tree_tmp_private.zip

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    bucket: 3tree-springboot-build-old  # S3 버킷
    region: ap-northeast-2
    skip_cleanup: true
    acl: private  # zip 파일 접근을 private로
    local_dir: deploy   # before_deploy에서 생성한 디렉토리
    wait-until-deployed: true

notifications:
  email:
    recipients:
      - gkrry27232@naver.com

이후 변경 내용을 푸시해주고 Travis CI에서 확인해보자.

다음과 같이 완료되면 빌드가 성공한 것이다.

이제 만든 S3 버킷에 들어가면 업로드가 성공한 것을 확인할 수 있다.

profile
이것 저것 새로운 분야에 관심이 많은 서버 개발자

0개의 댓글