내용으로 건너뛰기

Code Deploy를 사용한 블루/그린 배포 중 발생한 문제 및 궁금증

0

제가 아직 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-roleNone
SNS제한적: 쓰기모든 리소스None

현재 문제 상황

배포 자체는 성공적으로 완료되고 새로운 버전으로의 전환도 끊김없이 정상적으로 이루어집니다.
하지만 배포가 완료되고 나서 Target Groupservice-tg-blue, service-tg-green 모두 [등록된 대상]에 동일한 인스턴스가 등록되어 있고, service-tg-blue : 100 (100%), service-tg-green : 0 (0%) 이 트래픽 비율은 항상 고정되어있습니다. 그리고 [배포 그룹의 원본 인스턴스 종료] -> 대기시간은 [5분] 여기서 설정한 5분이 지나도 특정 그룹이 종료되거나 하지 않는 것 같습니다. 로드 밸런서

제가 생각한 예상 시나리오는

  1. 처음에는 service-tg-blue 환경으로 100%의 트래픽이 이동하고 있음.
  2. 새로운 배포가 진행되면 Code Deployservice-tg-green에 새로운 인스턴스를 띄우고 트래픽을 **service-tg-blue : 0 (0%), service-tg-green : 100 (100%)**으로 수정
  3. 두번째 배포가 진행되면 이번에는 Code Deployservice-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 그룹으로만 트래픽이 이동하는 것 같습니다.

궁금한 것

  1. 현재 제 상황이 어떻게 되고 있는 건지.
  2. 어떤 설정을 추가로 살펴봐야 하는지
  3. 제 상황이 지금 문제가 있는 상황인건지, 아니면 잘 동작하고 있는데 AWS에 대한 무지에서 오는 단순 이해부족인지.
  4. 어떻게하면 제 문제 상황을 해결할 수 있는 것인지

이렇게 4가지가 궁금합니다.
긴 글 읽어주셔서 감사합니다.

1개 답변
-1

제공해주신 정보를 바탕으로 현재 상황을 분석해보겠습니다.

현재 상황 분석: AWS CodeDeploy의 블루/그린 배포에서는 대상 그룹 이름(blue/green)이 고정되어 있지만, 실제 역할은 배포마다 교대됩니다. 즉, 대상 그룹의 이름과 실제 역할(프로덕션/스테이징)은 별개입니다.

배포 과정에서 일어나는 일:

  1. 새 배포가 시작되면 CodeDeploy는 현재 프로덕션 환경(트래픽을 받고 있는 환경)을 식별합니다.
  2. 다른 대상 그룹에 새 인스턴스를 생성합니다.
  3. 새 인스턴스가 준비되면 트래픽을 새 환경으로 전환합니다.
  4. 설정한 대기 시간(5분) 후에 이전 환경의 인스턴스를 종료합니다.

현재 상황에서는 service-tg-blue가 항상 100% 트래픽을 받고 있는데, 이는 정상적인 동작입니다. CodeDeploy는 배포 시 내부적으로 트래픽을 전환하지만, 배포가 완료된 후에는 항상 지정된 "프로덕션" 대상 그룹(여기서는 service-tg-blue)으로 트래픽을 라우팅합니다.

두 대상 그룹에 동일한 인스턴스가 등록되어 있는 것은 배포 과정에서 일시적으로 발생할 수 있습니다. 배포가 완료되면 이전 환경의 인스턴스는 종료되어야 합니다.

해결 방안:

  1. CodeDeploy 콘솔에서 배포 이벤트와 로그를 확인하여 배포 과정이 올바르게 진행되는지 검증하세요.
  2. 배포 그룹 설정에서 "배포 그룹의 원본 인스턴스 종료" 옵션이 활성화되어 있는지 확인하세요.
  3. 대상 그룹의 상태를 주기적으로 확인하여 이전 환경의 인스턴스가 적절히 종료되는지 모니터링하세요.
  4. AWS CloudWatch를 통해 배포 과정의 이벤트와 로그를 모니터링하여 더 자세한 정보를 얻을 수 있습니다.

결론적으로, 현재 설정은 기본적으로 올바르게 구성된 것으로 보이며, service-tg-blue가 항상 프로덕션 트래픽을 받는 것은 정상적인 동작입니다. 블루/그린 배포의 핵심은 트래픽이 중단 없이 새 버전으로 전환되는 것이며, 이 부분이 잘 작동하고 있다면 배포 전략은 성공적으로 구현된 것입니다.
Sources
DescribeLoadBalancers - Elastic Load Balancing
DescribeLoadBalancers - Elastic Load Balancing

답변함 3달 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.