[AWS] TCP connection 불안정 해결 과정

Singsoong·2023년 7월 12일
0

AWS

목록 보기
13/14
post-thumbnail

📌 배경

  • TCP 통신으로 데이터를 받는 TCP 서버가 있음
  • 로컬(개발) 환경에서는 TCP connection을 맺고, 다시 retry하여 맺는데 문제가 없었음
  • AWS에 배포한 상황에서 TCP connection이 성공할 때가 있고, 또 실패할 경우가 있었음
  • 분명 TCP Client는 retry하여 연결 요청을 하는데 TCP server에서 connection 감지도 못하는 것을 보아 앞단에서 트래픽을 쳐내는 것 같다는 느낌을 받음

📌 구성

  • AWS에 배포된 TCP 서버는 대략 아래와 같은 구성으로 되어 있음

    TCP 트래픽 → Route 53 → IGW → NLB → EC2 인스턴스

📌 살펴볼 것

  • 이 상황에서 살펴볼 수 있는 것은 여러가지가 있었다.

ⓛ 보안그룹 확인

  • EC2에 설정된 보안그룹을 확인하는 것
  • 하지만, 보안그룹에 의해 막혀 있다면 애초에 connection 자체가 되지 않아야 함

② NACL 확인

  • 서브넷 수준에서 트래픽을 제어하는 NACL을 확인
  • 이 부분도 막혀있다면, 애초에 connection이 되지 않아야 함

③ EC2 리소스 제한

  • EC2의 리소스(CPU, 메모리 등)가 부족한 경우 연결을 처리할 수 없을 수 있다.
  • 하지만 리소스가 부족할 일이 없는게 connection 1개에 대한 테스트를 진행중이었기 때문

④ NLB (네트워크 로드밸런서)

  • connection이 되었다가 안되었다가 하는 점과 로컬 환경에서는 되는데 클라우드 상에서 되지 않는 점을 보아 NLB를 제일 의심하게 됨

📌 NLB 살펴보기

① NLB와 연결된 Subnet 확인

  • TCP 트래픽은 NLB를 거치게 되는데 connection 성공 여부가 불규칙적이라면 먼저 NLB가 연결된 Subnet을 확인할 수 있음
  • 아예 connection이 되지 않으면 보안그룹, NACL과 같은 다른 설정들을 확인해봐야겠지만, 연결이 성공할 때가 있고, 실패할 때가 있다면 NLB에 연결된 Subnet이 하나는 퍼블릭 서브넷이고 하나는 프라이빗 서브넷으로 설정되어 있을 가능성이 높음
  • 연결이 성공했을 때에는 정상적으로 퍼블릭 서브넷을 통해 접속했고, 연결이 실패할 때에는 프라이빗 서브넷을 통해 접속하려다 접속이 불가능해 timeout이 발생했다고 가정한다면, 딱 나의 상황과 들어맞게 됨
  • 따라서 NLB와 연결된 서브넷을 확인하였고, 두 AZ에 각 Public Subnet에 연결되어 있는것을 확인함
  • 각 Subnet은 IGW와 잘 연결되어 있었고 따라서 Public Subnet에 연결되어있음을 확인함
  • 이 방법이 굉장히 유력했지만 나의 상황에서 해결책은 되지 않았음

② NLB > 교차 영역 로드 밸런싱 (해결책)

  • 이 옵션이 나의 상황에서 해결책이 되었음

  • 문제가 되는 NLB를 선택하고 속성탭에서 교차 영역 로드 밸런싱을 on으로 설정하면 됨

  • 교차 영역 로드 밸런싱이 켜진 경우 각 로드 밸런서 노드가 등록된 모든 가용 영역에 있는 등록된 대상 간에 트래픽을 분산

  • 교차 영역 로드 밸런싱이 꺼진 경우 각 로드 밸런서 노드가 해당 가용 영역에 있는 등록된 대상 간에만 트래픽을 분산

  • NLB를 생성할 때 서브넷을 지정하면 해당 서브넷마다 각 네트워크 인터페이스가 생성됨

  • NLB → 네트워크 인터페이스 → 대상 인스턴스(EC2) 로 이루어지는 흐름인데, 교차 영역 로드 밸런싱은 네트워크 인터페이스와 대상의 가용 영역이 다를 경우에도 라우팅을 지원할 수 있게 하는 설정

  • 기본적으로 ALB(어플리케이션 로드밸런서)는 이 옵션이 켜져있지만, NLB(네트워크 로드밸런서)는 이 옵션이 꺼져있는것이 디폴트임

  • 정리하자면, 두 가용영역에 대상 인스턴스(EC2)가 분산되어 있었으나 교차 영역 로드 밸런싱 옵션을 꺼둔 상태라 가용 영역 하나에만 트래픽을 분산 시키다보니, 트래픽이 EC2에 흐를때도 있었고, 흐르지 못해 connection이 되지 못할 때가 있었음

참고 : AWS, 대상 그룹을 위한 교차 영역 로드 밸런싱
https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/disable-cross-zone.html

profile
Frontend Developer

0개의 댓글