Backend/기타

SSH 포트 포워딩으로 컨테이너에서 실행되는 서버를 외부와 연결하기

sangwonYoon 2023. 7. 16. 22:14

현재 진행중인 법률 상담 챗봇 프로젝트에서 서버를 구성하는데 가장 큰 문제는 제공받은 V100 서버가 컨테이너에서 실행된다는 점이었다. ssh 연결을 담당하는 22번 포트만 외부에 열려있었기 있었기 때문에 FastAPI에서 8000번 포트를 열어 외부의 API 요청을 받는 것은 불가능해 보였다. 하지만, 23GB 크기의 LLM을 소화할 수 있는 VRAM을 가진 인스턴스를 클라우드에서 빌리기에는 금전적으로 너무 부담이었기 때문에 V100 서버를 반드시 활용해야만 했다. 

그러던 중, ssh 포트 포워딩에 대해 알게 되었고, 이를 활용해 문제를 해결했다.

ssh 포트 포워딩이란?

 

SSH 포트 포워딩

서버에서 FastAPI로 구현한 모델 추론 API를 테스트하다가 신기한 현상을 겪었다. 원격 서버와 로컬은 VSCode의 Remote - SSH라는 익스텐션을 활용해 ssh 연결을 한 상태였다. 이 상태에서 평범하게 uvicorn

sangwonyoon.tistory.com

 

V100 서버와 ssh 연결을 하기 위해 AWS의 EC2 인스턴스를 사용했다. 
먼저 ~/.ssh/config 파일을 아래와 같이 구성했다.

# Host <SSH 연결에 사용할 호스트 이름>
#   HostName <V100 서버의 IP 주소>
#   IdentityFile <SSH 연결 시 사용할 키의 위치>
#   User <유저의 이름>
#   Port <연결할 서버의 포트 번호>

Host 118.67.143.21
  HostName 118.67.143.21
  IdentityFile /Users/sangwon/Downloads/v100_key
  User root
  Port 2240

 

그 다음, 아래 명령어를 통해 ssh 포트 포워딩을 활성화했다.

# ssh -L <로컬에서 사용할 포트>:<최종적으로 접근할 곳> <호스트 이름>
ssh -L 8000:127.0.0.1:8000 118.67.143.21

 

현재 상황을 그림으로 나타내면 아래와 같다.

 

이제, 외부에서 API 요청을 받기 위해 EC2 인스턴스 보안 그룹(방화벽과 같은 개념이다.)의 인바운드 규칙에서 8000번 포트를 모든 트래픽에 대해 허용으로 변경했다.

 

그러나, 내 예상과 달리 외부에서 EC2 인스턴스의 8000번 포트와 연결할 수 없었다.

 

그 이유를 찾기 위해 EC2 인스턴스에서 lsof 명령어를 통해 8000번 포트가 어떤 형식으로 열려 있는지 확인했다.

ubuntu@ip-172-31-44-233:~$ lsof -i TCP:8000
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     11164 ubuntu    4u  IPv6 105874      0t0  TCP ip6-localhost:8000 (LISTEN)
ssh     11164 ubuntu    5u  IPv4 105875      0t0  TCP localhost:8000 (LISTEN)

NAME 열에서 확인할 수 있듯이, 8000번 포트는 내부로 열려 있기 때문에 외부에서 직접적으로 접근할 수 없다고 결론 내렸다.

 

이 문제를 해결하기 위해 두가지 방법을 생각했다.

첫번째 방법은 EC2 인스턴스에 웹 서버를 두는 방법이다. 그러나 이 방법은 추후 웹 서버의 요청을 여러 모델 추론 서버로 분산하는 로드 밸런싱이 불가능하기 때문에 두번째 방법을 사용하기로 했다.

 

두번째 방법은 EC2 인스턴스에 웹 서버의 요청을 그대로 전달하는 라우터를 두는 방법이다. 이 방법을 사용하면, 웹 서버와 모델 추론 서버간의 상호 의존성을 낮출 수 있기 때문에 더 이상적인 방법이라고 생각했다.

최종적으로 채택한 아키텍쳐

현재 모델 추론 서버가 하나의 요청을 처리하는데 약 40초의 시간이 걸리기 때문에(LLM을 이용해 문장을 생성하기 때문에 오래 걸린다.) 팀원들의 서버를 이용해 요청을 처리할 수 있도록 로드 밸런싱을 구축하는 것이 반드시 필요하다. 다음 포스팅에서는 로드 밸런싱을 구축하는 내용을 적어보도록 하겠다.

 

(잘못된 내용을 지적해주시거나 내용에 관한 피드백은 언제나 환영입니다!)