AWS health check
2020-10-19
AWS의 ALB를 설정하면서 대상그룹(Target group)에 node.js로 웹서비스를 하는 EC2를 연결했다. 그런데 서비스가 정상 적으로 동작하고 있음에도 대상 그룹의 상태가 unhealthy로 표시되는 문제가 있었다.
1. 문제의 원인
이 서비스는 Root URL로 접근하는 경우 세션의 유무를 가지고, 유효한 세션이 살아있으면 메인페이지로 아닌경우 로그인페이지로 이동하도록 작성되어 있었다.
AWS 대상그룹의 기본 상태체크 방식은 루트 URL에 HTTP메소드로 요청해서 응답이 정상적으로 도착하는지를 확인한다. 이 때 확인 하는 값은 다음과 같다.
- HTTP Header의 Content-Type이
text/plain
인지 - HTTP 응답코드가 200 인지
그런데 루트URL접속시 다른페이지로 이동하는 경우 HTTP 상태코드가 302반환하게 되서 상태체크 조건을 만족하지 못하는 문제가 있다.
2. 해결 방법
이 문제를 해결하는 방법은 두 가지가 있다.
- 대상그룹의 상태체크 설정의 Success code 값에 302 를 추가 해 준다.
- 상태체크를 위한 전용 API를 작성하고, 대상 그룹의 Path값에 추가 해 준다.
두 가지 방법 중 첫번째 방법은 메인페이지가 바뀌는 경우 유연하게 대응 할 수 없을 것 같다. 그리고 access log를 남기는 경우에도, 정상젃으로 메인페이지에 접속하는 경우와 상태체크용 heartbeat가 섞이게 되어 로그 분석시 불편한 상황이 예상된다.
따라서 아래와 같이 /healthCheck
라는 GET 요청에 대해 응답하는 기능을 node.js 애플리케이션에 추가하고 대상그룹을 등록하는 것으로 해결했다.
app.get('/healthCheck', function(req, res)
{
res.writeHead(200, { "Content-Type": "text/html" });
res.write("Health Check Page");
res.end();
});