Django 챗봇을 EC2에 배포하면서 겪었던 에러 및 고민

회사에서 django를 사용하여 챗봇을 만들었다. 오늘은 왜 django를 사용해서 챗봇을 만들었는지부터 django를 AWS EC2에 배포하는 방법, EC2에서 OS(AMI) 선택하는 방법에 대해 알아보고자 한다.

왜 Django를 사용하여 챗봇을 개발하였는가?

  • 챗봇을 개발할 수 있는 프레임워크는 django, flask, fast api 등이 있다.
  • 현재 개발할 수 있는 인력이 2명이다.
  • 개발할 수 있는 인력이 모두 경험해 본 프레임워크가 django이다.
  • 따라서, 러닝커브가 가장 짧을 것이라 생각했다.

해당 챗봇을 회사 내부분들이 사용해 볼 수 있도록 AWS EC2에 배포 하기로 결정이 됐다.

챗봇 코드는 github에 업로드 되어 있어 git repository를 이용해 EC2에 옮기기로 하였다.

AWS EC2에 배포하기

EC2 인스턴스 생성하기

1. 기본 페이지에서 EC2를 검색해 들어온 페이지(EC2 대시보드)에서 “인스턴스 시작”을 누른다.

 

2. 생성하고자 하는 EC2 인스턴스 이름을 적어준다.

3. OS(AMI)를 선택한다. - 우분투

왜 우분투를 선택하였는가?

  • 우분투는 다양한 환경에서의 호환성과 범용성이 뛰어나다.
  • google에서 “django EC2 배포”라고 검색하면 거의 99%의 사람들이 우분투를 사용해서 배포를 한 것을 알 수 있다. 그래서 혹시나 배포 도중 에러가 발생하게 돼도 사람들의 도움을 많이 받을 수 있을 것이라고 예상했다.

 

4. Instance 타입을 선택한다.

  • 다양한 유형이 있지만 django 챗봇이 안정적으로 돌아가게 하기 위해서 t2.small을 선택했다.

 

5. Key pair를 생성해 준다.

꼭 키페어를 생성해야 하는가?

  • EC2 컴퓨터에 원격 접근하기 위한 열쇠같은 것
  • 내가 만든 서버에 아무나 접근하면 안되기 때문에 키 페어는 잘 간직하고 있어야 한다.
  • PuTTY와 같은 SSH를 사용하여 연결할 분들은 반드시 생성해줘야 한다.

6. 네트워크 세팅을 해준다.

6-1. edit을 눌러 Django 기본 포트(8000)를 추가해 준다.

  • EC2는 보안상 외부에서 접속하는 port를 제한하고 있어 외부에서 port에 접속하기 위해 수동으로 열어줘야 된다.
  • Edit을 누르게 되면 Inbound Security Group Rules를 수정할 수 있게 되는데, 여기서 아래 이미지와 같이 8000번 포트를 열어준다.

EC2 실행 & 접속하기

1. EC2 생성이 완료되고 Running 상태가 되면 해당 인스턴스를 클릭하고 connect 버튼을 클릭해서 CLI에 접속해준다.

EC2 서버 기본 세팅

1. 기본 정보 세팅

# 설치할 수 있는 패키지의 정보를 불러오기
sudo apt update

# python3 패키지 매니저(pip) 설치 및 라이브러리 설치
sudo apt install python3-pip

 

EC2 서버에 Django 챗봇 세팅하기

1. git clone

  • 깃허브 클론(clone)을 하면 로그인을 하라는 창이 뜨게 된다. 
  • id는 본인 깃허브 username, pw는 github access token을 입력하면 된다.
  • github access token을 만드는 방법을 모른다면 공식문서를 참조해서 생성하길 바란다.
git clone <깃허브 주소>

#login
#id
[본인 github username]
# pw: github > setting > Developer setting > personal access tokens > Tokens(classic) > "user token name"
[github access token]

만약 git clone error가 발생하게 된다면?

  • 필자는 원격 저장소가 저장이 되어 있지 않아 에러가 발생했다.
  • 공식 문서를 참조해서 해당 오류를 해결한다.
$ git init
$ git remote add origin (GitHub주소)  //origin이라는 이름으로 추가한다면 이렇게 하면 됨

 

2. 추가 기능 다운로드 받기

pip install -r requirements.txt

 

3. 실행(runserver)

python3 manage.py runserver 0:8000

 

4.  접속

“EC2ipv4주소: 8000”에 접속하여 챗봇이 정상적으로 돌아가는지 확인한다.

 

필자는 이렇게 접속을 했을 때 에러가 발생했다. 그 이유는? 

  • Allowed Host를 설정해주지 않았기 때문이다. 
  • Django 코드 폴더에 보면 settings.py가 있다. 
  • settings.py에 보면 Allowed Host라는 것이 있는데 여기에 EC2 ipv4 주소를 넣어줘야 한다.
    • settings.py가 있는 폴더 찾아가기(cd project)
    • vi settings.py로 들어가서 ALLOWED_HOSTS를 찾아 수정(i)하고 저장(:wq)하기

  • EC2의 퍼블릭 IPv4주소는 어떤 사유로든 인스턴스 사용을 중지했다가 재가동 하는 상황이 발생할 경우 기존에 주어졌던 퍼블릭 IPv4 주소가 바뀔 수도 있다.
  • 퍼블릭 IP주소가 바뀌면 여러 가지 문제가 발생할 수 있기 때문에 IP주소를 고정시켜주는 것이 좋다.
  • IP주소를 고정시키기 위해서는 탄력적 IP를 설정해야 하는데 필자의 경우 일회성으로 한번만 실행시키면 됐기 때문에 해당 설정을 해주지 않고 넘어가겠다.
  • 만약 탄력적 IP 설정이 필요하다면 해당 블로그를 참조

만약 ec2 connect 창을 나가더라도 중단 없이 계속해서 실행하고 싶다면?

1. nohup을 사용하면 된다.

nohup python3 manage.py runserver 0:8000 &

 

2. nohup을 걸어둔 작업을 멈춰야 할 때가 있다.

  • 그러기 위해선 1. nohup이 실행되고 있는 process의 Id를 찾아서 Kill해주면 된다.

2-1. ps -ef

  • ps -ef 명령어를 실행하면 현재 실행중인 프로세스가 뜬다.
  • 그 중 내가 내린 명령어를 찾아주면 된다.

2-2. kill -9 processID

  • 9 : 강제 종료를 의미하는 인자
  • 여기서는 kill -9 3354를 입력하면 된다.