AWS + Python Django 1 - 프로젝트 생성 및 배포

이미 AWS에 유용한 튜토리얼과 함께 설명이 잘 되어있지만 길기 때문에,
리마인드용으로 AWS 상에 Django로 서버를 구축하는 과정을 간략한 글로 정리한다.

일반적으로 Windows 환경에서의 개발은 적을 것 같으므로
Linux/Mac 환경 기반으로 쓰고자 한다.

1. Prerequistes
  - AWS 계정(17년 현재 기준 가입자는 1년에 한하여 일정 트래픽/용량 등을 초과하지 않는다면 무료로 사용 가능하다. AWS Free tier.)
     > 가입 : https://aws.amazon.com
     > Free tier 상세 : https://aws.amazon.com/ko/free
  - Python 2.7(3.x 버전은 AWS에서도 목적에 따른 외부 라이브러리에서도 완전한 지원이 안될 수 있다.)
     > 보통 설치돼있으나 없다면 brew 등을 이용하여 설치하자.
     > 만약 brew를 사용한다면,
       i. brew 설치(https://brew.sh/index_ko.html)
~$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
       ii. Python 설치
~$ brew install python
or
~$ brew install python3

  - pip(패키지 설치용, 이 역시 없다면 brew로 python 설치 후 pip 설치 가능, brew install pip)
  - virtualenv(개발을 위한 가상환경 제공, brew install virtualenv)
  - awsebcli(AWS의 Elastic Beanstalk CLI, brew install awsebcli)

2. Set up a Python Virtual Environment with Django
  2.1 가상환경 생성
    - 아래와 같이 생성을 하면 홈 디렉토리에 "eb-virt"폴더가 생긴다. 임의의 이름이므로 바꿔도 된다.
~$ virtualenv ~/eb-virt
  2.2 가상환경 활성화
    - 앞으로 모든 개발 및 로컬환경 테스트는 가상환경에서 이루어진다. 배포도 가상환경에서 가능하므로 개발 중에는 굳이 비활성화 할 필요가 없다.
~$ source ~/eb-virt/bin/activate
(eb-virt) ~$
  2.3 가상환경 구성
    - Django를 버전 지정하여 설치하고 잘 설치되었는지 확인한다.
(eb-virt) ~$ pip install django==1.9.12
(eb-virt) ~$ pip freeze
  2.4 (Optional)가상환경 비활성화
(eb-virt) ~$ deactivate
~$

3. Create a Django project and Test
  3.1 프로젝트 생성
    - "ebdjango"는 프로젝트명으로 임의 변경 가능하다.
(eb-virt)~$ django-admin startproject ebdjango
    - 정상적으로 프로젝트가 생성이 됐다면 아래와 같은 폴더 구조를 확인할 수 있다.
    ~/ebdjango
      |-- ebdjango
      |   |-- __init__.py
      |   |-- settings.py
      |   |-- urls.py
      |   `-- wsgi.py
      `-- manage.py
  3.2 서버 실행
(eb-virt) ~$ cd ebdjango
(eb-virt) ~/ebdjango$ python manage.py runserver
  3.3 동작 확인
    - 서버 설정을 바꾸지 않았다면, 아래 그림과 같이 Web browser에서 "127.0.0.1:8000" 또는 "localhost:8000" 입력 시 사이트를 확인할 수 있다.
  3.4 서버 종료
    - 서버를 실행한 커맨드 창에서 Ctrl+C를 눌러 종료시킬 수 있다. 커맨드 창에서 실행 후 종료까지의 로그를 확인할 수 있다.

4. Deploy with the EB CLI
  4.1 EC2 Requirements 정의
    - AWS의 EC2 인스턴스에 설치되어 있어야 할 패키지 목록을 전달할 목적으로 "requirements.txt"를 작성한다. 특수한 경우가 아니면 아래와 같이 pip의 패키지 목록만 전달하면 된다.
(eb-virt) ~/ebdjango$ pip freeze > requirements.txt
  4.2 Django configuration
    4.2.1 프로젝트 폴더의 .ebextensions/django.config 파일에 기재
(eb-virt) ~/ebdjango$ mkdir .ebextensions
(eb-virt) ~/ebdjango$ vi .ebextensions/django.config
    4.2.2 기본적으로 WSGI에 대해 적어준다. 프로젝트를 다른 이름으로 만들었었으면 "ebdjango/wsgi.py"를 제대로 된 경로로 바꿔준다.
option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango/wsgi.py
    - 여기까지 정상적으로 모두 수행하였다면 폴더 구조는 아래와 같아야 한다.
~/ebdjango/
|-- .ebextensions
|   `-- django.config
|-- ebdjango
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- db.sqlite3
|-- manage.py
`-- requirements.txt
4.3 EB CLI repository 초기화 및 환경 생성
    4.3.1 "django-tutorial" 란 이름으로 EC2의 인스턴스에 올릴 Application을 생성한다.
(eb-virt) ~/ebdjango$ eb init -p python2.7 django-tutorial
Application django-tutorial has been created.
    * AWS에 한번도 연결안했던 개발자는 이 단계에서 Account ID와 Secret key를 입력하라는 단계로 넘어갈 수 있다. AWS 콘솔에서 생성한 사용자와 해당 사용자에게 부여한 Access key의 ID와 Secret key를 입력한다. Access key 생성 방법을 모른다면 다음을 참고한다. (http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_credentials_access-keys.html)
    * CodeCommit 관련 에러가 발생한다면, git init 명령어를 입력하면 해결된다.
    4.3.2 초기화를 한번 더 하여 연결되는 EC2 인스턴스에 자신의 AWS 키페어를 연결한다.
(eb-virt) ~/ebdjango$ eb init
Do you want to set up SSH for your instances?
(y/n): y
Select a keypair.
1) my-keypair
2) [ Create new KeyPair ]
    4.3.3 만든 Application에 환경을 구성한다. Load balancer 등
(eb-virt) ~/ebdjango$ eb create django-env
  4.4 (Optional) Open
    - "eb open"을 통해 사이트가 잘 동작하는지 확인할 수 있다.
(eb-virt) ~/ebdjango$ eb open
    - 하지만 아래 그림과 같이 DisallowedHost가 나오며 에러 페이지를 보일 때도 있다.
    - 이는 Django가 헤더의 IP를 보고 접속에 대해 일차적인 필터링을 하기 때문이다. 이 경우, 개발 중이어서 나만 접속하고 싶다하면 "프로젝트폴더/settings.py"의 ALLOWED_HOSTS = []로 되어 있는 부분을 아래와 같이 허용할 IP 주소들을 넣어주면 된다.
ALLOWED_HOSTS = ['XXX.XX.XX.XXX'] # XXX.XX.XX.XXX는 IP
      만약 자신의 IP가 계속하여 바뀌거나 모든 사용자가 접속 가능하게 하려면 아래와 같이 해주면 된다.
ALLOWED_HOSTS = ['*']
  4.5 Deploy
    - 수정 사항이 있다면 로컬 테스트 후 "eb deploy"를 통해 재배포한다.
(eb-virt) ~/ebdjango$ eb deploy
  4.6 Clean up
(eb-virt) ~/ebdjango$ eb terminate django-env

Reference

댓글

이 블로그의 인기 게시물

JVM Thread & Memory Monitoring

Cocos2d-x Scene 전환 방법

GUI for Redis : Medis