개발/파이썬
Django ELB ALLOWED HOSTS 에러 수정
seonu._.jang
2020. 6. 20. 15:17
반응형
*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
반응형