canary_before 브랜치
카나리 무중단 배포 전략 도입 전 환경을 구축합니다.
cd-canary.yml
파일을 통해 JAR 파일을 업로드하고, 이전 프로세스를 죽이고 JAR 파일을 8081포트, 8082포트에서 실행합니다. 이 과정에서 다운 타임이 발생하게 됩니다.
canary_after 브랜치
카나리 전략 도입하여 무중단 배포를 실행합니다.
cd-canary.yml
파일을 통해 deploy.sh
파일을 실행합니다.
- 현재 실행 중인 Spring Boot 애플리케이션의 포트 확인
- 현재 실행 중인 애플리케이션이 8081 포트에서 동작 중인지 8082 포트에서 동작 중인지 확인하여
CURRENT_PORT
변수에 저장합니다.
- 새 애플리케이션을 배포할 포트(
NEW_PORT
)를 결정합니다. 현재 실행 중인 포트가 8081이라면, 새 애플리케이션은 8082에 배포되고 그 반대라면 8081포트에 배포됩니다.
- 기존 JAR 파일 백업
- 새 애플리케이션이 배포될 포트의 기존 JAR 파일을
old_build
디렉토리로 이동시켜 백업합니다. 백업 파일명에는 타임스탬프가 추가되어 구분됩니다.
- 새 애플리케이션 배포
- 빌드된 JAR 파일을
app-$NEW_PORT.jar
로 이름을 변경하고 새 포트에서 실행시킵니다.
- 헬스 체크
- 새 애플리케이션이 제대로 실행되는지 확인하기 위해
/actuator/health
엔드포인트를 사용하여 최대 10회동안 헬스 체크를 반복합니다.
- 헬스 체크에 실패하면 새 애플리케이션 프로세스를 종료하고, Nginx를 통해 구버전으로 롤백합니다. 이때 새로운 JAR 파일도 백업되고, 이전 JAR 파일로 복원됩니다.
- Nginx 설정 업데이트 - 트래픽 30%로 라우팅
- Nginx 설정을 업데이트하여 구버전에 70%, 새버전에 30% 트래픽을 라우팅합니다. 설정이 성공적으로 적용되면 Nginx를 reload합니다.
- 점진적 트래픽 증가 - 50%, 70%로 업데이트
- 일정 시간이 경과할 때마다 새 애플리케이션으로 가는 트래픽 비율을 50%, 70%로 점진적으로 증가시킵니다. 각 단계마다 헬스 체크를 수행하여 새 애플리케이션이 안정적으로 동작하는지 확인합니다.
- 만약 헬스 체크가 실패하면 Nginx 설정을 원래대로 되돌리고, 새 애플리케이션 프로세스를 종료하여 롤백합니다.
- 최종 트래픽 100%로 전환
- 모든 헬스 체크가 성공하면 Nginx 설정을 업데이트하여 트래픽을 100% 새 버전으로 전환합니다.
- 구버전 프로세스 종료 및 JAR 파일 백업
- 구버전 애플리케이션이 동작 중인 포트를 확인한 후, 안전하게 종료합니다.
- 구버전 JAR 파일을
old_build
폴더로 이동시켜 타임스탬프와 함께 백업합니다.
- 카나리 배포 완료
- 배포가 성공적으로 완료되었으며, 이제 새로운 버전이 100%의 트래픽을 처리합니다.
8.1. 환경 셋팅
먼저 Termius 를 이용하여 EC2 서버에 SSH 원격 접속합니다.
8.1.1. Nginx 설정파일 수정
아래 명령어를 입력하여 Nginx 설정 파일을 수정합니다.
sudo nano /etc/nginx/sites-available/default