반응형
*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
반응형
'개발 > 파이썬' 카테고리의 다른 글
자주쓰는 명령어로 배우는 Pandas #1 : Pandas와 데이터 살펴보기 (0) | 2020.10.24 |
---|---|
Django에서 Replica DB가 있을 때의 테스트 코드 문제 해결하기 (0) | 2020.08.09 |
프로그래밍 폴더 구조에 대한 생각정리 (4) | 2020.06.18 |
[TIL] JWT 로그인 구현과 보안 (0) | 2020.06.10 |
[TIL] Namespace, Scope, Claim이란 (feat. oAuth) (0) | 2020.06.07 |