[AWS] ELB: 다운타임 없이 ECS Service & TargetGroup 교체하기
서비스를 운영하다보면, 기존 로드밸런서에 연결된 ECS Service를 다른 것으로 교체하고 싶을 수 있다.
최종 엔드포인트는 결국 로드밸런서고, 하위호환을 유지하면서 변경을 시도하는 가장 간단한 방법이기 때문이다.
근데 ECS + ELB에서 타겟그룹과 서비스를 교체하는 것은 꽤 까다로울 수 있다.
이게 되긴 되는데, 엄격한 제한사항이 몇개 있어서 손이 많이 간다.
제한사항
일단 타겟그룹과 로드밸런서는 1:1 관계를 가져야만 한다.
타겟그룹은 1개의 로드밸런서에만 종속될 수 있다. 이게 좀 은근히 피곤한 부분이다.
그런데 타겟그룹은 로드밸런서가 있어야먄 타겟을 등록하기 시작한다.
ECS Service 단위에서 Fargate 노드가 잘 뜨더라도, 로드밸런서가 없으면 타겟 등록은 안된다.
그래서 무작정 그냥 등록해서 바꿔버리면, Target Group에 타겟이 없는 채로 로드밸런서에 연결되어서, 타겟이 로드되기 전까지는 다운타임이 발생한다.
방법
귀찮긴 해도 다운타임 없이 교체하는 것이 되긴 된다.
먼저, 로드밸런서의 리스너에 가중치를 0으로 등록한다.
당장 통신이 이뤄지지 않더라도, 이렇게라도 해야 로드밸런서와 타겟그룹이 연결이 된다.
그럼 이제부터는 ECS 서비스에서도 이를 인식하고 등록할 수 있다.
새로 교체할 ECS 서비스에 들어가서, 방금 그 로드밸런서와 타겟그룹을 연결해준다.
그리고 좀 기다리면
이제 다시 ECS Service에서 재배포를 트리거하고, 타겟에 인스턴스가 등록이 될 것이다.
Healthy 인스턴스들이 충분한 상태가 되면 그때 가중치를 역전해서 활성화하면 끝이다.
기존 서버의 타겟그룹은 롤백을 염두에 둔다면 그냥 가중치를 0인채로 둬도 되고, 삭제해버려도 된다.
이게 다다.