반응형

프로젝트의 프론트엔드 개발자가, 서버가 배포되지 않으면 개발하지 않겠다고 선언.

부랴부랴 EC2에 띄우고자 겪은 시행착오들을 묶어서 정리.

 

 

본 포스팅에서는,

1. AWS EC2 인스턴스를 생성하고

2. Github에 올라가 있는 Django 프로젝트를 AWS EC2에 배포하고

3. 터미널을 꺼도 24시간 서버가 돌아가도록 설정하는 내용을 다룬다.

-> 처음에는 백그라운드에서 직접 실행, 두번째는 백그라운드에서 동작하는 가상 터미널인 screen을 활용

 

- 프리 티어(무료버전) 서버를 사용한다.

- MacOS를 사용한다.

 

 

AWS EC2 인스턴스 생성

우선 계정을 만들고 로그인한다.

 

클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services

개발자, 데이터 사이언티스트, 솔루션스 아키텍트 또는 AWS에서 구축하는 방법을 배우는 데 관심이 있는 모든 사용자용 무료 온라인 교육 AWS 전문가가 구축한 500개 이상의 무료 디지털 교육 과정

aws.amazon.com

 

 

우측 상단에서 리전을 서울로 설정한다.

 

 

EC2 대시보드로 이동해 인스턴스를 시작한다. (상단의 서비스 탭 또는 검색을 통해 쉽게 찾을 수 있다.)

 

 

이름 설정

애플리케이션 및 OS 이미지 - Ubuntu / 18.04(프리 티어 사용 가능)

인스턴스 유형 - t2.micro(프리 티어 사용 가능)

키페어 생성 - 이름 설정 / RSA / .pem(Windows의 경우 .ppk 사용) --> 반드시 기억할 수 있는 곳에 저장해두어야 함.

네트워크 설정 - 인터넷에서 HTTPs 트래픽 허용 체크, 인터넷에서 HTTP 트래픽 허용 체크

 

위의 내용만 건드리고 '인스턴스 시작'을 누른다.

 

실행 중인 인스턴스의 이름을 클릭하면 아래와 같은 화면이 나온다.

 

우측 상단의 '연결'을 클릭해서 EC2를 실행시켜보자.

위와 같은 화면이 보일텐데, 터미널을 우선 실행한다.

그리고 인스턴스 생성 시 키를 저장한 디렉토리로 이동한다.

 

나는 djangoUnimate 안의 keys 폴더에 키를 저장해두었다.

 

그리고 위 화면의 빨간색 동그라미 부분을 클릭하여 코드 라인을 차례로 복사해 붙여넣는다.

그럼 아래와 같은 문구가 보이면서 EC2 인스턴스에 접속이 완료된다.

sudo apt update
sudo apt install python3
sudo apt install python3-pip
sudo apt install virtualenv
pip install virtualenv

ubuntu@ip- 위에 나오는 ip 주소는 EC2 인스턴스의 프라이빗 IP 주소이다.

 

또한 우리가 사용할 8000번 포트에 대한 보안 설정을 미리 해놓자.

좌측의 보안 그룹을 클릭하고,

인스턴스의 보안 그룹 ID를 클릭한다. (보안 그룹 ID가 여러 개라 헷갈린다면, 사용 중인 인스턴스 요약으로 돌아가, '보안' 탭을 클릭하면 보안 그룹 정보를 얻을 수 있다.)

 

좌측 하단의 '인바운드 규칙 편집'에 들어간다.

 

위와 같이 8000번 포트를 허용한다는 규칙을 만들고 저장한다.

 

 

 

 

 

Django 프로젝트 배포하기

우선 로컬에서, requirements.txt를 만들고 Github에 push한다.

requirements.txt는 해당 프로젝트에 사용하는 프레임워크, 라이브러리의 버전 정보를 저장하고 있는 것으로,

명령어 한 줄로 해당 버전에 맞는 프레임워크, 라이브버리를 모두 설치할 수 있게 도와준다.

관련 내용은 검색을 통해 쉽게 확인할 수 있다.

 

Github 리파지토리에 push하는 일련의 과정은 생략하겠다.

 

Github에 올라간 프로젝트를 clone해오는 과정부터 정리해보겠다.

 

우선 위에서 접속한 ubuntu 서버에서 아래와 내용을 차례로 입력한다.

sudo apt update
sudo apt install python3
sudo apt install python3-pip
sudo apt install virtualenv
pip install virtualenv

 apt는 패키지 관리 시스템이고,

python과 pip를 설치한다.

virtualenv는 가상환경을 만들기 위해 설치한다.

 

이후 아래 코드를 입력해 가상환경을 생성한다.

virtualenv venv --python=python3

ls 명령어를 통해 venv 폴더가 생김을 확인할 수 있고,

 

아래 코드를 입력해 가상환경에 접속한다.

source venv/bin/activate

위처럼 좌측에 (venv)가 뜨면 가상환경에 접속한 상태이다.

 

이번엔 Github에서 장고 프로젝트를 가져온다.

가져올 리파지토리에 들어가서 Code의 HTTPS 주소를 복사해온 후,

터미널에서 아래 코드를 입력한다.

git clone <리파지토리 주소>

 

이번에는 깃에 올라가 있지 않은 settings.py를 가져온다.

(필자는 그 외에 my_settings.py라는 파일도 추가해주었다.)

 

터미널에서 원하는 디렉토리로 이동 후,

vi settings.py

위와 같이 입력한다.

 

그리고 로컬의 settings.py 코드를 모두 복사해서

터미널에 붙여넣는다.

 

:wq 라는 명령어로 저장 후 종료한다.

 

이제 runserver 명령어로 django 서버를 실행시킬 수 있다.

(단, DB 연결이 되어있지 않은 경우 실행이 어려울 수 있다. 필자는 MySQL이 연결되지 않아 실행이 되지 않았고, 해당 내용은 다음 포스팅에 작성한다.

 

이때, migrate 명령어를 사용하라는 문구가 발생할텐데, migrate도 한 번 해주면 된다.

 

서버를 실행할 때는 아래와 같이 입력해야 한다.

python3 manage.py runserver 0.0.0.0:8000

뒤의 주소를 적지 않으면 실행이 되지 않는다.

 

위와 같이 django 서버가 실행되면 완료!

 

 

 

 

 

 

 

터미널 꺼도(SSH 연결 끊겨도) 서버 연결하기

실행된 서버를 백그라운드로 넘기면, 터미널을 종료해서 서버가 계속 실행된다.

아래와 같이 터미널에 입력한다.

 

python manage.py runserver 0.0.0.0:8000 --> 장고 서버를 실행한다.

ctrl + z --> 해당 프로그램을 정지시키고 shell로 돌아온다.

bg --> 백그라운드로 보낸다.

disown -h --> ssh 연결이 끊어져도 백그라운으로 보낸 프로세스를 실행한다.

 

이후 터미널을 종료해도, 장고 서버에 접속할 수 있다.

 

아래 명령어는 리눅스 명령어로,

tcp 8000번 포트로 실행 중인 프로세스를 종료하는(kill) 명령어이다.

즉, 백그라운드에서 실행 중이던 장고 서버를 종료한다.

>> sudo lsof -t -i tcp:8000 | xargs kill -9

 

그런데..!

 

특정 api에서 아래와 같은 오류가 발생한다.

 

아.. 여기서 아주 크게 절망한다.

찾아보니 MySQL(DB) 연결이 되지 않는 문제일 가능성이..?

 

정확한 원인은 모르겠어서,

일단 직접 EC2에 설치한 MySQL 말고

RDS 인스턴스를 만들어서 연결한다.

 

그랬더니..!

 

또 안 된다. 그렇게 찾고 또 찾아서 발견한 방법이 바로,

리눅스 가상 터미널인 screen이다!

 

 

진짜로 터미널 꺼도(SSH 연결 끊겨도) 서버 연결하기 (screen 활용)

참고 문서 : https://dailyheumsi.tistory.com/19

 

screen은 리눅스 가상 터미널로,

터미널을 물리적으로 다중화하여, 백그라운드에서 터미널을 실행할 수 있는 프로그램이라고 한다.

screen을 사용해서, 터미널을 꺼도 runserver가 구동되게 하자!

 

우선 screen을 설치한다.

sudo apt-get install screen

 

그리고 screen을 생성한다.

screen -S test 	// test는 screen 이름

 

생성된 스크린을 조회해보자.

# 현재 생성된 screen list 조회
screen -ls

There is a screen on:
        7783.test (07/02/2022 02:10:13 AM)        (Attached)

 

7783이라는 네 자리 숫자가 스크린의 id이다.

Attached는 해당 스크린에 현재 접속해있는 상태라는 표시이다.

 

ctrl + a + d 를 누르면 해당 스크린에서 빠져나올 수 있다.

그 후 아래와 같이 다시 조회해보자.

 

# 현재 생성된 screen list 조회
screen -ls

There is a screen on:
        7783.test (07/02/2022 02:10:13 AM)        (Dettached)

AttachedDettached로 바뀐 것을 볼 수 있다.

해당 스크린을 빠져나온 것이다.

 

이번에는 스크린에 들어가서, runserver를 구동하고 도망나올 것이다.

# 7783 id를 가진 screen으로 다시 attach
screen -r 7783

# 7783.test screen 으로 들어온 상황
python3 manage.py runserver 0.0.0.0:8000

System check identified no issues (0 silenced).
September 30, 2018 - 21:50:28
Django version 2.1.1, using settings 'ypc.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

이 상태에서 ctrl + a + d 로 screen에서 빠져나온 후,

터미널을 종료해보자.

 

EC2의 주소와 8000번 포트를 사용해 서버에 접속하면

잘 구동되고 있음을 확인할 수 있다 !

 

 

(대충 감격해서 엉엉 우는 짤)

 

 

 

 


위와 같은 과정을 통해

Django 서버를 AWS EC2에 배포하고, 24시간 접속이 가능한 환경을 구축했다.

이제 프론트에 거센 채찍질을 할 차례이다.

 

 

 

 

 

 

반응형
반응형

 

사실 엄밀히 말하면 서버 배포는 아니고,

(미안하다.. 이 글 보여주려고 어그로 끌었다..)

ngrok를 사용하면, 나의 로컬 서버에 다른 사람이 방화벽을 뚫고 접근할 수 있다.

 

서버 배포 전, postman 등을 통해 mock 기능으로 api 테스트를 클라이언트 개발자와 진행할 수 있지만,

아무래도 로컬에 (백엔드 개발자가 만진) DB와 직접 연결되어 테스트해보는 것이 더 나을 수 있다.

 

방법은 무척 간단하니 쉽게 따라해보자.

 

 

 

1. ngrok 다운로드

다운로드 주소 : https://ngrok.com/download

주소에 접근하면 brew, 직접 다운로드 두 가지 방법 중 선택하라고 한다.

 

회원가입을 통해 token을 발급받을 수 있다. (Google, Github 소셜 회원가입 지원)

 

실행할 환경의 'ngrok http <포트번호>' 실행하면 되는데,

아래에서 실행해보자

 

 

 

 

2. 장고 서버 실행 및 배포

개발 중인 환경으로 이동하여 장고 서버를 실행해준다.

이때 0.0.0.0:8000 주소로 실행한다. (현재 요청된 호스트의 IP나 이름에 관계없이 실행한다는 뜻)

% python manage.py runserver 0.0.0.0:8000

 

* 실행이 되지 않는다면 프로젝트 앱 디렉토리의 'settings.py'에서 아래와 같이 수정한다.

(모든 주소의 호스팅을 허용)

...
ALLOWED_HOSTS = ['*']
...

 

터미널에서 ngrok를 실행한다.

% ngrok http 8000 // 8000은 장고 포트 번호

위와 같이 뜨면 정상. (임시주소라 상관없지만 그냥 가려봄.)

빨간색 박스로 가둔 'https ..' 주소를 복사하여 사용하면 된다!

 

핸드폰으로 주소에 접속하여 확인해보자.

 

 

아래는 핸드폰으로 해당 주소에 접속한 화면이다.

 

 

url을 추가하면 원하는 api에 접근 가능하다.

헤더에 인증정보를 입력하지 않아 동작하지 않지만,

앱 개발자가 알아서 할 것이라 믿는다 ㅎㅎ

 

 

 

 

반응형
반응형

* 공부 과정에서 작성한 글로, 설명이 정확하지 않을 수 있습니다.

 

drf_yasg 라이브러리를 활용하면 Django 프로젝트의 API 리스트를 자동으로 생성할 수 있다.

단, generics나 Viewset을 활용한 CBV(Class Based View)여야 한다.

 

APIView를 사용하거나, generics, Viewset에서도 View 내부에서 커스터마이징한 메서드에 대해서는 제대로 된 명세를 작성해주지 않는다. 이 경우에는 직접 코드 내부에 명세에 관한 내용을 기입해야 한다.

 

(나는 대부분의 View가 APIView 또는 커스터마이징된 메서드이기 때문에 코드가 너무 지저분해질 것을 염려하여 Swagger에 직접 작성하기로 했다.)

 

 

 

패키지 설치 및 적용

(venv) % pip install drf-yasg
# settings.py

INSTALLED_APPS =
[	
	...
	'rest_framework',
    'myapp',
    'drf_yasg'
    ...
]

 

 

 

swagger 엔드포인드 추가

from django.contrib import admin
from django.urls import path, re_path
from django.conf import settings
#from django.conf.urls import url
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view( 
    openapi.Info( 
        title="Swagger Study API", 
        default_version="v1", 
        description="Swagger Study를 위한 API 문서", 
        terms_of_service="https://www.google.com/policies/terms/", 
        contact=openapi.Contact(name="test", email="dhkep03@gmail.com"), 
        license=openapi.License(name="Test License"), 
    ), 
    public=True, 
    permission_classes=(permissions.AllowAny,), 
)

urlpatterns = [
    path('admin/', admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name="schema-json"),
        re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
        re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),    ]

 

 

 

 

적용 후 서버 실행하면 다음 주소에 접속이 가능하다.

 

 

 

http://localhost:8000/swagger/

 

 

 

http://localhost:8000/redoc/

 

반응형
반응형

NameError: name '_mysql' is not defined

 

장고 프로젝트와 MySQL을 연동하고 makemigrations 하는 중 발생한 오류.

구글링해서 나온 웬만한 링크들 전부 따라해보아도 안됐는데,

 

나의 경우 아래 방법으로 해결했다.

 

1) 터미널에(프로젝트에 사용 중인 가상환경 접속 필수)

pip install mysql-connector-python

 

2) 장고 my_settings에서

'ENGINE': 'django.db.backends.mysql',

으로 수정

반응형
반응형

 

"detail": "JSON parse error - Expecting property name enclosed in double quotes:

 

참고 링크 : https://stackoverflow.com/questions/62347538/json-parse-error-expecting-property-name-enclosed-in-double-quotes-line-11-co

 

JSON parse error - Expecting property name enclosed in double quotes: line 11 column 5 (char 257)"

I am following a course on the Django Rest Framework. I seem to have copied the code verbatim, however, there seems to be some error which I am unable to zero down on. What possibly could be causin...

stackoverflow.com

 

### 잘못된 JSON 형식
{
"mbti_fourth": "J",
}

### 올바른 JSON 형식
{
"mbti_third": "T",
"mbti_fourth": "J"
}

장고는 아니고 JSON 형식에 대한 에러이다.

마지막에 콤마(,)를 지우지 않아서 발생한 에러.

복수 항목이 있는 경우 모두 끝에 콤마를 붙여주고, 마지막 항목에만 지워줘야 한다.

반응형
반응형

 

No changes detected in app ‘polls’

 

여기서 'polls'는 django 튜토리얼에 나오는 앱의 명칭이다.

에디터와 터미널이 동기화되지 않아서 생기는 현상으로, 각 파일을 저장해주고 기다리면 해결된다.

 

*초보자들에게

에디터(필자는 vscode)사용 시,

각 파일을 편집하고 저장하지 않는 경우가 있었다.

 

반드시 수정한 파일마다 저장을 해주어야 한다. 에디터에 열려있는 폴더 전체가 한 번에 저장되는 것이 아님에 명심하자.

반응형
반응형

 

 

모델(model) : 데이터가 저장되어 있는 모델

클래스 1개 = 테이블 1개

클래스 안의 1줄 = 1개 컬럼 정의

 

 

 

마이그레이션(migration) : 모델의 변경사항을 저장하는 방법으로, 디스크 상의 파일로 존재

마이그레이션 관련 python 명령어 정리

- python manage.py makemigrations : 마이그레이션 파일을 만든다

- python manage.py migrate : 저장된 마이그레이션 파일을 실행하여 변경을 DB에 적용한다

 

초기상태에서는 makemigrations를 건너뛰고 migrate을 실행한다 --> 기본 앱에 대한 모델이 작성된다.

 

 

 

뷰(view) : request를 받아서 response를 내보내는 로직, 함수

Http response, JSON response 등의 response를 내보내거나 다른 url등으로 render할 수 있다.

request를 최종 전달받아 처리하는 곳.

 

 

 

url : url 경로들을 view로 매핑시켜준다.

request가 들어오면 urls.py 라는 파일로 가서 url에 매핑되는 view를 찾아 이동시켜준다.

 

 

템플릿(template) : client의 화면에 보여지는 부분. DRF(Django-Rest_Framework) 사용 예정이라 그만 알아보자.

 

반응형
반응형

 

 

참고 커맨드

cd : 디렉토리 이동

cd - : 이전 디렉토리로

ls : 현재 디렉토리 하위 항목 리스트업

mkdir : 폴더(디렉토리) 생성

 

 

 

 

in terminal,

 

1. 폴더(디렉토리) 생성

mkdir djangoProject

 

2. 생성된 디렉토리 이동

cd djangoProject

 

3. 가상환경 생성

python -m venv myvenv

(myvenv : 가상환경명)

 

4. 생성된 가상환경 디렉토리로 이동

cd myvenv

 

5. ls로 하위 항목 확인

ls

(bin, include, lib, pyvenv.cfg 가 뜨면 정상)

 

6. 가상환경 활성화

source ./bin/activate

(비활성화는 deactivate)

 

7. 장고 상태 확인

python -m django —version

(미설치라면 pip install django)

 

8. 장고 프로젝트 설치를 위해 루트디렉토리로 이동

cd djangoProject

 

9. mysite 디렉토리 생성

mkdir mysite

 

10. 생성한 mysite 디렉토리로 이동

cd mysite

 

11. 장고 프로젝트 설정

django-admin startproject first_app .

 

12. manage.py가 있는 mysite에서 서버 구동

python manage.py runserver

위 이미지와 같은 메세지가 뜨면 성공

 

13. 서버 구동 확인

http://127.0.0.1:8000/ 접속

위 이미지처럼 뜨면 정상

 

14. mysite/config/settings.py 파일을 아래와 같이 변경 (한국 기준으로 변경)

(언어와 시간대를 수정)

반응형

+ Recent posts