안녕하세요, 네로입니다. 이번 포스팅의 시리즈에서는 자신이 만든 프로젝트/서비스를 Amazon Web Service(AWS) 로 배포하는 방법을 소개해 볼까 합니다. 주위에 웹 개발을 배우시는 분들 중에는 자신의 서비스를 다른 사람들이 이용하게끔 하고 싶은 분들이 많아 그 전 부터 정리해서 올리고 싶었는데, 이제야 하게 되네요. 도움이 많이 되셨으면 좋겠습니다.
저는 첫 배포를 하게 될 때 nachwon님의 블로그를 통해서 할 수 있었습니다. 하지만, 어째 그대로 해도 잘 되지 않는 부분이 있었고 기나긴 삽질 끝에 배포를 성공한 뒤에 보니 저는 이 블로그를 대부분 따라가되, 저 혼자 수정해서 진행하는 부분들이 있었습니다. 따라서 이 포스팅 시리즈는 저 블로그를 많이 참고하되, 지금 현재(2020년 3월 14일 기준) 배포를 해보지 않으신 분들이 그대로 따라해도 배포가 될 수 있도록 최대한 자세히 작성됩니다. 혹시나 저의 목적과 다르게 오류가 난다거나 하는 부분들은 꼭 댓글로 알려주시면 좋겠습니다. (과거 저의 첫 배포를 가능하게 해주신 nachwon 님께 정말 감사드립니다.)
시작하기 전에!
이 포스팅 시리즈에서는 Django를 통해 웹 개발을 하는 방법에 대한 내용을 다루지 않습니다. 이 포스팅의 목적은 배포에 대한 지식이 아예 없는 분들을 위한 첫 배포 가이드입니다. 따라서, 스텝 별로 최대한 자세히 설명을 드리며 포스팅이 진행될 것입니다. 하지만, 저도 전문가는 아니라서 설명하기 어렵다고 생각된다면 그냥 따라하기를 요구할 수도 있어요! 그런 부분들은 이후에 업데이트 될 수 있도록 해볼게요.
(중요) 이 포스팅은 제 컴퓨터가 mac인 관계로 mac 기준으로 설명을 드립니다. 따라서, 로컬 컴퓨터에서 입력하는 모든 명령어가 윈도우 컴퓨터의 명령 프롬프트(cmd)에서 작동하지는 않습니다. CLI 명령어를 입력하는 mac의 terminal은 기본적으로 bash (카탈리나 업데이트 이후로는 zsh이 기본이라고 합니다.)라는 쉘을 이용합니다. 윈도우에서는 이 bash라는 녀석이 없기 때문에, git bash 를 설치하고 따라해 주세요. 그래도 mac과는 달리 문제가 많을 수 있으니, 한 번 그대로 따라해 보시고 문제가 생기면 댓글로 남겨주시기 바랍니다.
개발에 사용된 환경은?
- Django 프로젝트가 깔려있는 나의 컴퓨터 (로컬 컴퓨터): macOS Catalina 10.15.3
- Django 프로젝트를 배포할 외부 컴퓨터 (서버 컴퓨터): AWS EC2 서비스의 Ubuntu 18.04
- 이 강의에서는 테스트 프로젝트를 만들고 배포하는 모습까지 모두 보여드립니다. 자신의 프로젝트를 바로 배포하고 싶으시면 테스트 프로젝트를 만드는 것은 그냥 넘어가셔도 돼요.
- github 계정이 있으셔야 합니다. gitlab, bitbucket 등 git을 위한 다른 플랫폼을 사용하셔도 무방하나, github 중심으로 설명 드립니다.
- AWS 계정이 있으셔야 합니다. 처음 가입하시면 1년간 무료로 EC2 서버를 사용하실 수 있고, 이 가이드에선 무료 서버를 사용합니다.
- (선택) 사용하는 에디터: vscode
- Windows 사용자 : git bash 설치 후, 제가 설명에 터미널에 입력하세요~ 하면 실행해 주시면 됩니다.
github과 AWS 계정이 없으시면 따라하기 전에 가입하고 와주세요! github은 어렵지 않은데 AWS 같은 경우에는 해외 결제가 가능한 신용카드 등록을 요구할 수 있습니다. 확인차 1달러가 결제가 될 것이고, 제 기억엔 가입 직후 바로 EC2 서비스를 사용하지는 못하는 것으로 알고 있는데 이 부분은 참고 부탁드려요! 기다려야 하는게 24시간인가? 했던 것 같네요. 배포 시작 전에 미리 가입해 두시면 좋을 것 같습니다.
이 포스트에는 함께 배포할 테스트 프로젝트를 만들고, Django 프로젝트를 배포할 EC2 서버 컴퓨터를 임대해 보겠습니다.
배포할 Django 프로젝트 만들기
먼저, 이 포스팅에서 배포할 Django 프로젝트를 만들어 보겠습니다. 저는 바탕화면에 폴더(아무 이름으로 해도 됩니다.)를 만들고 여기에 django 프로젝트를 만들어 보겠습니다. 프로젝트를 만들기 전에 이 폴더에 터미널로 가상환경을 만들게요. (저는 python3를 입력하는데, python만 치셔도 python 3.x 버전이 불러와 진다면 python으로 입력하셔도 됩니다.) 그리고 제가 코드를 보여드릴 때 꼭 $는 빼고 써 주세요! 터미널 명령어라는 표시로 넣어 둔거에요. (옛날에 헷갈렸던 기억이..)
$ python3 -m venv myvenv
myvenv 자리엔 원하는 가상환경 명을 입력하시면 됩니다. 그러면 myvenv라는 폴더가 생깁니다. 이제 가상환경을 활성화 할건데,
mac의 경우
$ source myvenv/bin/activate
Windows의 경우
$ source myvenv/Scripts/activate
두 경우가 다르니 환경에 맞게 활성화 해줍니다. 그러면 이런식으로 활성화가 되었음을 볼 수 있습니다.
(myvenv) [현재 위치]$
Django를 설치합니다. pip도 마찬가지로 pip 만 입력했을 때 python 3.x 버전과 잘 연결되어 사용하고 계셨으면 pip3 대신 pip를 입력하시면 됩니다.
$ pip3 install django
배포할 프로젝트를 만듭니다.
$ django-admin startproject mysite
프로젝트에 앱(main)을 만듭니다.
$ cd mysite
$ python3 manage.py startapp main
settings.py 에서 main 앱을 추가하고 사용하는 언어와 timezone을 수정합니다. 사이트가 영어만을 사용한다면 LANGUAGE_CODE는 변경하지 않으셔도 됩니다. 파일 명은 프로젝트 폴더 안에서의 기준입니다. 예를 들면 mysite/settings.py는 프로젝트 폴더인 mysite 안의 mysite 폴더에 settings.py를 의미합니다.
mysite/settings.py
...
INSTALLED_APPS = [
'main',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
...
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
...
배포 시에 띄울 화면을 위해 간단히 설정해보도록 하겠습니다.
main 폴더 안에 templates 폴더를 만들고, 그 안에 main 폴더를 만든 뒤 index.html을 아래와 같이 만들어 주세요.
main/templates/main/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Django 첫 배포 성공!!</h1>
</body>
</html>
그 다음, views와 urls설정을 합니다.
main/views.py
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, "main/index.html")
mysite/urls.py
from django.contrib import admin
from django.urls import path
from main import views as main_views
urlpatterns = [
path('', main_views.index, name="index"),
path('admin/', admin.site.urls),
]
기본 모델들을 migrate 해준 뒤, runserver를 해줍니다.
$ python3 manage.py makemigrations && python3 manage.py migrate
$ python3 manage.py runserver
그리고 http://127.0.0.1:8000/ 로 접속하면 아래와 같은 화면이 나오겠죠?
네! 이 화면을 이제 로컬이 아닌 aws 서버를 통해 볼 수 있게 된다면 배포를 성공한 것입니다.
프로젝트를 업로드할 준비가 되면, 프로젝트에 사용한 패키지들을 서버 컴퓨터에서도 똑같은 패키지를 설치할 수 있도록 requirements.txt에 만들어 두는 것이 좋습니다. manage.py가 있는 폴더에서
$ pip3 freeze >> requirements.txt
를 입력하면, 현재 활성화된 가상환경에 설치된 패키지의 목록을 requirements.txt에 저장할 수 있습니다. 다음 명령어로 안의 내용을 확인할 수 있습니다.
$ cat requirements.txt
AWS EC2 서버 임대하기
다음은, AWS에서 EC2 서버를 하나 임대하려고 합니다. 먼저 이런 질문이 생길 수 있어요.
Q. 왜 배포를 위해 AWS에서 EC2 서버 컴퓨터를 빌려야 하는 것인가요?
웹 서비스는 보통 24시간 동안 작동을 해야합니다. 항상 켜져있어야 하죠. 자신의 데스크탑이나 노트북 같은 경우에는 웹 서비스를 위한 서버의 역할을 할 수는 있지만 전원을 끄는 순간 서버의 역할을 하지 못하게 됩니다. 서버의 역할을 하면서 나만의 컴퓨터를 사용하는 것도 어울리지는 않습니다. 따라서, 항상 켜져 있어서 서비스에 사용할 수 있는 또 다른 컴퓨터가 필요합니다. 이 컴퓨터는 AWS에서 제공하는 EC2 서비스를 통해 대여할 수 있으며, 우리는 이 컴퓨터를 원격으로 조종하여 배포를 하는 것이에요. 만약, 자신이 24시간 돌아가는 물리 서버가 있거나 다른 클라우드 컴퓨팅 서비스를 사용하고 싶다면 이용하셔도 됩니다....만! 여기서는 AWS를 기준으로 설명할게요.
AWS 계정을 만든 뒤, 로그인하고 상단 "서비스" 메뉴를 클릭한 뒤, EC2 를 검색해 들어갑니다.
우측 상단의 리전 선택에서 서울을 선택해줍니다. 어디에 위치한 컴퓨터를 임대할 것인지 설정한다고 생각하면 됩니다. 서비스 대상 지역과 가깝다면 빠르겠죠?
좌측 메뉴에 인스턴스를 클릭해 들어갑니다. 인스턴스 = 컴퓨터라고 생각하시면 됩니다. 그럼 이런 화면이 나옵니다. 인스턴스 시작을 눌러줍니다.
그러면 컴퓨터 이미지(지금은 운영체제라고 생각할게요.)를 선택하라는 화면이 나오는데 Ubuntu Server 18.04 LTS를 선택해 줍니다. Ubuntu는 리눅스 기반 운영체제 중 하나입니다.
다음은 인스턴스 유형을 선택합니다. 프리 티어라고 표시된 유형이 새로 가입한 사용자들이 1년간 일정 할당량을 무료로 사용할 수 있는 유형입니다. 그래도 한 달 동안 하루 종일 켜두니까 1000~2000원 정도 나왔던 것 같아요. 배포 연습용으로 진행한 것이라 과금되는게 싫으시다면 연습이 끝난 후 인스턴스를 종료(삭제)해주시면 과금이 안 될 겁니다. 선택하고 검토 및 시작을 눌러줍니다.
다음엔 시작하기를 눌러줍니다. 3~6단계 같은 경우에는 AWS와 배포에 더 익숙해진 뒤에 특별히 설정할 날이 올 거에요.
그러면 키 페어를 설정하라는 창이 나옵니다. 키 페어란, 여러분이 생성한 EC2 컴퓨터에 원격 접근하기 위한 열쇠라고 생각을 하시면 됩니다. 내가 만들어 놓은 서버를 아무나 접근하면 안되겠죠? 당연히 키 페어를 아무데나 뿌리고 다니셔도 안 됩니다. 그건 집 열쇠를 아무에게나 주는 것과 같은 거에요. 새 키 페어를 생성을 선택해 주시고, 키 페어의 이름을 입력한 뒤 다운로드를 눌러주세요. 저는 deploy_test로 했습니다. 키 페어를 다운로드 했다면 인스턴스 시작을 눌러주세요.
그러면 인스턴스를 시작했다는 창이 보이고 인스턴스 보기를 클릭하시면 노란불과 함께 켜지고 있는 인스턴스를 볼 수 있습니다. 기다리면 곧 켜질 것이고 그 동안 우리는 pem키 관리를 해볼게요.
다운로드된 폴더에 있는 키 페어를 홈 폴더(~)의 .ssh 폴더로 옮깁니다. 만약 홈 폴더에 .ssh 폴더가 없다면 만든 뒤에 옮겨줍니다. 폴더 앞에 .이 붙은 건 숨김 폴더라는 뜻이에요. ssh는 외부 컴퓨터와 원격 통신을 할 때 쓰는 명령어입니다.
(~/.ssh 폴더가 없을 경우) $ mkdir ~/.ssh/
$ mv ~/Downloads/deploy_test.pem ~/.ssh/
키 페어가 잘 옮겨졌는지 확인합니다. (다른 파일도 있을 수 있는데 그건 일단 무시하고 pem 파일이 있는지 확인합니다.)
$ ls ~/.ssh/
deploy_test.pem
키 페어 파일의 권한을 소유주만 읽을 수 있도록 변경합니다. chmod는 파일의 읽기, 쓰기, 실행 권한을 변경할 때 쓰는 명령어입니다.
$ chmod 400 ~/.ssh/deploy_test.pem
다시 AWS 로 돌아와서 보면 EC2가 켜져 있는 것을 볼 수 있습니다. Name에서 원하는 이름을 써둡니다. 표시용으로 이름을 쓰는 것이니 저와 똑같지 않으셔도 됩니다.
AWS EC2 서버에 원격 접속하기
자신이 만든 프로젝트를 배포하려면 서버에도 그 프로젝트 파일들이 있어야 합니다. 즉, 프로젝트 파일을 옮겨야 하는데, 그러기 위해선 우리가 EC2 컴퓨터로 접속해야 합니다. putty를 사용해보신 적이 있다면 쉽게 이해하실 수 있습니다. 터미널에서는 ssh 명령어를 사용합니다.
서버에 접속하려면 키 페어(pem 파일)가 필요하다고 했죠? 키 페어와 함께 다음과 같이 원격 접속을 할 수 있습니다.
$ ssh -i [키 페어 경로] [유저 이름]@[퍼블릭 DNS 주소]
유저 이름은 초기에 ubuntu로 설정이 되고, 퍼블릭 DNS 주소는 여기서 확인할 수 있어요.
이 주소를 명령어 자리에 넣으면 됩니다. 저는 위의 과정으로 진행을 했으니 다음 명령어로 접속할 수 있습니다.
$ ssh -i ~/.ssh/deploy_test.pem ubuntu@ec2-15-164-212-231.ap-northeast-2.compute.amazonaws.com
그러면
$ ssh -i ~/.ssh/deploy_test.pem ubuntu@ec2-15-164-212-231.ap-northeast-2.compute.amazonaws.com
The authenticity of host 'ec2-15-164-212-231.ap-northeast-2.compute.amazonaws.com (15.164.212.231)' can't be established.
ECDSA key fingerprint is SHA256:어쩌구 저쩌구
Are you sure you want to continue connecting (yes/no)?
라고 합니다. yes 로 연결을 진행합니다. 만약 "WARNING: UNPROTECTED PRIVATE KEY FILE!" 오류가 나면 위의 chmod 400 을 적용하셨는지 다시 확인해 주세요.
그러면 다음과 같이 성공적으로 접속이 됩니다.
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sat Mar 14 19:18:33 UTC 2020
System load: 0.0 Processes: 87
Usage of /: 13.6% of 7.69GB Users logged in: 0
Memory usage: 14% IP address for eth0: 172.31.26.18
Swap usage: 0%
0 packages can be updated.
0 updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@ip-172-31-26-18:~$
키 페어와 함께 접속을 하면 명령어가 너무 길어지곤 합니다. 여기에 ssh 접속 명령어를 간결하게 할 수 있도록 설정하는 포스팅을 남겨두었습니다. 참고해 주세요!
AWS EC2 서버 기본 세팅
먼저 만든 EC2 컴퓨터의 기본 패키지 설치 등을 진행하도록 하겠습니다. 먼저 원격으로 접속한 뒤에,
패키지 정보를 업데이트:
$ sudo apt-get update
설치 중, 뭔가를 물어보면 Y 치고 엔터를 눌러주세요.
패키지 의존성 검사 및 업그레이드:
$ sudo apt-get dist-upgrade
이런 화면 나오면 모두 엔터를 눌러주세요.
python3 패키지 매니저(pip3) 설치
$ sudo apt-get install python3-pip
뭔가 물어보면 Y 치고 엔터
이렇게 하면 EC2 서버와 업로드할 프로젝트가 준비가 되었습니다! 다음은 이 프로젝트를 github에 먼저 업로드하고 EC2 서버에서 받아오는 방법을 보도록 하겠습니다.
'웹 > Django' 카테고리의 다른 글
Django 서비스 AWS로 배포하기 - [6] https 적용하기 (31) | 2020.03.27 |
---|---|
Django 서비스 AWS로 배포하기 - [5] 도메인 연결하기 (가비아) (10) | 2020.03.26 |
Django 서비스 AWS로 배포하기 - [4] nginx 연결하기 (74) | 2020.03.15 |
Django 서비스 AWS로 배포하기 - [3] uWSGI 연결하기 (46) | 2020.03.15 |
Django 서비스 AWS로 배포하기 - [2] github과 프로젝트 업로드 (6) | 2020.03.15 |