코드로 우주평화

네이버 클라우드 플랫폼(NCP)으로 Python 서버 배포하기 본문

나는 이렇게 성장한다/활동

네이버 클라우드 플랫폼(NCP)으로 Python 서버 배포하기

daco2020 2023. 12. 9. 15:42

 

이 글은 FastAPI 로 구현된 Python 서버를 네이버 클라우드 플랫폼(이하 NCP)으로 마이그레이션 한 후기입니다.

 


들어가기 전에

저는 현재 글또 9기 운영진으로 지난 8 기서부터 또봇이라고 하는 슬랙 앱(봇)을 만들어 운영하고 있습니다.

 

처음 또봇을 클라우드 환경에서 배포할 때에는 `클라우드 타입`이라는 호스팅 서비스를 이용했는데요. 클라우드 타입은 클릭 몇 번으로 아주 간편하게 서버 배포를 해주는 호스팅 서비스입니다. 게다가 무료죠(였죠)

 

약 1년 동안 잘 사용하던 클라우드 타입이 이번 12월 부터 유료화를 도입했고, 기존 무료 호스팅은 하루 1번 강제 종료라는,, 아주 크리티컬 한 제약이 추가되었습니다. ㅠㅠ

 

저는 서버가 강제종료되기 전에 서둘러 다른 클라우드 서비스를 찾기 시작했습니다. 그 중에는 역시 가장 대중적인 AWS, 그리고 한국 클라우드의 자존심? NCP, 무료플랜 중 탑이라는 오라클 등이 있었습니다.

 

 

저는 이중에 NCP 를 선택했습니다. NCP를 선택한 이유요? 저한테 무료 크레딧이 있거등요 :) 

 

어느 업체든 무료플랜으로 사용할 수 있었지만 이왕이면 이것저것 공부도 해볼 겸 크레딧이 넉넉한 NCP를 선택했습니다. 그리고 NCP는 국내 서비스이니 설명이나 문서도 잘 되어있지 않을까 기대도 있었습니다. (그리고 이것은 사실이었습니다!)

 

 

자 그럼 본격적으로 배포 과정을 살펴볼까요?

 


 

 

NCP Server 만들기

우선 검색창에 NCP 를 검색하거나 아래 링크로 접속해 주세요.

https://www.ncloud.com/

 

대한민국 사람이라면 네이버 계정 하나쯤 있잖아요? ㅎㅎ 로그인하시고 콘솔 버튼을 눌러줍니다.

 


콘솔에서 플랫폼은 Classic을 선택하시고 Services 메뉴를 클릭, Compute의 Server로 들어갑니다. (Classic과 VPC의 차이를 알고 싶다면 해당 문서에서 확인해 주세요)

서버생성을 누르고, 이미지 타입은 OS, Ubuntu를 선택해 줍니다. 

Micro를 선택한다면 1년 무료이용이 가능합니다만 Micro는 HDD를 사용하기 때문에, 파일시스템을 많이 사용하는 또봇은 SDD를 사용하는 Compact로 진행하겠습니다. 아마 큰 차이는 없겠지만 한번 질러보죠!

 

 

다음을 누르면 서버 설정 화면이 뜹니다. 옵션을 만지다 보면 표시한 부분에 금액이 변경됩니다. 이를 통해 비용이 얼마나 발생할지 예측할 수 있습니다.

 

저는 비용이 가장 적게 나오는 옵션을 선택했습니다. 그리고 요금제 옵션도 선택할 수 있는데 계산해 보니 비슷비슷합니다. 저는 24시간 띄워둘 거라 시간 요금제를 선택하는 이점이 없어 월요금제를 선택하겠습니다.

 

만약 비용에 대해 더 자세히 알아보고 싶다면 아래 비용 계산기 페이지를 통해서 직접 계산해 볼 수 있습니다.
https://www.ncloud.com/charge/calc/ko

 

서버 이름은 test-server라고 입력한 후 다음을 누르겠습니다.

 

인증키 설정 화면이 나옵니다. 처음 Server를 생성한다면 인증키가 없기 때문에 새로운 인증키를 생성합니다. 인증키 이름을 원하는 대로 짓고 생성 및 저장을 누르면 다운로드할 수 있습니다.

다음은 네트워크 접근 설정입니다. 일단 default 옵션을 그대로 사용하겠습니다.

이제 최종확인 화면이 나오고 서버 생성 버튼을 누르면 NCP Server가 실행됩니다!

서버 생성 후 포트포워딩을 설정해야 터미널로 NCP Server에 접속할 수 있습니다. 이 부분은 아래 공식 문서를 참고해 주세요! (제 글보다 공식문서가 더 잘 설명되어 있는 건 안 비밀..)

https://www.ncloud.com/guideCenter/guide/1

 

문서를 따라 했다면 아래 터미널 이미지처럼 NCP Server에 문제없이 접속했을 겁니다.

 

 

자,, 그럼 여기서 Python 서버는 어떻게 띄울까요???

 


 

Python 가상환경 만들기

터미널에서 python3 --version 명령어를 입력하면 Python 3.6.9 이 출력됩니다. 또봇은 3.10 이상을 사용하기 때문에 더 높은 버전의 Python 버전이 필요합니다. 여러분들의 프로젝트도 대부분 더 높은 버전을 사용하고 있겠죠!?

 

그래서 저는 Python 3.11.0 버전의 가상환경을 만들어 사용하겠습니다.

 

가상환경을 만들기 위해 먼저 pyenv를 설치해 보겠습니다. pyenv는 쉽게 Python 가상환경을 만들고 사용할 수 있게 도와주는 툴입니다.

 

먼저 pyenv를 설치하기 위해 아래 명령어들을 입력합니다.

sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
   libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
   libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

 

이 명령어들은 pyenv와 python을 설치하기 위해 필요한 의존성 패키지들입니다.

 

 

pyenv 설치하기

아래 명령어로 pyenv를 설치해 봅시다.

   curl https://pyenv.run | bash

 

pyenv가 설치되면, 터미널 프로필에 환경 설정을 추가해야 됩니다.

 

아래 코드를 .bashrc 파일에 추가합니다. vi ~/.bashrc 명령어로 파일을 열고 입력하면 됩니다.

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

 

추가한 후에는 source ~/.bashrc를 실행해서 변경사항을 적용해 줍니다.

 

Python 3.11 버전 설치하기

이제 pyenv를 사용해서 Python 3.11 버전을 설치하겠습니다.

pyenv install 3.11.0

 

설치가 완료되면, 다음 명령어로 3.11.0 버전의 가상환경을 만들 수 있습니다.

pyenv virtualenv 3.11.0 python-env

 

python-env 는 가상환경 이름으로, 여러분이 원하는 이름을 지으시면 됩니다.

 

이제 pyenv activate [가상환경이름] 을 입력하면 3.11.0 버전의 가상환경으로 진입합니다.

pyenv activate python-env

 

마지막으로 python --version 을 통해 현재 환경이 3.11.0 버전임을 확인할 수 있습니다.

 

 

Python 서버 실행

저는 코드가 깃헙에 올라가 있기 때문에 현재 터미널에서 git clone 을 통해 코드를 내려받았습니다.

 

그리고 .env 라는 파일을 통해 환경변수를 관리하기 때문에 touch .env 로 파일을 생성하고 vi .env 로 파일을 열어 환경변수를 입력해줍니다.

 

마지막으로 FastAPI 실행 명령어를 입력하면!!!!

아직 어림도 없고요,,,

 

서버 실행에 필요한 의존성 패키지를 설치해야겠죠?

 

Python 프로젝트는 requirements 나 poetry 등으로 관리를 할 텐데 또봇은 requirements을 사용하므로 pip install -r requirements.txt 명령어로 설치해 줍니다.

 

아래는 패키지 설치를 마치고, 성공적으로 FastAPI 서버를 실행한 모습입니다. 이뿌죠?

실제 슬랙에서도 잘 실행되는 것을 볼 수 있습니다. 

 

 

 


 

nohup 을 통한 서버 백그라운드 실행

사실 위의 실행 방법에는 문제가 있습니다.

 

ssh 로 접속한 터미널을 종료하면 서버도 함께 종료가 되죠. 이 문제를 해결하기 위해 nohup 을 통해 서버를 백그라운드로 실행해야 합니다. nohup이란 "No Hang Up"의 줄임말입니다. 쉽게 말해, 터미널을 닫아도 프로그램이 종료되지 않게 해주는 명령이죠.

 

기존 서버 실행 명령어는 uvicorn app:app --host 0.0.0.0 --port 2000 였습니다. 여기서 nohup 을 붙여 다음처럼 입력합니다.

nohup uvicorn app:app --host 0.0.0.0 --port 2000 &> /dev/null &

 

이렇게 하면 백그라운드로 서버를 실행하고 터미널은 계속 사용할 수 있죠!

 

백그라운드로 실행 중인 서버는 직접 프로세스 아이디를 찾아 종료해야 하는데요. ps -ef 로 프로세스 아이디를 찾고 kill -9 [프로세스 아이디] 로 종료시킬 수 있습니다.

 

드디어 Python 서버 배포 끝!!!

 


마이그레이션 후기

혼자서 클라우드 인스턴스를 만들고 서버를 운영하는 것은 이번이 처음입니다. 백엔드 개발자이긴 하지만 인프라는 거의 다루지 않다 보니 경험이 없었죠. 다행히 이번 경험으로 인프라를 시작해 볼 수 있었네요!

 

직접 인프라를 만져보니 도커와 CICD의 필요성을 체감하게 되었습니다. 패키지를 일일이 설치하고, 코드를 수정할 때마다 수동으로 배포하는 일이 은근히 귀찮더군요. 또봇은 배포 주기가 짧기 때문에 앞으로 배포 자동화를 고려해야겠습니다.

 

또봇(슬랙 앱)은 소켓모드로 동작하기 때문에 공인 IP를 설정하는 과정은 이 글에서 생략했습니다. 이 또한 문서에 잘 나와있으니 필요한 경우 참고해 주세요. 

 

이 글을 쓸 때에는 시원시원하게 진행했지만 처음에는 시행착오를 조금 겪었습니다.(왜 Python 설치가 안 되는 거냐고!!) NCP 서버를 만드는 자료는 많았지만 Python 애플리케이션까지 실행하는 가이드는 거의 없더군요. 그래서 이 글을 작성하게 되었습니다. Python 흥해라!