Environment health has transitioned from Ok to Severe. ELB processes are not healthy on all instances. ELB health is failing or not available for all instances.
배포 방법 중 가장? 간단한 AWS EB(Elastic Beanstalk).
하지만... 계속 unhealthy 가 떠서 마음이 안 좋다..
eb-cli로 하다가 AWS 페이지에서 하다가 설정값 계속 변경해보고 만들고 죽이고 만들고 죽이고 무한 반복.
접속 문제도 없고 어느 환경과 다를 것 없이 정상 작동하지만 ELB(Elastic Load Balancing) 헬스 체크만 했다하면 상태는 심각(Severe)...
*** Elastic Beanstalk는 인스턴스 상태 변경을 사용하여 환경 상태를 평가하여 환경의 인스턴스 수와 식별된 문제에 따라 확인(OK) 경고(Warning) 성능 저하됨(Degraded) 심각(Severe)으로 환경 상태를 표시한다.
이는 Django에서 많이 보이는 이슈인듯하다.
로드밸러서가 무엇인지, 인스턴스 헬스 체크에 대해서, allowed hosts 대해 정리해 보자.
등장배경
인터넷 사용자가 폭발적으로 증가하면서 서버 업무 처리량이 과다하게 증가했다. 이에 인터넷 서버, 방화벽, 캐시 서버등 장치간 트래픽 균형 조절과 라우팅 및 트래픽 관리를 위해 로드밸런서가 등장한다.
무엇?
로드밸런서는 여러 서버에 클라이언트 트래픽을 분산시켜 부하를 줄이고 시스템 성능 및 안정성을 향상시키는 기술이다.
역할
로드밸런서는 마치 교통 체증을 완화하기 위해 차량을 여러 도로로 분산시키는 교통 관제원과 같은 역할을 한다.
기능
Health Check
(이번에 문제가 됐던..) AWS ELB가 서버의 상태를 주기적으로 확인하여 트래픽을 분산하는 데 사용하는 기능이다. 헬스 체크 결과에 따라 서버는 Healthy 또는 Unhealthy 상태로 표시 된다.
Tunneling
클라이언트와 서버 간의 트래픽을 암호화하여 안전하게 전송하는 기능. Tunneling을 사용하면 클라이언트와 서버는 서로 직접 연결되지 않고 AWS ELB를 통해 연결된다. 클라이언트와 서버간의 트래픽을 암호화하여 보안을 강화한다.
NAT(Network Address Translation)
클라이언트 IP 주소를 서버 IP 주소로 변환하는 기능. NAT를 사용하면 서버는 클라이언트 IP 주소를 직접 알 수 없으므로 보안이 향상된다. 또한 부족한 공인 IP주소를 효율적으로 사용 가능.
DSR(Direct Server Routing)
server → client 의 경우, 목적지를 클라이언트로 설정한 다음 네트워크 장비나 로드밸런서를 거치지 않고 바로 클라이언트를 찾아가는 방식으로 로드밸런서의 부하를 줄일 수 있다.
배포가 잘 되었는지 또는 지금도 잘 운영되고 있는지.
loadbalancer의 tagetgroup(대상그룹)의 health check 기능을 통해 확인한다.
HTTP 상태코드
TCP 서비스 포트
콘텐츠 확인(문자열 확인)
등등.. 여러 방법들이 있다.
Django 기반 프로젝트에서 로드밸러서 헬스체크 unhealthy 야기하는 핵심.
ALLOWED_HOSTS = []
# 보통 설정값
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# 모든 도메인 허용하고 싶다면
ALLOWED_HOSTS = ['*']
Django에서 settings.py/ ALLOWED_HOSTS
값은
허용 가능한 호스트 운영 서버에 배포하여, 서비스할 때 호스트로 사용 가능한 호스트 또는 도메인 목록이다. ALLOWED_HOSTS 목록에 없는 도메인에서 요청을 보내면 Bad Request (400)
를 반환한다. CSRF(Cross-site request forgery)
와 HTTP 웹 서버 헤더 공격
을 막기 위한 조치이나 이 기능이 바로 unhealthy가 뜨게 하는 원인이다.
로드밸러서에서 헬스 체크하기 위해 보내는 IP 주소는 매번 변동된다.
그러니 ALLOWED_HOSTS 에 지정된 값이 없어 400을 반환하고 상태코드가 이러니 로드밸러서 헬스 체크 결과가 unhealthy 가 뜨고 상태도 심각(Severe)으로 변경되는 것!
Django 기반 프로젝트에서 이를 해결하기 위해서 아래 두가지 방법을 시도해 볼 수 있다.
더 자세한 내용은 아래 참고 !