Elastic Beanstalk는 애플리케이션 상태 모니터링을 진행한다.
Health Check인데 자세한 설명은 [AWS] 에서 확인할 수 있다.(https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.healthstatus.html)
Health Check를 통과해야
초록불이 뜬다.
배포시 settings.py에서 DEBUG=False 와 ALLOWED_HOSTS에 서버의 주소를 추가해준다.
이때 문제가 발생한다. EB는 VPC내부의 EC2의 Private IP로 요청을 보내기 때문에 Django는 400 Bad Request로 응답하여 Health check가 실패하게 된다.
해결하는 몇가지 방법이 있는데
모든 호스트를 허용하는 것인데 보안상 좋지않다.
이미 무작위 스캔 공격이 들어오고있다 ㅋㅋㅋㅋ
pip install django-ebhealthcheck 진행 후
INSTALLED_APPS에 ebhealthcheck를 추가해준다.
INSTALLED_APPS = [
'ebhealthcheck.apps.EBHealthCheckConfig',
]
누군가 만들어놓은 라이브러리인데 설치만 하면 간단하게 문제를 해결할 수 있다.
http://169.254.169.254/latest/meta-data/local-ipv4. 로부터 IP를 가져와 ALLOWED_HOSTS에 추가하는 방법이다.
위의 라이브러리 내부 작동 방식도 IP를 추가하는 방식으로 구현되어있었다.
구현 방식은 조금씩 다르지만
구현 코드는 다른 블로그 참고
또는 django-ebhealthcheck github 등등에서 찾아볼 수 있다.
health check를 요청하는 url에 대한 미들웨어를 구현하는 방식이다.
from django.http import HttpResponse
class HealthCheckMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.path == '/health':
return HttpResponse('ok')
return self.get_response(request)
settings.py 의 MIDDLEWARE에도 추가해 준다.
MIDDLEWARE = [
'yourdjangoapp.middleware.HealthCheckMiddleware',
......
'django.middleware.common.CommonMiddleware',
......
]
구현한 HealthCheckMiddleware가 CommonMiddleware 앞에 위치하도록 한다.
request.path 를 /health 로 작성하였는데
구성 > 로드밸런서 > 프로세스 > 상태검사 경로를request.path와 같이 수정해주거나 원하는 경로로 수정해준다.
default 로 / 로 설정되어있다.
ALLOWED_HOSTS에 IP를 추가하는 방식보단 미들웨어를 구현하는 방식이 조금 더 간단해 보인다.
설정을 마치고 나니
Environment health has transitioned from Severe to Degraded. 100.0 % of the requests are erroring with HTTP 4xx.
![]()
지긋지긋한 이놈과 작별할 수 있었다!