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.
지긋지긋한 이놈과 작별할 수 있었다!