[Django] Elastic Beanstalk health check 설정하기

울상냥·2023년 4월 20일
0

배포

목록 보기
18/18

Elastic Beanstalk는 애플리케이션 상태 모니터링을 진행한다.
Health Check인데 자세한 설명은 [AWS] 에서 확인할 수 있다.(https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.healthstatus.html)

Health Check를 통과해야

초록불이 뜬다.

배포시 settings.py에서 DEBUG=FalseALLOWED_HOSTS에 서버의 주소를 추가해준다.

이때 문제가 발생한다. EB는 VPC내부의 EC2의 Private IP로 요청을 보내기 때문에 Django는 400 Bad Request로 응답하여 Health check가 실패하게 된다.

해결하는 몇가지 방법이 있는데


1. ALLOWED_HOSTS = ['*']

모든 호스트를 허용하는 것인데 보안상 좋지않다.

이미 무작위 스캔 공격이 들어오고있다 ㅋㅋㅋㅋ

2. django-ebhealthcheck 설치

pip install django-ebhealthcheck 진행 후

INSTALLED_APPS에 ebhealthcheck를 추가해준다.

INSTALLED_APPS = [

	    'ebhealthcheck.apps.EBHealthCheckConfig',
]

누군가 만들어놓은 라이브러리인데 설치만 하면 간단하게 문제를 해결할 수 있다.

3. ALLOWED_HOSTS에 IP 추가

http://169.254.169.254/latest/meta-data/local-ipv4. 로부터 IP를 가져와 ALLOWED_HOSTS에 추가하는 방법이다.

위의 라이브러리 내부 작동 방식도 IP를 추가하는 방식으로 구현되어있었다.

구현 방식은 조금씩 다르지만
구현 코드는 다른 블로그 참고
또는 django-ebhealthcheck github 등등에서 찾아볼 수 있다.

4. MiddleWare 사용

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.pyMIDDLEWARE에도 추가해 준다.

MIDDLEWARE = [
    'yourdjangoapp.middleware.HealthCheckMiddleware',
    ......
    'django.middleware.common.CommonMiddleware',
    ......
]

구현한 HealthCheckMiddlewareCommonMiddleware 앞에 위치하도록 한다.

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.

지긋지긋한 이놈과 작별할 수 있었다!

profile
안되면 되게하라

0개의 댓글