본문 바로가기

개발/파이썬

Django ELB ALLOWED HOSTS 에러 수정

반응형

*AWS Elastic Load Balancer를 사용해서 Django 애플리케이션에 로드밸런싱을 하면 Health Check가 계속 실패하고, 로그를 확인해보면 아래와 같은 문제가 생기는 경우가 있습니다.

Invalid HTTP_HOST header: <HOST>. You may need add <HOST> to ALLOWED_HOSTS

Health Check를 시도하는 IP주소가 Django Settings 중의 하나인 ALLOWED_HOSTS에 등록되어 있지 않아서 발생하는 문제이다. ALLOWED_HOSTS = ["*"]로 해결할 수 있지만 이는 보안상 좋지 않습니다. 해당 IP를 ALLOWED_HOSTS에 등록하는 것도 해결책은 아닙니다. ELB의 Private IP가 계속 바뀌기 때문입니다.

이를 해결하는 솔루션은 두 가지가 있습니다. 첫 번째 방법은 가능한 모든 private IP를 ALLOWED_HOSTS에 추가하는 것입니다. 하지만 이는 굉장히 많기 때문에 프로그래밍적으로 IP를 생성해서 추가해야 할 듯합니다. 두 번째 방법은 아래와 같은 커스텀 미들웨어를 상단에 추가하는 것입니다. (Django Settings에는 MIDDLEWARE가 있는데 요청이 오면 등록된 MIDDLEWARE들을 거쳐서 요청을 받거나 응답을 해주게 됩니다.)

# project(프로젝트 폴더명)/middleware.py

from django.http import HttpResponse

class HealthCheckMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.path == "/ping":
            return HttpResponse("pong")
        response = self.get_response(request)
        return response
# settings.py
MIDDLEWARE = [
    "project.middleware.HealthCheckMiddleware",
    # ... 생략 ...
]

이렇게 하면 ALLOWED_HOSTS를 검사하기 이전에 /ping으로 온 요청에 대해서 응답을 해줄 수 있습니다.

참고자료

Handling AWS-ELB terminating a healthy django instance when accessed from an invalid hostname

반응형