Django, AWS-ELB error

HJ Koo·2024년 4월 14일
0

ERROR

목록 보기
5/8
post-thumbnail

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 대해 정리해 보자.

로드밸런서(Load Balancer)

등장배경
인터넷 사용자가 폭발적으로 증가하면서 서버 업무 처리량이 과다하게 증가했다. 이에 인터넷 서버, 방화벽, 캐시 서버등 장치간 트래픽 균형 조절과 라우팅 및 트래픽 관리를 위해 로드밸런서가 등장한다.

무엇?
로드밸런서는 여러 서버에 클라이언트 트래픽을 분산시켜 부하를 줄이고 시스템 성능 및 안정성을 향상시키는 기술이다.

역할
로드밸런서는 마치 교통 체증을 완화하기 위해 차량을 여러 도로로 분산시키는 교통 관제원과 같은 역할을 한다.

  • 트래픽 분산: 클라이언트 요청을 여러 서버에 골고루 분배하여 특정 서버의 과부하를 방지.
  • 고가용성: 서버 장애 발생 시 다른 서버로 트래픽을 자동으로 전환하여 서비스 중단 없이 운영을 지속.
  • 확장성: 필요에 따라 서버를 추가하거나 제거하여 시스템 용량을 쉽게 확장할 수 있다.
  • 보안 강화: DDoS 공격과 같은 악성 트래픽을 감지하고 차단하여 시스템을 보호.
  • 부가 기능: 서버 상태 모니터링, 로그 분석, 자동 장애 전환 등의 부가 기능을 제공.

기능

  • 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 상태코드
    로드밸러서가 서버로 3방향 핸드셰이크를 거치고 정상적인 200 OK 응답하는지 체크
  • TCP 서비스 포트
    로드밸런서에 설정된 서비스 포트를 확인하는 방법
  • 콘텐츠 확인(문자열 확인)
    로드밸러서에서 서버로 콘텐츠를 요청하고 응답받은 내용을 확인하는 방법

등등.. 여러 방법들이 있다.

allowed hosts

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 기반 프로젝트에서 이를 해결하기 위해서 아래 두가지 방법을 시도해 볼 수 있다.

  • 모든 개인 IP 범위의 모든 IP를 Django 프로젝트의 ALLOWED_HOSTS 설정에 추가
  • 특정 URL이 주어지면 간단한 200 응답을 반환하는 간단한 미들웨어 추가

더 자세한 내용은 아래 참고 !


참고

profile
날마다 꾸준히 성장하는 Software Engineer

0개의 댓글