ECS를 이용한 Blue/Green 무중단 배포 구성하기 (6) - CodeDeploy를 이용한 Blue/Green 무중단 배포 테스트
작성 일자 : 2024년 7월 28일
시리즈 순서
- 프로젝트 생성과 ECR 리포지토리
- VPC 생성 및 NAT Instance를 이용한 인터넷 연결
- Route 53 Hosted Zone 생성 및 ACM SSL 인증서 발급
- 애플리케이션 로드 밸런서(ALB) 생성
- ECS를 이용한 컨테이너 배포
- CodeDepoly를 이용한 Blue/Green 무중단 배포 테스트 (👈 지금 보고 있는 포스트)
- Github Actions를 이용한 배포 자동화 구축
1. ECR 리포지토리에 새로운 이미지 푸시
본격적으로 CD 파이프라인을 구축하기 전에, 배포중인 애플리케이션의 새로운 버전을 ECR 리포지토리에 푸시하고 CodeDeploy를 통해 무중단 배포를 테스트하겠습니다.
1-1. Spring Boot 애플리케이션의 IndexController 수정
시리즈 1편, 프로젝트 생성과 ECR 리포지토리편에서 작성한 아래와 같은 IndexController를 수정합니다. "Hello, World!" 대신 "This is Second Deployment!"를 반환하도록 수정하였습니다.
수정 전
@Controller
public class IndexController {
@GetMapping("/")
@ResponseBody
public String index() {
return "Hello, World!";
}
}
수정 후
@Controller
public class IndexController {
@GetMapping("/")
@ResponseBody
public String index() {
return "This is Second Deployment!";
}
}
1-2. Docker 이미지 빌드 및 ECR 리포지토리에 푸시
- 프로젝트의 루트 디렉토리에서 아래의 명령어를 입력해서 Docker 이미지를 빌드합니다.
./gradlew build
docker build --platform linux/amd64 --build-arg JAR_FILE=build/libs/\*.jar -t gerrymandering-ecsdeploy .
- ECR 리포지토리의 오른쪽 상단에 있는 View push commands 버튼을 클릭합니다. 1번 명령어를 통해 ECR에 Docker 클라이언트를 인증시킵니다.
// 예시
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 730335408691.dkr.ecr.ap-northeast-2.amazonaws.com
- 이어서 3번과 4번 명령어를 통해 Docker 이미지를 ECR 리포지토리에 푸시합니다.
// 예시
docker tag gerrymandering-ecsdeploy:latest 730335408691.dkr.ecr.ap-northeast-2.amazonaws.com/gerrymandering-ecsdeploy:latest
docker push 730335408691.dkr.ecr.ap-northeast-2.amazonaws.com/gerrymandering-ecsdeploy:latest
- ECR 리포지토리에 이미지가 성공적으로 푸시되었는지 확인합니다.
2. ECS Task Definition Revision 생성
다음으로는 ECS Task Definition의 Revision을 생성합니다. Revision은 현재 Task Definition의 버전 복사본으로, 수정되지 않은 파라미터는 그대로 유지하면서 파라미터 값이 업데이트됩니다.
- ECS > Task Definitions로 이동한 후, 생성한 Task Definition
ecsdeploy-ECS-TD
를 클릭합니다.
- Revision 1번을 체크한 후, 우측 상단의 Create new revision > Create new revision 버튼을 클릭합니다.
- 모든 사항을 그대로 유지한 채로 Create 버튼을 클릭합니다.
3. ECS Service Update 진행
- 이전 과정에서 생성된
ecsdeploy-ECS-TD:2
Task Definition Revision 페이지에서 Deploy > Update Service 버튼을 클릭합니다.
- 아래와 같이 Update service의 설정을 진행합니다.
- Cluster와 Service는 기본값을 유지합니다.
- Deployment configuration
- Force new deployment:
체크
- Desired tasks:
1
- Deployment options - Powerd by CodeDeploy(중요!!)
- Application name: 드롭다운 메뉴에서 선택 (
AppECS-ecsdeploy-ECS-Cluster-ecsdeploy-ECS-Service
) - Deployment group: 드롭다운 메뉴에서 선택 (
DgpECS-ecsdeploy-ECS-Cluster-ecsdeploy-ECS-Service
) - Deployment configuration:
CodeDeployDefault.ECSAllAtOnce
- Application name: 드롭다운 메뉴에서 선택 (
- Force new deployment:
- 나머지 설정은 기본값을 유지한 채로 Update 버튼을 클릭합니다.
- 다음으로 넘어간 ECS Service 페이지의 우측 상단 The CodeDeploy deployment was created > Deployment ID를 클릭해서 진행중인 CodeDepoly 배포로 이동합니다. AWS CodeDeploy > Deployments에서도 확인 가능합니다.
4. CodeDeploy 배포 과정
CodeDeploy 배포가 진행되는 과정은 아래와 같습니다.
Step 1. Deploying replacement task set
- 새 버전의 애플리케이션이 ECS Task Set에 새로 배포됩니다.
Step 2. Rerouting production traffic to replacement task set
- 프로덕션 트래픽이 새 버전의 애플리케이션으로 전환됩니다.
- 이 과정을 지나면 아래와 같이 새 버전의 애플리케이션이 정상적으로 배포된 것을 확인할 수 있습니다.
Step 3. Wait 1 hour 0 minutes
- 새 배포에 문제가 있는지 모니터링하기 위한 지정된 시간(이 경우 1시간) 동안, 이전 버전의 애플리케이션을 같이 유지합니다.
- 이 시간 동안 문제가 발생하면, 우측 상단의 Stop and roll back deployment 버튼을 클릭하여 이전 버전의 애플리케이션으로 롤백할 수 있습니다.
Step 4. Terminate original task set
- 1시간 동안 문제가 발생하지 않으면, 이전 버전의 애플리케이션을 종료합니다.
- 우측 상단의 Terminate original task set 버튼을 클릭하여 바로 이전 버전의 애플리케이션을 종료할 수 있습니다.