내용으로 건너뛰기

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가지가 궁금합니다.
긴 글 읽어주셔서 감사합니다.

2개 답변
0

안녕하세요,

질문자님께서는 CodeDeploy를 Auto Scaling 그룹과 ALB에 연동해 Blue/Green 배포했을 때,

  1. 왜 Target Group의 트래픽 라우팅 비율이 유지되는지
  2. 왜 대체 인스턴스가 두 개의 Target Group에 중복 등록 되는지

에 대해서 질문 주셨습니다. 혹시 제가 잘못 이해했다면 댓글 남겨주시면 감사하겠습니다.

먼저, CodeDeploy의 Blue/Green 배포 과정에 대해 간략하게 설명드리자면,

  1. 선택하신 원본 Auto Scaling Group을 복제한 “새로운 Auto Scaling Group”을 생성해 대체 (새로운 배포) 인스턴스들을 생성합니다. [1]
  2. 새로운 Auto Scaling Group이 생성한 대체 인스턴스에 appspec.yml에서 정의한 배포 과정이 실행됩니다.,
  3. 선택하신 Target Group들에 대체 인스턴스를 추가되게 됩니다.
  4. 대체 인스턴스로 트래픽을 라우팅한 후, 원본 인스턴스는 Target Group에서 Deregister하게 됩니다.
  5. 원본 인스턴스 종료를 설정하셨으므로, 원본 인스턴스는 CodeDeploy의 “4단계: "원본 인스턴스 종료 중“이 완료되는 시점 (5분)이 지나면 삭제되게 됩니다.

이 전체 과정에서 ALB, 그리고 ALB 리스너 설정은 변경되지 않으므로, ALB 리스너의 설정인 “Target Group 간의 트래픽 라우팅 비율”은 동일하게 유지됩니다. 또한, 첨부해주신 ALB 리소스 맵 이미지에 나타나는 인스턴스 한 개는 대체 인스턴스로 추정됩니다.

배포 그룹에서 선택하신 Target Group 모두에 대체 인스턴스가 등록된 것은 “로드 밸런서 유형”에 두 개의 Target Group 모두를 선택하셨기 때문인 것으로 보입니다. [2]에 따르면, “각 대체 인스턴스는 선택한 모든 Classic Load Balancer 및 Target Group에 등록됩니다” 라고 나옵니다. 즉, 여기서 선택하는 Target Group은 “대체 인스턴스를 등록할 Target Group”이며, Blue/Green에 대응되는 각 Target Group을 선택하는 것이 아닙니다.

설명해주신 환경과 동일한 환경으로 실제로 재현해본 결과, Auto-Scaling 그룹과 새로운 대체 인스턴스가 새롭게 만들어지고, ALB와 리스너 설정은 동일하게 유지되는 것이 확인됩니다. 이후, 대체 인스턴스가 두 Target Group에 모두 등록되고, 원본 인스턴스의 트래픽을 차단, Deregister 하는 과정이 ALB 콘솔의 리소스 맵에서 정상적으로 확인되며, 5분 후 인스턴스가 삭제되는 것이 EC2 콘솔에서 확인됩니다.

정리하자면, 설명해주신 CodeDeploy의 현상은 기능 상 정상적인 현상이며, CodeDeploy는 배포그룹에 등록하신 Target Group 모두에 인스턴스를 추가하기에 두 Target Group에 대체 인스턴스 하나가 추가되었고, CodeDeploy 배포와 관련이 없는 “Target Group 간 트래픽 라우팅 비율” 설정은 유지된 것으로 추정됩니다.

답변이 도움이 되셨길 바라며, 추가적으로 궁금하신 사항이 있으시면 편하게 댓글 남겨주시면 도와드리겠습니다.

감사합니다.

참고링크: [1] https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-groups-create-blue-green.html [2] https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/applications-create-blue-green.html

답변함 6달 전
-2

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

현재 상황 분석: 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

답변함 일 년 전

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

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