[AWS] Django 프로젝트를 EC2, RDS를 이용해 배포하기

Jay·2020년 6월 4일
3
post-thumbnail

Django로 프로젝트 하면서 데이터베이스 서비스로 RDS를 사용하고 EC2로 배포하는 과정을 기록합니다. 배포라는 목적지에 도달하기 위해서는 다음 과정을 거치는데 1번과 2번은 생략하고 3번 과정에 대한 글입니다.

  1. EC2 인스턴스 생성하기
  2. RDS 인스턴스 생성하기
  3. EC2에 배포를 위한 환경 구축하기

EC2 접속

프라이빗키 파일이 있는 폴더에서 실행해야 한다.

ssh -i "[프라이빗 키 파일 명].pem" ubuntu@ [ 퍼블릭DNS ]

가상환경 설치

아나콘다보다 간소한 버전인 미니콘다를 설치한다.
https://docs.conda.io/en/latest/miniconda.html 저는 우분투 인스턴스를 사용하기 때문에 Python 3.7 Miniconda3 Linux 64-bit를 설치했습니다. (오른쪽 우클릭 후 링크 주소 복사)

  • 다음의 명령어를 입력해서 미니콘다 설치.
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

chmod -R 755 Miniconda3-latest-Linux-x86_64.sh

./Miniconda3-latest-Linux-x86_64.sh

설치하고 난 다음에는 conda를 쳐서 설치가 됐는지 확인하면 되는데, 이 때 설치가 안됐다고할 수 있다. 이럴 때는 침착하게 터미널을 한번 껐다가 켜는것이 좋다.(중요)

  • 파이썬 3.7 버전의 가상환경 만들기
conda create -n [가상환경이름] python=3.7      # 가상환경 만들기
conda activate [가상환경이름]                  # 가상환경 접속

프로젝트 파일 설치

깃허브 프로젝트 저장소를 클론한다.

git clone [REPOSIROTY URL]

requirements 및 기타 프로그램 설치

  • 패키지 프로그램 업데이트
sudo apt-get update
  • gcc 컴파일러 설치
sudo apt-get install gcc
  • mysqlclient 설치
    libmysqlclient-dev를 먼저 설치해야 한다.
sudo apt-get install libmysqlclient-dev
pip install mysqlclient
  • requirements 설치
    깃 레포에 requirements파일을 만들어 두었으면 빠르게 진행할 수 있다.
    requirements가 있는 디렉토리로 이동해서 다음의 명령어를 입력한다
pip install -r requirements.txt

(없다면 오류날 때마다 한땀 한땀 설치)

데이터베이스 백업해서 RDS로 옮기기

지금까지는 로컬에 있는 mysql 데이터베이스를 사용했었지만, 앞으로는 rds를 사용할 것이다.
그러기 위해서는 데이터베이스를 백업해서 RDS에 저장해야 한다. 이 과정부터는 잠깐 EC2를 종료하고 로컬에서 진행한다.

  • 로컬 데이터베이스 백업
    이 페이지로 과정을 대신한다
  • RDS에 데이터베이스 생성하기
mysql -h [RDS 앤드포인트] -u root -p
create database [데이터베이스명] character set utf8mb4 collate utf8mb4_general_ci;

데이터베이스명은 로컬 디비와 달라도 전혀 상관이 없다. 자유롭게 작명하면 된다.

  • 백업
    RDS를 우선 종료하고 덤프파일이 있는 디렉토리로 이동한다.
mysql -h [RDS 앤드포인트] -u root -p [데이터베이스명] < [덤프파일명].sql

백업 끝. RDS에 접속해서 확인해보자

장고 데이터베이스 설정 변경하기

다시 EC2에 접속해서 로컬디비로 되어있던 설정을 변경하자.
보통 장고의 데이터베이스 정보는 settings.py에 있지만 보안상 gitignore로 데이터베이스 정보는 따로 관리하고 있다. 이런 이유로 데이터베이스 정보가 EC2에 없다면 새로 파일을 생성하자.

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',          [0]
        'USER': '',          [1]
        'PASSWORD': '',      [2]
        'HOST': '',          [3]
        'PORT': '3306',
    }
}

[0] : 위에서 생성한 RDS 데이터베이스 명
[1] : RDS를 생성할 때 만들었던 유저명. 기본값이 admin 아니면 root 였던걸로 기억한다.
[2] : RDS 생성할 때 설정했던 패스워드
[3] : RDS 앤드포인트

settings.py 설정 변경하기

  • DEBUG
    DEBUG = False로 바꾼다. 평소에는 상관이 없지만 운영을 목적으로 한다면 True일 경우 프로젝트에 대한 정보가 샐 우려가 있기 때문이다.

  • ALLOWED_HOSTS
    디버그가 FALSE면 allowed_hosts도 설정을 해야한다. (빈 값이면 작동 안함)
    ALLOWED_HOSTS = ['EC2 퍼블릭 IP', ".ap-northeast-2.compute.amazonaws.com"]
    꼭 포트를 명시하지 않아도 된다. 보안그룹 설정만 잘 해뒀으면 연결된다.

  • TIME_SONE
    서버 시간 설정하기. 한국인이라 서울로 설정했다
    timezone = 'Asia/Seoul'

Django Runserver

설정을 잘 했는지 장고 서버로 확인한다. 포스트맨 등으로 앤드포인트를 호출해보자.

python manage.py runserver 0:8000

다음을 브라우저에 입력해 연결이 잘 되는지 확인해보면 된다.

http://퍼블릭DNS:8000/uri주소

서버가 성공적으로 구동되었다고 해서 끝은 아니다. 런서버를 해서 장고만을 이용해 서버를 구동할 수도 있지만 장고에서는 다음의 이유로 권장하지 않고 있다. 전문

DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (And that’s how it’s gonna stay. We’re in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.)

또한 장고 런서버는 단일 스레드로 작동해 많은 request를 처리하기 힘들다. 그래서 효율적인 처리를 위해 멀티 쓰레딩이 가능한 Gunicorn이라는 WSGI application server를 사용하기로 했다.

🙅‍♀️ runserver가 안된다면 확인해볼 것 🙅‍♀️

  • EC2 보안그룹
    [서비스] - [EC2] - 하단의 설명에서 [보안그룹] - [launch-wizard-숫자]
    외부에서 EC2에 접속할 수 있도록 보안 설정을 변경해줘야 한다.
    기본값은 SSH 프로토콜로만 접속할 수 있도록 되어있는데, 아래 사진처럼 설정을 추가해야 한다.
  • RDS 보안그룹
    [서비스] - [RDS] - 사용하고 있는 RDS 인스턴스 - 하단의 [연결 & 보안] - VPC 보안 그룹 - [인바운드 규칙]
    유형 : MySQL/Aurora
    포트범위 : 3306
    소스 : 위치무관
    위치무관으로 해두면 어느 ip에서나 데이터베이스에 접근이 가능하다.

Gunicorn


Gunicorn은 Green Unicorn이라는 뜻으로 Python WSGI HTTP 서버다.
웹서버와 WAS 사이를 연결하는 인터페이스로 파이썬에서는 wsgi를 사용하고 있다.
만약 장고로 정적 페이지도 만들었다면 웹서버와 wsgi를 연결하는 작업을 해야겠지만 이 프로젝트에서는 장고로 API만 만들었기 때문에 따로 작업은 안한다.

  • 설치
pip install gunicorn
  • gunicorn 실행
    다음 명령어를 실행하면 서버가 구동된다. 이렇게 서버를 실행하면 EC2를 종료해도 서버가 계속 켜져있는 상태가 된다.
gunicorn --bind 0.0.0.0:8000 [Django 프로젝트명].wsgi &

  • ps -ef 명령어로 현재 실행되고 있는 프로세스 확인
ps -ef | grep python
  • 서버 종료
kill [pid번호]

참고
https://vsupalov.com/django-runserver-in-production/
https://vsupalov.com/what-is-gunicorn/

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

0개의 댓글