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"폴더가 생긴다. 임의의 이름이므로 바꿔도 된다.
- 앞으로 모든 개발 및 로컬환경 테스트는 가상환경에서 이루어진다. 배포도 가상환경에서 가능하므로 개발 중에는 굳이 비활성화 할 필요가 없다.
- Django를 버전 지정하여 설치하고 잘 설치되었는지 확인한다.
- 아래와 같이 생성을 하면 홈 디렉토리에 "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
(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 configuration4.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
댓글
댓글 쓰기