자동으로 CI/CD를 할 수 있는 환경을 만들것이다.
접근 가능한 권한을 가진 Key를 생성해서 사용해야 한다. AWS에서는 이러한 인증과 관련된 기능을 제공하는 서비스로 IAM이 있다.
IAM은 AWS에서 제공하는 서비스의 접근 방식과 권한을 관리한다. 이 IAM을 통해 Travis CI가 AWS의 S3와 CodeDeploy에 접근할 수 있도록 해보겠다. (RDS는...?)
IAM의 왼쪽 사이드바에서 [사용자] -> [사용자 추가]버튼 클릭
+실제 서비스 회사에서는 권한도 S3와 CodeDeploy를 분리해서 관리하기도 하지만, 여기서는 간단하게 둘을 합쳐서 관리한다.
최종 생성 완료되면 엑세스 키와 비밀 엑세스 키가 생성되는데 이 두 값이 Travis CI에서 사용될 키이다.
여기에 등록된 값들은 이제 .travis.yml에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY란 이름으로 사용할 수 있다.
그럼 이제 이 키를 사용해서 jar를 관리할 S3버킷을 생성하겠다.
AWS의 S3서비스는 일종의 파일서버이다. 순수하게 파일들을 저장하고 접근 권한을 관리, 검색 등을 지원하는 파일 서버의 역할을 하낟.
S3는 보통 게시글을 쓸 떄 나오는 첨부파일 등록을 구현할 때 많이 이용한다. 여기서는 Travis CI에서 생성된 Build 파일을 저장하도록 구성하겠다. S3에 저장된 Build 팡리은 이후 AWS의 CodeDeploy에서 배포할 파일로 가져가도록 구성할 예정이다.
AWS에서 S3검색 -> [버킷 만들기] 클릭
버킷명은 이 버킷에 배포할 Zip 파일이 모여있는 장소임을 의미하도록 짓는 것을 추천!
버킷의 보안과 권한 설정 부분에서 모든 차단을 해야 한다. 실제 서비스에서 Jar파일이 퍼블릭일 경우 누구나 내려받을 수 있어 코드나 설정값, 주요 키값들이 다 탈취될 수 있다.
퍼블릭이 아니더라도 우리는 IAM 사용자로 발급받은 키를 사용하니 접근 가능하다.
S3가 생성되었으면 이 S3로 배포파일을 전달하자.
Travis CI에서 빌드하여 만든 Jar파일을 S3에 올릴 수 있도록 .travis.yml을 수정하자.
language: java
jdk:
- openjdk11
branches:
only:
- master
before_install:
- chmod +x gradlew
# Travis CI 서버의 Home
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "./gradlew clean build"
before_deploy:
- mkdir -p before-deploy # zip에 포함시킬 파일들을 담을 디렉토리 생성
- cp scripts/*.sh before-deploy/
- cp appspec.yml before-deploy/
- cp build/libs/*.jar before-deploy/
- cd before-deploy && zip -r before-deploy * # before-deploy로 이동후 전체 압축
- cd ../ && mkdir -p deploy # 상위 디렉토리로 이동후 deploy 디렉토리 생성
- mv before-deploy/before-deploy.zip deploy/freelec-springboot2-webservice.zip # deploy로 zip파일 이동
deploy:
- provider: s3
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: freelec-springboot-build # S3 버킷
region: ap-northeast-2
skip_cleanup: true
acl: private # zip 파일 접근을 private으로
local_dir: deploy # before_deploy에서 생성한 디렉토리
wait-until-deployed: true
- provider: codedeploy
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: freelec-springboot-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
# CI 실행 완료시 메일로 알람
notifications:
email:
recipients:
- jojoldu@gmail.com
before_deploy
mkdir -p deploy
deploy
local_dir: deploy
설정이 다 되었으면 깃허브로 push한다. Travis CI에서 자동으로 빌드가 진행되는 것을 확인하고, 모든 빌드가 성공하는지 확인한다. 이제는 CodeDeploy로 배포까지 완료해보자.
AWS의 배포 시스템인 CodeDeploy를 이용하기 전에 배포 대상인 EC2가 CodeDeploy를 연동 받을 수 있게 IAM 역할을 하나 생성하자.
AWS의 IAM에서 [역할] -> [역할 만들기] 버튼 클릭
+IAM의 사용자와 역할의 차이
애플리케이션 배포를 자동화하는 배포 서비스
+spring.profiles.include를 통해 다른 properties파일을 등록할 수 있다.