Django:제로부터 시작하는 인스타그램 만들기 - DevOps #1 - AWS EC2 에 배포하기, ubuntu 20.04, github, python3 사용

     

2021.09.15 - [Course/django : 제로부터 시작하는 인스타그램] - Django:제로부터 시작하는 인스타그램 만들기 - clone instagram 목차

 

 

 

시작하기 전에

 인스타 클론 코딩 컨텐츠를 만든 지 1년이 지났습니다. 블로그보다는 유튜브 중심의 컨텐츠였지만, 생각보다 많은 사람들이 영상을 봐주셨고, 블로그에서도 나름 뷰 수가 높은 글이 되었네요. 인스타그램 클론 코딩 포스팅은 중간에 멈췄지만, 유튜브 영상으로 끝까지 완주하신 분들도 많았던 것 같습니다. 요걸 다 만들고 나서 뭔가 아쉬움을 느껴서 2탄 3탄도 만들어야겠다고 생각을 했는데, 이직도 하고 게임(?)도 하면서 지내다 보니 시간이 후딱 갔네요 ㅎㅎ 

 

일단 저는 서버(백엔드) 개발자이기 때문에 인스타 클론 코딩 강의는 저한테 살짝 아쉬운 강의입니다. 왜냐하면 백엔드 쪽을 더 설명해주고 싶은데, 인스타그램이라는 UI를 만들어야 하다 보니 프론트엔드 쪽 설명을 안 할 수가 없었거든요. 그래서 추가적인 강의들은 백엔드 개발자 스펙 위주의 강의를 만들려고 합니다. 

 

이번 포스팅은 DevOps영역인 배포와 DB 연결하기, 도커 이미지로 만들기, nginx(웹서버), 도메인, ssl 인증서 등을 다룰 예정입니다. 

 

 

너무 오랜만이네? 프로젝트 실행해보기

이 포스팅을 보시는 분들은 이미 인스타클론 코딩을 완료하셨거나, django로 클론 하는 것보다 배포나 AWS설정에 관심이 있으신 분이겠죠? 기존에 인스타 클론을 하신 분이면 아마 기억이 가물가물할 수도 있고, 처음 하시는 분이면 어쨌든 실습해볼 프로젝트가 필요하기 때문에 이전에 인스타그램 github에 올려두었던 프로젝트를 로컬에서 실행해보도록 하겠습니다.

 

github 주소 : tkdlek11112/django_zero_to_instagram: Django:제로부터 시작하는 인스타그램 클론코딩 (github.com)

 

GitHub - tkdlek11112/django_zero_to_instagram: Django:제로부터 시작하는 인스타그램 클론코딩

Django:제로부터 시작하는 인스타그램 클론코딩. Contribute to tkdlek11112/django_zero_to_instagram development by creating an account on GitHub.

github.com

위 깃헙에서 코드를 클론 한 다음 파이참을 이용해 실행해보겠습니다.

gitkraken으로 클론

저는 제가 자주 사용하는 툴인 GitKraken을 이용해서 클론 했습니다. 이제 파이참으로 클론 받은 프로젝트 폴더를 열어볼까요?

 

열려랏

 

readme파일이 반겨줍니다. github에서 clone 하면 가상 환경도 없고 migration도 안 돼있고 해서 실행할 수 없는 상태입니다. 그래서 제가 실행하는 법을 readme에 적어놓았는 데 따라 하시면 됩니다. 따라 하기 전에 python3.7 버전 이상이 설치되어있어야 합니다~!

 

제일 먼저 가상 환경을 만들어줘야 하는데 아래 명령어를 치면 됩니다.

가상환경 만들기

 

python -m venv venv를 하게 되면 venv라는 폴더 이름으로 가상 환경(virtual environment)을 만듭니다. 가상 환경을 설치하고 나면 이제 파이참 설정에서 프로젝트에 대한 가상 환경을 세팅해줘야 합니다.

 

설정에 Python Interpreter에서 설정

저는 파이참이 똑똑하게 알아서 경로를 잡아줬네요. 만약 여기 아무것도 안 잡혀있거나 다른 곳에 있는 파이썬 가상 환경이 잡혀있다면, 옆에 Add Interpreter를 선택해서 우리가 방금 만든 venv폴더를 지정해주어야 합니다.

 

만약 안되어있다면 선택

 

자 이제 파이참에 터미널 창을 껐다 켜던지, 아니면 아래 명령어로 가상 환경을 실행시킵니다.

source ./venv/Scripts/activate

오잉

엌ㅋㅋ 원래 맥이나 리눅스에서는 이게 먹는데,, 윈도우 파워쉘 기반 터미널에서는 명령어가 안 먹히네요. 파워 쉘에서는 그냥 아래와 같이 입력하면 가상 환경이 실행됩니다.

 

짠~

자 이제 프로젝트 실행에 필요한 패키지를 설치해야 하는데 requirements.txt에 있는 패키지를 설치하면 됩니다. 아래와 같이 입력하세요

 

pip install로 한방에~

이렇게 requirements.txt를 만들어 놓으면 한방에 끝~ 지금이야 패키지가 별로 없어서 그냥 몇 개 설치하는 게 더 빠를 수도 있을 듯한데 나중에 가면 진짜 많아진다.. ㅋㅋ 

 

자 이제 마지막으로 migration만 하고 실행시켜 보자.

 

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

 

 

실행완료~

 

오홍 잘 실행되는구먼~

 

실행화면 왜케 허옇게 나왔니

 

실행한 김에 회원가입도 해보고 글도 하나 올려봄. 디자인이 이렇게 허접했었나? ㅋㅋ

 

 

AWS EC2 생성

이제 이 프로젝트를 AWS에 올릴 건데, 설정을 조금 바꿔주고 파일도 몇 개 추가해야 할 것 같아서 깃헙을 새로 파겠습니다.

새로 판 github - tkdlek11112/django_zero_to_instagram_devops: 장고 인스타그램 클론코딩 데브옵스편 (github.com)

뒤에 _devops를 붙였습니다. ㅋㅋ 

 

자 이제 AWS에 올려볼게요. AWS가 유료라고 생각하시는 분들이 많은데 가입하고 1년 동안은 프리 티어라고 해서 공짜로 쓸 수 있는 서비스들이 꽤 있습니다. 하지만 1년 뒤에는 과금이 되니 처음 가입할 때 카드를 등록하긴 하는데, 1년 쓰고 삭제하시면 됩니다. 꼭 삭제하거나 사용 중인 서비스를 내려야 돈이 안 나가니 주의하세요~!

 

일단 AWS 가입하시면 EC2라는 메뉴에 들어갑니다.

 

EC2

EC2라는 게 서버로 사용할 컴퓨터를 클라우드에 만들어주는 서비스인데, Elastic Cloud Computing? 이래서 앞글자 따서 EC2입니다. 제 블로그에 AWS EC2관련 글이 좀 많아서 자세한 설명은 스킵할게요. 설명이 필요하면 유튜브 영상을 보시면 됩니다~!

 

EC2를 클릭하면 EC2 대시보드로 들어가게 되는데, 여기서 새로운 인스턴스를 만들면 됩니다. 인스턴스라는 게 하나의 서버 단위라고 생각하시면 됩니다. 저희가 EC2 인스턴스 하나를 만들면 접속할 수 있는 서버 하나가 만들어지는 것과 같습니다.

 

 

저는 이미 3개의 인스턴스를 사용 중이어서 인스턴스 목록에 실행 중인 인스턴스가 보입니다. 새로 만들 때는 오른쪽 위에 인스턴스 시작을 눌러줍니다.

 

생성화면

인스턴스 생성화면은 뭐 거의 매년 디자인이 바뀌는 것 같아서 블로그 글을 쓸 때마다 UI가 다르네요 ㅋㅋ 일단 이름을 정하고 OS 이미지를 정하는데, 저희는 ubuntu 20.04 OS를 선택하도록 하겠습니다. 원래는 18.04 버전을 많이 썼는데, 18.04에 서비스 지원기간이 얼마 안 남아서 20.04 버전을 사용하겠습니다. 진행하는데 큰 차이는 없긴 한데, 20.04에서는 mysql 8.0이 디폴트라서 추후 디비 연결할 때 mysql 8.0을 사용해야 합니다. 보통은 mysql 5.7을 많이 사용하긴 하는데 8.0도 좋아요~

 

인스턴스 유형

 

아래로 내리면 인스턴스 유형이 중요한데, 컴퓨터를 사면 성능이 가장 중요하지 않습니까? 인스턴스 유형이 내가 받을 서버의 성능을 결정하는 건데 종류가 생각보다 많습니다. 보통 앞자리가 서버 유형이고 뒷자리가 스펙인데, 앞자리는 t, d, m ... 요론식으로 있고 t가 제일 작은 거고 m은 메모리 위주, d는 용량 위주 뭐 이런 식입니다. 그리고 뒤에는 micro, small, large, xlarge 2xlarge 식으로 증가하며 높을수록 성능이 좋습니다. 

 

하지만 우리는 공짜로 사용할 것이기 때문에 제일 꾸진 t2.micro를 선택합니다. ㅎㅎ

 

키페어

 

그다음이 또 중요한 키 페어 설정인데, 요건 우리가 서버에 접속할 때 필요한 인증서 같은 키를 설정하는 메뉴입니다. 만약 기존에 생성한 키가 있다면 등록하면 되고, 없다면 새 키 페어 생성을 눌러서 신규 생성하면 됩니다. 이때 다운로드하는 키는 다음엔 다시 다운로드하지 못하므로 잘 보관하고 있어야 합니다. 

 

키페어 생성

아래 파일 형식이 있는데, 윈도에서 putty를 사용할 거면 ppk가 편하고, 리눅스나 맥에서 사용하실 거면 pem이 편합니다.

 

나머지는 그냥 디폴트로 설정하고 만들기를 누르면 인스턴스가 생성됩니다.

 

생성 완료
목록에서 확인 가능

 

자 이제 서버가 생성되고 조금 기다리면 목록에서 인스턴스 상태가 "실행 중"이고, 상태 검사에 "2/2 검사 완료" 이런 식으로 뜹니다. 그럼 서버가 사용 가능한데, 일단 서버에 접속해볼까요? 

 

아까 받은 ppk파일을 이용해서 putty로 접속할 수 있습니다. 접속할 때는 퍼블릭 IPv4 주소를 입력해서 들어갑니다.

 

putty

putty를 안 쓰시는 분들은 터미널에서 ssh -i {인증서 파일} ubuntu@{ip}를 입력하면 접속 가능합니다. putty를 사용할 때는 connection -> ssh -> auth에 가서 아까 다운로드한 ppk파일을 등록하고, ip주소를 입력하고 접속을 누르면 됩니다. 

 

putty

 

Open을 누르면 처음에 인증서 사용에 대한 확인창이 뜨고, OK 누르고 넘어가면 Login as:라고 뜹니다. 여기에 ubuntu라고 입력하면 됩니다.

 

Login as : ubuntu

어떤 계정으로 로그인할 거냐는 질문인데, AWS에서 ubuntu 인스턴스 EC2를 만들면 ubuntu가 기본 계정으로 설정되어 있습니다. 따라서 ubuntu로 로그인하시면 됩니다.

 

아무것도 없는 서버

지금 막 설치된 서버라 아무것도 설치되어있지 않는데, git은 설치가 되어있습니다. 일단 git으로 코드를 받아볼까요?

 

git clone
clone 완료

 

자 이제 서버에 코드가 올라갔습니다. 그럼 맨 처음 저희가 프로젝트 실행했던 것과 같이 장고를 실행하면 됩니다.

그전에 python이 설치되어있는지 볼까요?

 

python을 치면 not found가 뜨네요. 하지만~! 

python3으로 되어있다

python3을 입력하면 python3.8.10이 실행됩니다. python으로 안 해놓고 python3으로 설치해놨네요. ㅂㄷㅂㄷ

그럼 pip도 pip3인가?

 

pip

일단 pip도 설치 안되어있는데 pip3 입력해도 동일합니다. 근데 설치할 수 있다고 나오네요. sudo apt install python3-pip 입력합니다.

 

아마 설치가 안되시는 분이 대다수일 것 같은데, apt를 최신 버전으로 업데이트해야 합니다. 

 

sudo apt update를 눌러주면, 뭐가 이것저것 설치됩니다. 그리고 다시 명령어를 치면 pip가 설치됩니다. 중간에 정말 설치할 거냐고 묻는데 y를 살포시 눌러줍니다.

 

pip3 실행화면

 

자 이제 모든 게 준비되었군요. 프로젝트 폴더로 이동합니다.

 

이동

로컬에서 할 때는 가상 환경을 만들어주었는데, ec2에서는 하지 않아도 됩니다. 로컬에서 가상 환경을 만드는 목적은 프로젝트별 패키지 분리인데, 여기 서버에는 장고 인스타그램 프로젝트만 있기 때문에 가상환경을 만들지 않고 그냥 바로 python3을 사용해도 무방합니다. 그래서 가상 환경은 건너뛰고 패키지 설치 -> 마이그레이션 -> 서버 실행 순으로 갑니다.

 

pip3 install -r requirements.txt
python3 manage.py makemigrations/migrate

자 이제 실행 준비가 끝났네요. 한번 프로젝트를 실행해 볼까요? 

 

python3 manage.py runserver

로컬에서 실행할 때는 127.0.0.1:8000으로 접속했지만, 저희는 서버에 장고를 실행했기 때문에 서버 ip주소로 접속해야 합니다. putty 들어갈 때랑 같은 ip주소를 사용하고 대신 뒤에 포트를 8000을 붙여줍니다. 

 

http://43.201.26.170:8000

 

 

안됩니다.

여기서 접속이 안 되는 이유는 여러 가지가 있는데, 

1. runserver를 할 때 ip주소를 0.0.0.0으로 세팅해줘야 한다.

2. 방화벽(보안 그룹) 설정을 해야 한다.

3. 코드상에서 접근 허용 host를 설정해야 한다.

입니다.

 

먼저 1번은 기본적으로 장고에서 runserver를 하게 되면 127.0.0.1인 로컬 호스트로 실행을 하게 됩니다. 로컬 호스트란 실행한 컴퓨터 자기 자신을 뜻하는데요, 따라서 내 컴퓨터에서 테스트할 때는 127.0.0.1로 실행하고 127.0.0.1로 접속하면 정상적으로 실행되기 때문에 상관없지만, 서버에서는 127.0.0.1로 실행하면 서버에서만 접속 가능합니다. 저희는 아무 데서나 접속 가능하게 원하기 때문에 서버에 띄운 건데 127.0.0.1로 띄우면 의미가 없겠죠? 이럴 땐 0.0.0.0이라는 ip주소를 사용합니다. 127.0.0.1이 자기 자신을 뜻한다면, 0.0.0.0은 외부로 나가는 end-point를 뜻합니다. 즉 runserver 0.0.0.0으로 실행하게 되면 외부에서도 장고 접속이 가능해집니다. 

 

0.0.0.0:8000으로 실행

 

그리고 2번 방화벽 설정은 AWS에서는 보안 그룹이라는 이름으로 관리되는데, firewall이라고 많이 들어보셨을 거예요. 요게 뭐냐면 네트워크상에서 접근을 못하도록 말 그대로 벽을 치는 건데, 여러분 컴퓨터 같은 경우는 아마 보안 프로그램들이 다 방화벽을 치고 있을 겁니다. 따라서 외부에서 여러분 컴퓨터에 접근하기 어렵죠. 서버도 마찬가지로 허용되지 않은 곳에서 들어오는 데이터를 다 차단합니다. 하지만 몇몇 약속된 포트들에 대해서는 허용하는데 가장 대표적인 예로 홈페이지 같은 http, https로 시작되는 애들은 서비스를 하려면 허용을 해야 하기 때문에 포트들이 열려있습니다. 하지만 저희가 장고를 띄울 때 8000번 포트를 사용했기 때문에 이 8000번 포트에 대해서도 전부 열어줄 필요가 있습니다. 

 

AWS 콘솔 홈페이지에 가서 인스턴스에 가면 보안 그룹 설정을 할 수 있습니다.

 

보안 세부정보 클릭

인스턴스를 누르고 보안 탭을 누르면 보안 세부 정보가 나오는데, 여기 설정된 보안 그룹과 인바운드, 아웃바운드 규칙들이 나옵니다. 인바운드는 말 그대로 서버 안으로 들어오는 허용된 규칙이고, 아웃바운드는 나가는 규칙입니다. 아웃바운드에 0.0.0.0/0이라고 되어있는 건 전부 허용한다는 뜻입니다.

 

인바운드를 보면 0.0.0.0/0, 포트 범위 22로 되어있는데, 포트번호가 22번으로 들어오는 연결만 허용한다는 소리입니다. 포트번호 22가 뭘까요? 바로 ssh연결입니다. 저희가 putty나 ssh를 통해 EC2에 들어갈 수 있었던 건 기본적으로 EC2를 생성할 때 22번 포트는 열려있게 설정되기 때문입니다. 

 

이제 여기에 8000번 포트 인바운드를 추가하면 되는데요, 위쪽에 보안 그룹 sg-어쩌게 돼있는 퍼렁이를 클릭하면 보안 그룹 설정을 할 수 있습니다.

 

보안그룹에서 인바운드 규칙 편집

 

인바운드 규칙 편집을 눌러서 8000번 포트를 0.0.0.0/0에 대해서 허용하도록 설정합니다.

 

8000번 규칙 추가

 

자 마지막으로 3번은 코드를 고쳐야 하는데, 장고 settings.py에 가면 ALLOWED_HOST라는 설정값이 있습니다.

ALLOWED_HOSTS

이 설정이 바로 접속 가능한 호스트를 화이트리스트로 관리하는 설정값인데, 여기에 전체 허용인 '*'를 추가합니다.

 

ALLOWED_HOSTS = ['*']

 

이제 코드가 바뀌었으니 서버에 적용해야겠죠? git commit과 push를 합니다.

 

호스트 변경 push

 

push를 하고 나서 ec2에서 git pull 해서 최신화된 소스코드를 받습니다.

 

git pull

요즘 git은 대부분 사용하니 자세한 설명은 생략하겠습니다. 상세한 설명이 필요하면 유튜브를 참고해주세요.

 

이제 위에서 말한 3가지 요소가 다 수정되었습니다.

 

1. runserver를 할 때 ip주소를 0.0.0.0으로 세팅해줘야 한다.

2. 방화벽(보안 그룹) 설정을 해야 한다.

3. 코드상에서 접근 허용 host를 설정해야 한다.

 

그럼 다시 runserver 0.0.0.0:8000을 실행하고, 브라우저로 접속해봅시다.

 

http://43.201.26.170:8000/main

 

접속 완료!
글 올려보기

 

접속한 김에 이것저것 해보니 잘 되는 것 같네요!

 

 

 

마무리하며

이번 시간에는 인스타그램 클론 코딩한 장고 프로젝트를 AWS EC2위에서 실행해보았습니다. 이 과정을 흔히 '배포'라고 말하죠. 하지만 아직 뭔가 부족합니다. 장고에서 runserver는 개발할 때 디버그용으로 제공하는 기능이기 때문에 실제 상용화된 서비스를 하기에는 부족한 게 많습니다. 따라서 다른 설정들을 해줄게 많이 남았는데요, 다음 포스팅에서는 장고 앞단에 nginx를 설치해서 웹서버로 장고를 서비스해보겠습니다.

 

 

 

 

반응형

댓글

Designed by JB FACTORY