Django 프로젝트 AWS EC2에 배포하기 - 터미널을 꺼도 서버 돌아가게 하자! (프리 티어)
프로젝트의 프론트엔드 개발자가, 서버가 배포되지 않으면 개발하지 않겠다고 선언.
부랴부랴 EC2에 띄우고자 겪은 시행착오들을 묶어서 정리.
본 포스팅에서는,
1. AWS EC2 인스턴스를 생성하고
2. Github에 올라가 있는 Django 프로젝트를 AWS EC2에 배포하고
3. 터미널을 꺼도 24시간 서버가 돌아가도록 설정하는 내용을 다룬다.
-> 처음에는 백그라운드에서 직접 실행, 두번째는 백그라운드에서 동작하는 가상 터미널인 screen을 활용
- 프리 티어(무료버전) 서버를 사용한다.
- MacOS를 사용한다.
AWS EC2 인스턴스 생성
우선 계정을 만들고 로그인한다.
우측 상단에서 리전을 서울로 설정한다.
EC2 대시보드로 이동해 인스턴스를 시작한다. (상단의 서비스 탭 또는 검색을 통해 쉽게 찾을 수 있다.)
이름 설정
애플리케이션 및 OS 이미지 - Ubuntu / 18.04(프리 티어 사용 가능)
인스턴스 유형 - t2.micro(프리 티어 사용 가능)
키페어 생성 - 이름 설정 / RSA / .pem(Windows의 경우 .ppk 사용) --> 반드시 기억할 수 있는 곳에 저장해두어야 함.
네트워크 설정 - 인터넷에서 HTTPs 트래픽 허용 체크, 인터넷에서 HTTP 트래픽 허용 체크
위의 내용만 건드리고 '인스턴스 시작'을 누른다.
실행 중인 인스턴스의 이름을 클릭하면 아래와 같은 화면이 나온다.
우측 상단의 '연결'을 클릭해서 EC2를 실행시켜보자.
위와 같은 화면이 보일텐데, 터미널을 우선 실행한다.
그리고 인스턴스 생성 시 키를 저장한 디렉토리로 이동한다.
나는 djangoUnimate 안의 keys 폴더에 키를 저장해두었다.
그리고 위 화면의 빨간색 동그라미 부분을 클릭하여 코드 라인을 차례로 복사해 붙여넣는다.
그럼 아래와 같은 문구가 보이면서 EC2 인스턴스에 접속이 완료된다.
sudo apt update
sudo apt install python3
sudo apt install python3-pip
sudo apt install virtualenv
pip install virtualenv
ubuntu@ip- 위에 나오는 ip 주소는 EC2 인스턴스의 프라이빗 IP 주소이다.
또한 우리가 사용할 8000번 포트에 대한 보안 설정을 미리 해놓자.
좌측의 보안 그룹을 클릭하고,
인스턴스의 보안 그룹 ID를 클릭한다. (보안 그룹 ID가 여러 개라 헷갈린다면, 사용 중인 인스턴스 요약으로 돌아가, '보안' 탭을 클릭하면 보안 그룹 정보를 얻을 수 있다.)
좌측 하단의 '인바운드 규칙 편집'에 들어간다.
위와 같이 8000번 포트를 허용한다는 규칙을 만들고 저장한다.
Django 프로젝트 배포하기
우선 로컬에서, requirements.txt를 만들고 Github에 push한다.
requirements.txt는 해당 프로젝트에 사용하는 프레임워크, 라이브러리의 버전 정보를 저장하고 있는 것으로,
명령어 한 줄로 해당 버전에 맞는 프레임워크, 라이브버리를 모두 설치할 수 있게 도와준다.
관련 내용은 검색을 통해 쉽게 확인할 수 있다.
Github 리파지토리에 push하는 일련의 과정은 생략하겠다.
Github에 올라간 프로젝트를 clone해오는 과정부터 정리해보겠다.
우선 위에서 접속한 ubuntu 서버에서 아래와 내용을 차례로 입력한다.
sudo apt update
sudo apt install python3
sudo apt install python3-pip
sudo apt install virtualenv
pip install virtualenv
apt는 패키지 관리 시스템이고,
python과 pip를 설치한다.
virtualenv는 가상환경을 만들기 위해 설치한다.
이후 아래 코드를 입력해 가상환경을 생성한다.
virtualenv venv --python=python3
ls 명령어를 통해 venv 폴더가 생김을 확인할 수 있고,
아래 코드를 입력해 가상환경에 접속한다.
source venv/bin/activate
위처럼 좌측에 (venv)가 뜨면 가상환경에 접속한 상태이다.
이번엔 Github에서 장고 프로젝트를 가져온다.
가져올 리파지토리에 들어가서 Code의 HTTPS 주소를 복사해온 후,
터미널에서 아래 코드를 입력한다.
git clone <리파지토리 주소>
이번에는 깃에 올라가 있지 않은 settings.py를 가져온다.
(필자는 그 외에 my_settings.py라는 파일도 추가해주었다.)
터미널에서 원하는 디렉토리로 이동 후,
vi settings.py
위와 같이 입력한다.
그리고 로컬의 settings.py 코드를 모두 복사해서
터미널에 붙여넣는다.
:wq 라는 명령어로 저장 후 종료한다.
이제 runserver 명령어로 django 서버를 실행시킬 수 있다.
(단, DB 연결이 되어있지 않은 경우 실행이 어려울 수 있다. 필자는 MySQL이 연결되지 않아 실행이 되지 않았고, 해당 내용은 다음 포스팅에 작성한다.
이때, migrate 명령어를 사용하라는 문구가 발생할텐데, migrate도 한 번 해주면 된다.
서버를 실행할 때는 아래와 같이 입력해야 한다.
python3 manage.py runserver 0.0.0.0:8000
뒤의 주소를 적지 않으면 실행이 되지 않는다.
위와 같이 django 서버가 실행되면 완료!
터미널 꺼도(SSH 연결 끊겨도) 서버 연결하기
실행된 서버를 백그라운드로 넘기면, 터미널을 종료해서 서버가 계속 실행된다.
아래와 같이 터미널에 입력한다.
python manage.py runserver 0.0.0.0:8000 --> 장고 서버를 실행한다.
ctrl + z --> 해당 프로그램을 정지시키고 shell로 돌아온다.
bg --> 백그라운드로 보낸다.
disown -h --> ssh 연결이 끊어져도 백그라운으로 보낸 프로세스를 실행한다.
이후 터미널을 종료해도, 장고 서버에 접속할 수 있다.
아래 명령어는 리눅스 명령어로,
tcp 8000번 포트로 실행 중인 프로세스를 종료하는(kill) 명령어이다.
즉, 백그라운드에서 실행 중이던 장고 서버를 종료한다.
>> sudo lsof -t -i tcp:8000 | xargs kill -9
그런데..!
특정 api에서 아래와 같은 오류가 발생한다.
아.. 여기서 아주 크게 절망한다.
찾아보니 MySQL(DB) 연결이 되지 않는 문제일 가능성이..?
정확한 원인은 모르겠어서,
일단 직접 EC2에 설치한 MySQL 말고
RDS 인스턴스를 만들어서 연결한다.
그랬더니..!
또 안 된다. 그렇게 찾고 또 찾아서 발견한 방법이 바로,
리눅스 가상 터미널인 screen이다!
진짜로 터미널 꺼도(SSH 연결 끊겨도) 서버 연결하기 (screen 활용)
참고 문서 : https://dailyheumsi.tistory.com/19
screen은 리눅스 가상 터미널로,
터미널을 물리적으로 다중화하여, 백그라운드에서 터미널을 실행할 수 있는 프로그램이라고 한다.
screen을 사용해서, 터미널을 꺼도 runserver가 구동되게 하자!
우선 screen을 설치한다.
sudo apt-get install screen
그리고 screen을 생성한다.
screen -S test // test는 screen 이름
생성된 스크린을 조회해보자.
# 현재 생성된 screen list 조회
screen -ls
There is a screen on:
7783.test (07/02/2022 02:10:13 AM) (Attached)
7783이라는 네 자리 숫자가 스크린의 id이다.
Attached는 해당 스크린에 현재 접속해있는 상태라는 표시이다.
ctrl + a + d 를 누르면 해당 스크린에서 빠져나올 수 있다.
그 후 아래와 같이 다시 조회해보자.
# 현재 생성된 screen list 조회
screen -ls
There is a screen on:
7783.test (07/02/2022 02:10:13 AM) (Dettached)
Attached가 Dettached로 바뀐 것을 볼 수 있다.
해당 스크린을 빠져나온 것이다.
이번에는 스크린에 들어가서, runserver를 구동하고 도망나올 것이다.
# 7783 id를 가진 screen으로 다시 attach
screen -r 7783
# 7783.test screen 으로 들어온 상황
python3 manage.py runserver 0.0.0.0:8000
System check identified no issues (0 silenced).
September 30, 2018 - 21:50:28
Django version 2.1.1, using settings 'ypc.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
이 상태에서 ctrl + a + d 로 screen에서 빠져나온 후,
터미널을 종료해보자.
EC2의 주소와 8000번 포트를 사용해 서버에 접속하면
잘 구동되고 있음을 확인할 수 있다 !
(대충 감격해서 엉엉 우는 짤)
위와 같은 과정을 통해
Django 서버를 AWS EC2에 배포하고, 24시간 접속이 가능한 환경을 구축했다.
이제 프론트에 거센 채찍질을 할 차례이다.