Web Service 를 운영하다 보면 서버 장애 또는 점검 시 ‘공사중(작업중)’ 를 보여줘야 하는 경우가 있다. 일반적으로 Apache 나 Nginx 에서 특정 Error Code 에 Rewrite Rules 를 추가해 특정 페이지로 연결하는 형태가 주로 사용됐다.
ALB는 Classic ELB 와 달리 Application Layer 에서 제어하기 때문에 다양한 응용프로그램 사례에 직접 대응이 가능한데, 이걸 사용해 보자. 단순히 오류 뿐만 아니라, API Response 로도 사용 가능하다.
ALB Static Page 로 특정 페이지 표출하기
처음부터 이 기능이 있었던건 아니다. 2018년 7월 AWS 는 ALB 에서 ‘리디렉션 및 정적 응답’을 지원하기 시작했다.
원리는 간단하다. 리스너(Listener) 에 규칙(Rule)을 추가해 제어하는 형식으로, HTTP 오류 응답 코드와 사용자 지정 오류 페이지를 설정하는 방식이다. 기본적으로 ALB 는 Target Group에 등록된 인스턴스(리소스)가 동작 중이지 않을 경우 503 오류를 반환한다.
이 포스트는 HTTP 오류코드 ‘503’이 발생하는 경우 사용자 지정 오류 메시지를 화면에 보여주고자 한다. 리스너를 추가하고, 코드는 503으로, 콘텐츠 유형은 text/html 로 만든다음 코드를 작성하면 된다.
이미지나 CSS 를 추가하고 싶다면 S3 의 콘텐츠를 삽입하면 된다. 아래 예제는 Javascript 로 5초 후 특정 페이지로 이동하라는 예제다.
Content-Type 으로 text, html, json 등 다양한 형태로 사용할 수 있다. javascript / css 가 왜 있냐고? ServerLess로 서비스 구현 시 사용할 수 있기 때문. 일반적으로 text/html 과 application/json 이 가장 많이 사용되지 않을까 짐작해 본다. (솔찍히 나도 application/json 은 사용해 본 적이 없다.)
규칙 추가
앞선 방법으로 코드를 추가하면 서비스가 정상화 되었을 때 연결되지 않기 때문에 매번 리스너 정보를 삭제 및 추가(수정)해야 한다. 얼마나 비효율적인가.
ALB 규칙은 복수개를 추가할 수 있다. 그리고, 우선순위에 따라 동작 순서가 달라진다. 따라서 운영시 서비스가 정상일 때의 우선순위가 앞서야 하고, 오류 발생 시 메시지를 출력해야 한다.
이번엔 모든 요청에서, 503이 반환되는 경우 오류라고 알려주자.
이렇게 추가된 최종적인 형태는 다음과 같다.
응답 순서 바꾸기
적절한 응답으로 동작하지 않거나, 동작 상태가 명확한 경우 ALB 에 판단을 맡기는 것 보다 우선 순위를 변경하자. Reorder 아이콘을 클릭한다음, 이동할 규칙을 선택하고 위 또는 아래로 이동하면 된다.
AWS CLI 명령어로 제어하는 경우 다음 한줄로 제어할 수 있다.
aws elbv2 set-rule-priorities --rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:2274724417:listener/app/mtlabs-tokyo-pub-chatbotes-alb/5455e69f8fe156/235733d8a20c44,Priority=1
결론
이 방법이 모든 경우에 최선의 선택이라 말하기 어렵다. 하지만, 서비스 운영 중 긴급하게 작업해야 하거나, 웹 서버 까지 어떠한 작업을 해야 한다면, 이 방법을 사용하는걸 추천한다. 모든 서비스가 중단되어도 사용자에게는 오류 메시지를 전달 할 수 있기 때문.
특히, CLI 를 통해 간단히 순서를 바꿀 수 있기 때문에 신속한 대응이 가능하다는건 업무의 효율을 크게 향상 시킬 수 밖에 없다.