✅ 블루/그린 배포란?
💡 기존 서버(블루)와 새로운 서버(그린) 간의 트래픽 전환을 통해 무중단 배포를 구현하는 전략.
핵심 아이디어는 현재 운영 중인 애플리케이션(블루)과 새 버전의 애플리케이션(그린)을 두 개의 동일한 환경에서 동시에 운영한 후, 새 버전이 정상적으로 작동하는 것을 확인한 다음 트래픽을 전환하는 방식.
블루/그린 배포와 같은 무중단 배포는 배포 시 서버가 내려가는 Downtime을 없앤다고 해서 Zero Downtime이라고도 불린다.
이를 통해 유저들은 서비스를 불편함없이 사용할 수 있게 된다.
✅ 아키텍처 무작정 생각해보기
- 우선 자동 통합/배포를 위해 CI/CD 툴인 Github Actions를 떠올렸다.
- 그리고 해당 서버를 배포하기 위한 인프라가 필요한데 후보는 많았다. AWS EC2, ECS 등등 많았지만 나는 CI/CD 파이프라인을 처음 구축해보는 것이기 때문에 제일 만만한 AWS EC2를 선택했다.
- 여기에 스프링부트 서버를 띄워야 하는데 하나만 띄우는게 아니라 블루, 그린 총 두 개의 서버를 띄워야 한다.
나는 Docker를 떠올렸다. Docker와 Docker Compose를 이용해 EC2에 블루, 그린 서버 컨테이너를 AWS EC2에 띄워서 운영할 생각이다. - Docker를 사용하기 때문에 이미지 관리를 쉽게 할 수 있는 AWS ECR를 사용하기로 했다.
- 추가적으로 찾아보니 CodeDeploy를 활용하면 CI/CD 파이프라인을 쉽게 구축할 수 있다고 한다. 또한 추후 멀티서버로 확장 시, 블루/그린 배포도 매우 쉽게 할 수 있게 해준다. 따라서 AWS CodeDeploy를 도입하기로 했다.
- CodeDeploy를 사용하면 관련 파일들을 임시로 저장해두어야 한다고 한다. 따라서 이 파일을 저장하기 위해 AWS S3도 도입했다.
- 마지막으로 백엔드 서버로 요청이 들어왔을 때, 블루 서버가 실행 중인지, 그린 서버가 실행 중인지 모른다. 따라서 동적으로 실행 중인 서버로 리다이렉트를 해줘야 하는데 프록시 서버 기능을 갖고 있는 Nginx를 사용하기로 했다.
정리하면 다음과 같다.
Github Actions : CI/CD 파이프라인 구축
AWS EC2: 서버 배포 환경
Docker/Docker Compose: 블루 서버, 그린 서버 실행
AWS ECR: 이미지 관리
CodeDeploy: CI/CD 구축 효율성 증대 및 추후 확장성 고려
AWS S3: CodeDeploy 관련 파일 관리
Nginx: 적절한 서버로 프록시
그리고 아키텍처를 그림으로 표현해보았다.
시나리오는 다음과 같다.
- 개발자가 Main 브랜치에 푸시한다.
- Github Actions에 의해 아래 Event가 발생한다.
- CodeDeploy 파일 및 기타 파일을 S3에 업로드한다.
- Spring Boot 빌드 파일을 Docker 이미지로 만들고 ECR에 업로드한다.
- CodeDeploy에게 배포를 명령한다.
- 명령을 받은 CodeDeploy는 EC2에게 배포 명령을 하게 된다.
- EC2는 CodeDeploy 명령에 의해 CodeDeploy 파일 및 기타 파일들을 S3에서 다운로드 받는다.
- 또한 Spring Boot 빌드 이미지를 ECR에서 다운로드 받는다.
- 실행 중인 서버를 판단해 실행 중이지 않는 서버에 배포를 진행한다.
✅ 1. AWS EC2 인스턴스 생성
IAM 역할 할당
두 가지의 정책을 가고 있다.
- AmazonEC2ContainerRegistryFullAccess: ECR에서 Springboot 빌드 Docker 이미지를 다운 받기 위함
- sscanner-ec2-s3-access: 커스텀으로 만든 정책인데, 쉽게 말하면 S3의 파일을 다운받을 수 있는 권한이다. CodeDeploy 관련 파일들을 다운 받기 위해 추가했다.
Amazon ECR Docker Credential Helper 설치
AmazonEC2ContainerRegistryFullAccess정책을 추가해줬지만 추가적으로 한가지 설정이 더 필요하다.
ECR에서 이미지를 업로드하고 다운로드하려면 추가적인 로그인 과정이 필요한데 해당 과정을 처리해주는 것이 Amazon ECR Docker Credential Helper이다.
1️⃣ 설치 명령어
# Ubuntu일 경우
$ sudo apt update
$ sudo apt install amazon-ecr-credential-helper
2️⃣ Configuration 설정하기
~ 경로에서 .docker라는 폴더 만들고, config.json 파일을 만들어 다음과 같이 작성
$ cd ~
$ mkdir .docker
$ cd .docker
$ vi config.json
{
"credsStore": "ecr-login"
}
✅ 2. EC2에 Docker, Docker Compose, Nginx 설치
Docker, Docker Compose 다운로드
$ sudo apt-get update && \\
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \\
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo apt-key add - && \\
sudo apt-key fingerprint 0EBFCD88 && \\
sudo add-apt-repository "deb [arch=amd64] <https://download.docker.com/linux/ubuntu> $(lsb_release -cs) stable" && \\
sudo apt-get update && \\
sudo apt-get install -y docker-ce && \\
sudo usermod -aG docker ubuntu && \\
sudo curl -L "<https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \\
sudo chmod +x /usr/local/bin/docker-compose && \\
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 잘 설치됐는 지 확인
$ docker -v # Docker 버전 확인
$ docker compose version # Docker Compose 버전 확인
Nginx 다운로드
$ sudo apt update
$ sudo apt install nginx
# 잘 설치됐는지 확인
$ sudo service nginx status
✅ 3. AWS ECR 리포지토리 생성
스프링부트 빌드 파일 Docker 이미지를 관리하기 위한 ECR 리포지토리를 생성했다.
✅ 4. S3 버킷 생성
CodeDeploy 관련 파일 및 기타 파일들을 관리하기 위한 S3 버킷을 만들어줬다.
추후 설명하겠지만, 해당 파일들은 EC2가 수행할 배포 작업들과 관련된 파일들이다.
✅ 5. CodeDeploy 설정
1️⃣ CodeDeploy 애플리케이션 생성
2️⃣ CodeDeploy IAM 역할 생성
CodeDeploy가 가져야할 권한은 한 가지이다. 바로 EC2에 접근하는 것이다.
AWSCodeDeployRole을 추가했다.
3️⃣ 배포 그룹 생성
서비스 역할 및 배포 유형
- 서비스 역할: 위에서 만든 IAM 역할이다
- 배포 유형: 당장은 하나의 EC2 인스턴스에 배포하므로 현재위치로 한다.
환경 구성
- 위에서 만들었던 EC2를 선택한다.
생성 완료
4️⃣ EC2에 CodeDeploy Agent 설치하기
💡 Code Deploy가 EC2에게 명령을 내릴텐데 그 명령을 실행시켜주는 도우미가 바로 Code Deploy Agent이다.
$ sudo apt update && \\
sudo apt install -y ruby-full wget && \\
cd /home/ubuntu && \\
wget <https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install> && \\
chmod +x ./install && \\
sudo ./install auto
[실행 확인]
$ systemctl status codedeploy-agent
✅ 마치며
기본적인 인프라구성은 끝이 났다.
다음 포스트에서는 Github Actions를 통해 CI/CD 파이프라인을 구축해보도록 하겠다.
'데브코스 > 실습 & 프로젝트' 카테고리의 다른 글
[2-3차 프로젝트] 블루 - 그린 배포 과정 중 502 BadGateway 발생 해결 여정 (0) | 2024.10.28 |
---|---|
[2-3차 프로젝트] 블루/그린 배포 방식으로 CI/CD 파이프라인 구축하기 - 2. CI/CD 파이프라인 구축 (0) | 2024.10.27 |
[1차 프로젝트] - Toss Payments 결제 API를 통해 Spring boot 서버 구현하기 (4) | 2024.09.12 |
[1차 프로젝트] 코드리뷰 피드백 반영하기 (0) | 2024.09.09 |
[1차 프로젝트] 기본키를 UUID로 할 때 주의점과 JPA 엔티티의 기본키 타입 고민 (1) | 2024.09.07 |