배포 환경
aws ec2, rds, s3, codedeploy, IAM
docker
springBoot
git, github
travis ci
1. Travis CI와 프로젝트 연동하기
1-1. Travis CI 웹 서비스 설정
Travis CI 접속 -> 로그인 -> 오른쪽 상단 프로필 -> settings 클릭
원하는 프로젝트 설정에서 활성화
1-2. 프로젝트 설정
프로젝트에서 .travis.yml 생성 build.gradle과 같은 위치에 생성
.travis.yml 설정
language: generic
sudo: required
dist: focal
services:
- docker
branches:
only:
- main
git:
submodules: false
before_install:
- echo -e "\n\nmachine github.com\n login $GITHUB_ACCESS_TOKEN\n" >~/.netrc
- git submodule update --init --recursive
script:
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- docker build -t $DOCKER_USERNAME/bmart-app:develop -f Dockerfile-app .
- docker push $DOCKER_USERNAME/bmart-app:develop
- docker build -t $DOCKER_USERNAME/nginx-app:develop -f Dockerfile-nginx .
- docker push $DOCKER_USERNAME/nginx-app:develop
#CI 실행 완료 시 메일로 알람
notifications:
email:
recipients:
- so5663@naver.com
환경변수는 travis사이트에서 프로젝트 설정에서..
2. Travis CI와 AWS S3 연동하기
S3 : AWS에서 제공하는 일종의 파일 서버, 이미지 파일을 비롯한 정적 파일들을 관리하거나 배포파일들을 관리하는 기능 지원
실제 배포는 AWS의 CodeDeploy라는 서비스를 이용하지만 S3 연동을 먼저 진행하는 이유는 jar 파일을 전달하기 위해서이다. CodeDeploy는 저장 기능이 없어서 Travis CI가 빌드한 결과물을 S3에 보관한다.
2-1. AWS Key 발급하기
IAM(Identity and Access Management) : AWS에서 제공하는 서비스의 접근 방식과 권한을 관리함,
Travis CI가 IAM을 통해 S3와 Code Deploy에 접근함
IAM 검색 -> 사용자 -> 사용자 추가
- 액세스 유형 프로그래밍 방식 액세스
권한 설정 방식 선택 -> 정책 필터 선택
s3, codedepoly 권한 설정
2-2. Travis CI에 키 등록하기
Travis CI 설정 화면에서 환경변수 등록
2-3. S3 버킷 생성
S3에 Travis CI에서 생성된 Build 파일을 저장하도록 구성함, S3에 저장된 Build 파일을 이후 Code Deploy에서 배포할 파일로 가져가도록 구성할 예정
2-3. .travis.yml 코드 추가
before_deploy:
- zip -r bmart .
- mkdir -p deploy
- mv bmart.zip deploy/bmart.zip
deploy:
- provider: s3
access_key_id: $AWS_ACCESS_KEY
secret_access_key: $AWS_SECRET_ACCESS_KEY
bucket: elasticbeanstalk-ap-northeast-2-284256502692 #bucket 이름
region: ap-northeast-2
skip_cleanup: true
acl: private
local_dir: deploy
wait-until-deployed: true
on:
branch: main # main branch 허용
S3 버킷에서 zip 파일 확인
3. Travis CI와 AWS S3, CodeDeploy, EC2 연동하기
3-1. EC2에 IAM 역할 추가하기
배포 대상인 EC2가 CodeDeploy를 연동 받을 수 있게 IAM 역할 생성
- IAM -> 역할 -> 역할 만들기
앞에서 만들었던 IAM의 사용자와 역할의 차이
- 사용자 : AWS 서비스 외에 사용할 수 있는 권한, 로컬PC 등
- 역할 : AWS 서비스에만 할당할 수 있는 권한, EC2 등
지금 만들 권한은 EC2에서 사용할 것이기 때문에 사용자가 아닌 역할로 처리
정책 : AmazonEC2RoleforAWSCodeDeploy선택
이렇게 만든 역할을 EC2 서비스에 등록
!중요 인스턴스 재부팅
3-2. CodeDeploy 에이전트 설치
EC2에 접속해서 명령어 입력
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
내려받기가 성공했다면 아래와 같은 메시지가 콘솔에 출력
download: s3://aws-codedeploy-ap-northeast-2/latest/install to ./install
install 파일에 실행 권한 추가
chmod +x ./install
install 파일로 설치 진행
sudo ./install auto
설치중 ruby:No such file or directory 와 같은 에러가 발생한다면 sudo yum install ruby로 루비를 설치하면 됨
sudo service codedeploy-agent status
아래와 같이 running 메시지가 출력되면 정상
The AWS CodeDeploy agent is running as PID ****
3-3. CodeDeploy를 위한 권한 생성
CodeDeploy에서 EC2에 접근하려면 마찬가지로 권한이 필요함
AWS 서비스 이므로 IAM 역할을 생성하면 된다.
- IAM서비스 -> 역할 -> 역할 만들기 -> CodeDeploy 선택
3-4. CodeDeploy 생성
- CodeDeploy -> 애플리케이션 -> 애플리케이션 생성 버튼 클릭
- 배포그룹 생성
3-5. Travis CI, S3, CodeDeploy 연동
- S3에서 넘겨줄 zip파일을 저장할 디렉토리 EC2 서버에 생성
mkdir ~/app/step2 && mkdir ~/app/step2/zip
Travis CI의 빌드가 끝나면 S3에 zip파일이 전송되고, 이 zip파일은 /home/ec2-user/app/step2/zip으로
복사되어 압축을 풀 예정
Travis CI의 설정은 .travis.yml으로 진행했음
AWS CodeDeploy의 설정은 appspec.yml으로 진행
- appstec.yml 작성
- version : 0.0 : CodeDeploy 버전을 이야기함, 프로젝트 버전이 아니므로 0.0 이외의 다른 버전을 사용하면 오류가 발생함
- source : CodeDeploy에서 전달해준 파일 중 destination으로 이동 시킬 대상을 지정함, 루트 파일(/)을 지정하면 전체파일을 이야기함
- destination : source에서 지정된 파일을 받을 위치, 이후 jar를 실행하는 등은 destination에서 옮긴 파일들로 진행됨
- overwrite : 기존에 파일들이 있으면 덮어쓸지를 결정함
- .travis.yml 코드 추가 후 커밋, 푸시
- provider: codedeploy
access_key_id: $AWS_ACCESS_KEY
secret_access_key: $AWS_SECRET_ACCESS_KEY
bucket: elasticbeanstalk-ap-northeast-2-284256502692
key: bmart.zip
bundle_type: zip
application: bmart
deployment_group: bmart-group
region: ap-northeast-2
wait-until-deployed: true
on:
branch: main # main branch 허용
4. 배포 자동화 구성
4-1. deploy.sh 파일 추가
#!/bin/bash
# 현재 실행 중인 컨테이너 확인
running_containers=$(docker-compose ps -q)
# 실행 중인 컨테이너가 있으면 중지 및 삭제
if [ -n "$running_containers" ]; then
echo "Stopping and removing existing containers..."
docker-compose down
fi
# Docker Compose 실행
echo "Running Docker Compose..."
docker-compose up -d
4-2. appspec.yml 수정
## AWS CodeDeploy 설정
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app/step2/zip/
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: /scripts/deploy.sh
timeout: 60
runas: ec2-user