[AWS] CodeDeploy 심화 - ALB Target Group 지정하기
IT/AWS

[AWS] CodeDeploy 심화 - ALB Target Group 지정하기

반응형

Intro

오늘은 AWS Code Deploy에 ALB Target Group을 지정할때 발생했던 이슈에 대해서 공유 해보고자 합니다.

사건의 전말

AWS Code Deploy에 ALB target Group을 지정하면 소스가 배포되기 전에 Traffic 컨트롤이 가능합니다. 그 과정은 아래와 같습니다.

  • CodeDeploy배포가 시작되면 ALB에 Traffic을 사전에 차단해줌
  • 차단하기 전에 받은 트래픽을 처리하기 위해 잠시 dranning시간을 줌
  • 그 이후 Target Group에 있는 EC2 instance 를deregister 하고 소스코드 업데이트 시작
  • 소스코드 업데이트 완료 된 뒤 다시 Target Group에 register

이런 과정을 거치게 됩니다.

여기서 어플리케이션 특성상 하나의 프로세스가 여러개의 포트를 사용할 수 있습니다. 이렇게 될 경우 아래와 같이 같은 EC2 instance 대상에 ALB의 Target Group이 여러개 생성될 수 있다는 이야기 입니다.

그림1.

근데 여기서 충격적인 사실은 Code Deploy는 ALB Target Group을 1개만 등록이 가능하다는 점입니다.

즉, 다수의 TargetGroup을 등록 할 수 없기 때문에 2개의 포트를 사용하는 어플리케이션 프로세스는 다수의 트래픽 제어를 할 수 없게 됩니다.

예를들어 위 그림에서 TargetGroup-8080에 배포를 하게 되면 EC2를 타겟에서 제외하고 소스 코드를 반영하고 프로세스를 다시 시작하도록 할텐데 그 경우 해당 프로세스가 8080과 4040모두 연결을 끊어 버리게 됩니다.

이때, TargetGroup-4040에도 EC2를 타겟에서 제외하게 되면 문제가 없는데 DeploymentGroup에 1개 밖에 등록이되지 않기 때문에 4040으로 들어오고 있는 트래픽이 순간적으로 끊길 수 있게 되는 현상이 발생합니다.

해결책

구글링을 해보니 역시나 우리의 미국 친구들은 어찌나 머리가 좋은지 4년전에 이미 같은 고민을 하고 있었네요. (구글링 잘하려면 원하는 키워드를 찾는 연습이 필요합니다)

물론 저도 검색하기 전에 가능한 case를 도출해보았는데 같은 정확히 같은 3가지 case를 도출 했었습니다.

  • 어플리케이션 프로세스를 포트별로 나눈뒤에 각각을 배포한다.

그림2.

  • 어플리케이션이 사용하는 포트별로 인스턴스를 나누어서 각각 배포한다.

그림3.

  • 배포시 다른한쪽 target group 대상을 인위적으로 제거, 추가 하는 스크립트를 생성하여 배포(안정성 보장이 안돼므로 운영에서 권장 하지 않음)

**참고 URL

https://stackoverflow.com/questions/52696207/how-to-deploy-code-using-codedeploy-with-autoscalinggroup-containing-multiple-ta

사실 aws를 도쿄리전때 부터 사용하던 사람으로서 이 사실을 처음 알게 된 것 자체가 부끄럽기도했고 역시나 usecase는 끝도 없이 다양하구나를 다시한번 세삼 느끼게 되었습니다.

혹시 궁금한점이나 공유하고 싶은내용 있으시면 댓글 부탁드립니다. 감사합니다.

반응형