개발하는 자몽

[AWS] ELB 생성 본문

Architecture & Tool/AWS

[AWS] ELB 생성

jaamong 2024. 4. 5. 09:35

AWS의 ELB를 이용하여 로드밸런싱을 해보자! 그전에 ACM을 먼저 요청해야 한다.

🔗 2024.04.05 - [Architecture & Tool/AWS] - [AWS] ACM을 이용한 HTTPS 적용

 

 

ELB 생성

🔗  참고

 

AWS EC2 왼쪽 메뉴에서 로드 밸런서를 클릭한다. 아래 화면에서 로드 밸런서 생성을 클릭한다.

create load balancer

 

아래 유형 중에서 `Application Load Balancer 아래의 생성 버튼을 클릭한다.

Select load balancer type

 

로드 밸런서 이름을 입력한다.

Basic configuration

 

네트워크 매핑 영역에서 EC2 인스턴스와 동일한 네트워크를 포함한 2개 이상의 영역을 선택한다. 예를 들어, 현재 사용 중인 인스턴스가 `ap-northeast-2a` 네트워크를 사용하고 있으면 해당 네트워크를 포함하여 선택하면 된다.

network region

 

잘 모르겠다면 모두 선택해도 괜찮다.

Network mapping

 

보안 그룹도 EC2 인스턴스와 동일한 것으로 선택한다. 모르겠다면 EC2의 ID를 클릭하여 보안 탭에서 확인하자. 

instance security group
Security groups

 

리스너 및 라우팅 차례이다. 여기에서 HTTP 80 포트와 HTTPS 443 포트를 설정한다. 우선 아래 화면에서 대상 그룹 생성을 클릭한다. 

Listeners and routing

 

그룹 세부 정보 지정의 기본 구성에서 대상 유형인스턴스로 선택하고, 대상 그룹 이름을 입력한다.

Specify group details - Basic configuration

 

나머지는 그대로 두고, 맨 아래로 스크롤을 내려서 다음을 클릭한다.

 

💡 상태 검사 경로는 로드 밸런서와 연결되어 있는 인스턴스가 살아있는지 정기적으로 확인하는 health check를 위한 경로이다. 만일 접속이 불가능한 경우 해당 인스턴스를 불능상태로 인식하고 트래픽을 보내지 않는다.

 

 

아래 화면에서 로드 밸런서를 적용할 인스턴스를 선택하고, 아래에 보류 중인 것으로 포함을 클릭한다. 

Register targets

 

그다음 대상 그룹 생성을 클릭한다. 

Register targets - create target group

 

생성이 완료되면 아래와 같은 화면이 나온다.

 

다시 리스너 및 라우팅으로 돌아와서 리스너 설정을 진행한다. 리스너 태그 추가를 클릭하여 HTTP, HTTPS 모두 생성하며, 모두 HTTP 대상 그룹을 선택한다. 생성한 대상 그룹이 보이지 않으면 옆에 새로 고침 버튼을 클릭하자. 

Listners and routing

 

보안 리스너 설정에서 EC2 인스턴스에 적용한 ACM을 선택한다.

Secure listener settings

 

이후 로드 밸런서 생성을 클릭한다.

create load balancer

 

이후 아래 화면에서 아래로 스크롤하고, 리스너 및 규칙에서 `HTTPS`를 선택합니다. 선택한 상태에서 리스너 관리 > SNI용 SSL 인증서 추가를 클릭합니다.

Listeners and rules

 

이동된 화면에서 이전에 발급받은 ACM을 선택하고 아래에 보류 중인 것으로 포함을 클릭한다.

Add certificate to listener

 

그리고 보류 중인 인증서 추가를 클릭한다.

 

 

번외. 

나중에 필요한 리스너나 규칙을 추가하려면 로드 밸런서 창으로 돌아와 리스너 및 규칙에서 리스너 추가를 클릭하면 된다.

 

 

로드 밸런서 대상 그룹 unhealthy 이슈

🔗 참고

 

✅ Health Check URL

HTTPS 적용이 안 돼서 어떤 문제인지 확인해 봤더니, 등록한 모든 대상 그룹의 상태가 `Unhealthy`로 나와 있었다!

 

생각해 보니 대상 그룹의 상태 확인을 위한 경로를 `root url(/)`로만 지정해 놓은 상태였다. 그래서 헬스 체크를 위한 코드를 추가하고 상태 확인 경로를 수정했다.

# views.py
@api_view(['GET'])
def health_check(request):
    """
    헬스 체크용 함수 -> 별도의 로직 필요없음
    """
    return Response(status.HTTP_200_OK)
    
# urls.py
urlpatterns = [
    ...
    path('health-check', views.health_check),
]

 

그리고 Django를 사용한 개발이므로 prod.py(==settings.py)의 `ALLOWED_HOSTS`에 EC2 인스턴스의 프라이빗 IPv4 주소를 추가했다. 

...
ALLOWED_HOSTS = [
    # 여기서는 실제 주소 대신 문자열로 대체
    
    "ALLOWED_HOST_IP_PUB", 
    "ALLOWED_HOST_IP_PRI",  # here
    "ALLOWED_HOST_DOMAIN",
]
...

 

이후 상태가 `Healthy`로 변한 것을 확인할 수 있다!

 

 

 

 

Comments