- AWS EC2 인스턴스 생성 / RDS, S3 생성
- 프로젝트와 RDS, S3연동 및 EC2 프로젝트 배포
- 배포 자동화를 위해 Travis-ci 설정
- nginx를 활용하여 무중단 배포 설정
EC2 인스턴스를 생성하고, 포트 설정만 적절하게 해 주었다면 sftp 툴을 사용하여 직접 서버에 접속, 프로젝트를 배포할 수 있다. ( nohub java -jar [배포할 프로젝트 jar파일] )
하지만 수동으로 프로젝트를 배포할 경우 그만큼 ‘배포’라는 작업에 할애 되는 시간이 많아지기 때문에 효율적이라 할 수 없다. 많은 IaaS 서비스들이 ‘배포’작업에 자동화를 지원하고있다.
배포 자동화란 개발자가 코드를 저장소에 push 하기만 하면 build부터 deploy에 이르는 일련의 과정을 자동으로 진행해주는 기능이다.
배포 자동화가 적용된 프로젝트 배포 구조
Travis-ci는 GitHub에서 제공하는 CI / CD 서비스 이다. Travis-ci는 .tavis.yml파일을 감지하여 동작을 수행한다.
Travis-ci에서 AWS의 S3에 접근하기 위해서는 별도 권한이 필요하다.
S3권한 생성 및 부여
.travis.yml
language: java
jdk:
- openjdk8
branches:
only:
- master
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "./gradlew clean build"
before_install:
- chmod +x gradlew
#deploy가 실행되기 이전에 실행할 작업 명시 ( 폴더 생성 -> 스크립트 복사 -> 이전 배포파일 옮김 )
before_deploy:
- mkdir -p before-deploy
- cp scripts/*.sh before-deploy/
- cp appspec.yml before-deploy/
- cp build/libs/*.jar before-deploy/
- cd before-deploy && zip -r before-deploy *
- cd ../ && mkdir -p deploy
- mv before-deploy/before-deploy.zip deploy/springboot-webservice.zip
#deploy 실행할 위치 지정 ( access_key, secret_key는 travis통해 사전 등록 )
deploy:
- provider: s3
access_key_id: $AWS_ACCESS_KEY
secret_access_key: $AWS_SECRET_KEY
bucket: springboot-study-s3-jw
region: ap-northeast-2
skip_cleanup: true
acl: private
local_dir: deploy
wait-until-deployed: true
- provider: codedeploy
access_key_id: $AWS_ACCESS_KEY
secret_access_key: $AWS_SECRET_KEY
bucket: springboot-study-s3-jw
key: springboot-webservice.zip
bundle_type: zip
application: springboot-webservice-cd
deployment_group: springboot-webservice-cdgr
region: ap-northeast-2
wait-until-deployed: true
#deploy 완료 후 상태 전송받을 이메일
notifications:
email:
recipients:
- "jongbell4@gmail.com"
배포 자동화가 적용되었다면 개발자의 push 동작 하나로 자동으로 서버에 배포까지 완료되는 것을 확인 할 수 있다.
하지만 배포 과정에서 이루어지는 서비스의 재기동 과정에서는 Client 입장에서 서비스를 사용할 수 없게 된다. ( 500 error )
이러한 불편함을 해소하기 위해 ‘무중단 배포’를 적용해 보도록 한다.
무중단 배포가 적용 된 프로젝트 배포 구조