제가 아직 AWS에 대해 잘 알지 못해서 Gemini의 도움을 받아서 Code Deploy를 활용해 블루/그린 무중단 배포 환경을 구축하였는데요.
배포도 잘되고, 트래픽 전환도 정상적으로 되는 것 같은데 무엇인가 문제가 있는 것 같아서 질문 드립니다.
Auto Scaling Group
먼저 Auto Scaling Group에 원하는 용량, 최소/최대 인스턴스 개수는 모두 1로 설정 후 시작 템플릿을 연결하였습니다.
이 시작 템플릿의 IAM 역할에 부여된 권한은 다음과 같습니다.
- AmazonEC2ContainerRegistryReadOnly
- AmazonS3ReadOnlyAccess
- AWSCodeDeployFullAccess
- AWSCodeDeployRole
Target Group
그 후, Target Group을 service-tg-blue, service-tg-green 이렇게 2개 같은 설정으로 생성하였고 프로토콜은 HTTP/80, 상태검사 경로는 / 로 설정하였습니다.
Load Balancer
Load Balancer는 Application Load Balancer로 생성하였고 HTTP:80은 HTTPS://#{host}:443/#{path}?#{query} 로 리디렉션 되게 했고,
HTTPS:443은 기본작업을 [대상 그룹으로 전달]로 service-tg-blue : 100 (100%), service-tg-green : 0 (0%), 대상 그룹 고정성: 끔으로 설정했습니다.
그리고 SSL 인증서는 AWS ACM을 통해서 발급받아서 연결했습니다.
Code Deploy
Code Deploy에서는 배포 그룹을 생성해서 배포 유형은 [블루/그린] 으로 선택했고,
[Amazon EC2 Auto Scaling 그룹 자동 복사]를 선택해서 초기에는 제가 만든 Auto Scaling Group을 선택했고, 이후에는 자동으로 ASG가 생성되게끔 했습니다.
배포 설정은 [즉시 트래픽 다시 라우팅], [배포 그룹의 원본 인스턴스 종료] -> 대기시간은 [5분]
배포 구성은 CodeDeployDefault.AllAtOnce로 선택했습니다.
로드 밸런서 유형은 [Application Load Balancer 또는 Network Load Balancer]로 선택해서 제가 위에서 Load Balancer에 연결한 service-tg-blue, service-tg-green 이 두개의 Target Group을 선택했습니다.
[IAM 역할] : 역할의 이름은 CodeDeployRole-For-Service
- 역할은 다음 3가지 입니다. AutoScalingFullAccess, AWSCodeDeployRole, 직접 만든 정책
- 직접 만든 정책의 권한에 대한 요약은 다음과 같습니다.
| 서비스 | 액세스 수준 | 리소스 | 요청 조건 |
|---|
| EC2 | 제한적: 나열, 쓰기, 태그 지정 | 모든 리소스 | None |
| EC2 Auto Scaling | 제한적: 나열, 쓰기 | 모든 리소스 | None |
| ELB | 전체: 나열, 읽기, 쓰기 | 모든 리소스 | None |
| ELB v2 | 제한적: 읽기, 쓰기 | 모든 리소스 | None |
| IAM | 제한적: 쓰기 | RoleName| string like |code-deploy-ec2-role | None |
| SNS | 제한적: 쓰기 | 모든 리소스 | None |
현재 문제 상황
배포 자체는 성공적으로 완료되고 새로운 버전으로의 전환도 끊김없이 정상적으로 이루어집니다.
하지만 배포가 완료되고 나서 Target Group의 service-tg-blue, service-tg-green 모두 [등록된 대상]에 동일한 인스턴스가 등록되어 있고, service-tg-blue : 100 (100%), service-tg-green : 0 (0%) 이 트래픽 비율은 항상 고정되어있습니다.
그리고 [배포 그룹의 원본 인스턴스 종료] -> 대기시간은 [5분] 여기서 설정한 5분이 지나도 특정 그룹이 종료되거나 하지 않는 것 같습니다.

제가 생각한 예상 시나리오는
- 처음에는 service-tg-blue 환경으로 100%의 트래픽이 이동하고 있음.
- 새로운 배포가 진행되면 Code Deploy가 service-tg-green에 새로운 인스턴스를 띄우고 트래픽을 **service-tg-blue : 0 (0%), service-tg-green : 100 (100%)**으로 수정
- 두번째 배포가 진행되면 이번에는 Code Deploy가 service-tg-blue에 새로운 인스턴스를 띄우고 트래픽을 다시 **service-tg-blue : 100 (100%), service-tg-green : 0 (0%)**으로 수정
이런 식으로 service-tg-blue, service-tg-green이 서로 번갈아가면서 각각 blue, green 역할을 주고받는 것을 상상했는데 제가 생각한대로의 동작이 이루어지고 있지 않는 것 같습니다.
현재 제 상황대로라면 blue, green이 돌아가면서 동작하는 것이 아닌, 계속해서 service-tg-blue 그룹으로만 트래픽이 이동하는 것 같습니다.
궁금한 것
- 현재 제 상황이 어떻게 되고 있는 건지.
- 어떤 설정을 추가로 살펴봐야 하는지
- 제 상황이 지금 문제가 있는 상황인건지, 아니면 잘 동작하고 있는데 AWS에 대한 무지에서 오는 단순 이해부족인지.
- 어떻게하면 제 문제 상황을 해결할 수 있는 것인지
이렇게 4가지가 궁금합니다.
긴 글 읽어주셔서 감사합니다.