관리 메뉴

한다 공부

[AWS] EC2, RDS 를 사용하여 Django 프로젝트 배포하기 본문

Dev/Cloud

[AWS] EC2, RDS 를 사용하여 Django 프로젝트 배포하기

사과당근 2022. 5. 17. 22:15

열심히 로컬에서 Django 프레임워크를 사용해서 프로젝트를 만들었다.

이것을 로컬환경이 아닌, 인터넷을 통해 다양한 사용자들이 사용할 수 있도록 하고싶으면 어떻게 해야할까?

배포를 하면 된다. 지금부터 AWS에서 EC2와 RDS를 사용해서 배포를 하고자 한다.

1. EC2 생성

EC2를 구동하는 것은 서버를 띄우는 것이라고 생각하면 좋다..

서버를 띄우고 우리의 프로젝트를 올려서 다른 사람들이 접속할 수 있게 할 것이다!

 

우선 AWS에 회원가입을 해야한다.

새로 가입을 하면 '프리티어'를 사용해 1년간 t2.micro 인스턴스를 무료로 1년간 쓸 수 있다.

그런데 내가 올릴 프로젝트는 t2.micro로는 용량이 부족해서 유료 인스턴스를 사용할 예정이다.

유형으로는 t2.large, t2.xlarge 등 다양히 존재한다.

 

각설하고, 회원가입부터 하자.

회원가입하려면 카드가 필요하다. 체크카드도 OK.

본인 확인을 위해 100원인가 가져갔다가 돌려준다.

AWS Console - Signup (amazon.com)

 

AWS Console - Signup

 

portal.aws.amazon.com

 

회원가입은 하란대로 입력정보 하면 된다.

 

카드 정보도 요로코롬..

 

가입 완료 ★

가입했으면 로그인한 다음, 아래 링크로 들어가자

인스턴스 | EC2 Management Console (amazon.com)

 

https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Instances:

 

ap-northeast-2.console.aws.amazon.com

위와 같은 화면이 뜰텐데, 오른쪽 상단의 '인스턴스 시작'을 눌러서 인스턴스를 만들어보자

인스턴스는 AWS 클라우드의 가상 서버라고 생각하면 된다.

 

우분투 18.04 버전을 사용하려고 한다. 우분투는 리눅스의 다양한 배포판 중 하나이다.

중요한 것은 '프리 티어 사용 가능' 이라고 써진 것을 선택하는 것이다.

그래야 과금이 안됨..

 

여기에서는 t2.micro를 사용해야 과금이 안된다.

그런데 나는 t2.micro로는 용량이 부족해서... 과금 되는 인스턴스를 선택했다 ㅎㅎ ㅠㅠ

 

올해 초에 인스턴스를 만들었는데 그때랑 AWS 홈페이지의 UI가 바껴서 조금 헷갈린다...

여튼,, 스크롤을 내려서 새 키 페어 생성을 하자

여기서 원하는 이름을 입력하고 키 페어를 생성하자.

그럼 .pem 파일의 키 페어가 다운로드 되는데 잃어버리면 큰일나니 잘 간직해두자

 

+) GitHub Actions를 이용하려면 .pem 으로 다운 받는 것이 좋고

PuTTY를 사용해서 직접 서버에 들어가 작업하려면 .ppk 파일로 다운 받는 것이 좋다

 

그리고 네트워크 설정 부분에서 '편집'을 눌러서 보안 그룹을 수정해야 한다.

규칙은 위와 같이 했다.

그리고 오른쪽에 있는 "인스턴스 시작"을 누르자!

 

굿.

 

퍼블릭 IPv4 주소는 서버의 IP주소이다.

그런데 이 IP주소는 바뀔수도 있다.

IP주소를 고정시키기 위해 탄력적IP를 설정해보자!

 

탄력적 IP 주소 | EC2 Management Console (amazon.com)

 

https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Addresses:

 

ap-northeast-2.console.aws.amazon.com

위 링크에 들어가서 탄력적 IP를 설정할 수 있다.

탄력적 IP 주소 할당을 누르고, 할당 버튼을 클릭하면 된다.

그리고 이 주소를 방금 만든 인스턴스와 연결을 해야한다.

 

탄력적 IP 주소 연결을 누르고, 인스턴스 선택에서 방금 만든 인스턴스를 선택하고, 연결을 하면 된다!

 

인스턴스 > 퍼블릭 IPv4 DNS 에 적힌 것이 내 서버의 IP 주소임을 잊지 말자!

 

2. RDS 생성

RDS는 Relational Database Service 로,

AWS에서 관계형 데이터 베이스를 더 쉽게 관리할 수 있도록 제공하는 서비스이다.

직접 인스턴스 안에 들어가 DB를 설치할 수도 있는데, RDS를 사용하는 방법이 조금 더 쉬운 방법이라고 들었다.

RDS도 프리티어가 적용돼서 월 750시간인가? 1년간 무료로 사용할 수 있다.

근데 RDS 2개 돌리면 과금이 된다고한다..

 

아래 링크에 들어가서 데이터 베이스 생성을 누르면 된다.

RDS Management Console (amazon.com)

 

https://ap-northeast-2.console.aws.amazon.com/rds/home?region=ap-northeast-2#databases:

 

ap-northeast-2.console.aws.amazon.com

나는 MySQL을 사용할거라 MySQL을 누르고, 나머지는 기본 설정된 채로 가져갔다.

프리 티어 버전을 눌러야 과금 없이 1년 사용 가능,,

위 정보는 원하시는 대로 하시되, 잊으면 나중에 골치아파진다는 단점이 있다..

장고에 DB를 연동할 때 USERNAME 등을 입력해야하는데,

위 사진의 마스터 사용자 이름이 USERNAME으로 쓰인다.

설정은 위와 같이 했다.

스토리지 자동 조정 활성화에 체크를 하면 과금이 되니 꼭 체크 해제를 하자.

 

그 다음 설정은 아래와 같이 했다.

그리고

초기 데이터베이스 이름까지 지정하자!

 

(여담)

RDS 연결하고, 장고를 migrate하는데 오류가 엄청 떴었다

결국 RDS 삭제하고 다시 설치했는데

오류가 생기던 이유가 아마 이 초기 데이터베이스 이름 설정하는 것을 빼먹어서 그런거 같다....

그러니,, 지정하고 이름을 잊지 말자..

 

이후, 냅다 "데이터 베이스 생성" 버튼을 누르자

생성은 완료되었지만, 보안 그룹 설정을 변경해야한다!

 

보안 > 보안그룹> 인바운드 규칙 편집에 들어가자

보안그룹에 여러개가 있을 텐데, 아까 설정한 rds의 보안그룹을 누르면 된다

VPC 보안 그룹 아래의 링크를 클릭하면 된다.

위에서 인바운드 규칙 편집을 눌러서 규칙을 편집하자.

위와 같이, ec2라는 규칙을 추가했는데 ec2가 rds에 접근할 수 있게 하는 것이다.

 

3. Django 설정 변경

우리가 만든 프로젝트를 github 에 올리고, ec2 서버에서 접속해서 코드를 git clone 해서 실행해야 하는데,

그 전에 프로젝트에 db, ec2 정보등을 적어두어야 한다.

 

그런데 그 개인 정보가 적힌채로 github에 올리면 개인정보가 악용돼서 과금이 와장창 될 수도 있다.

그러므로 .env 파일에 개인정보를 적어두고,

gitignore에 .env를 추가하여 깃허브에는 올리지 말고, .env는 나만 보는 것으로 하자!

 

참고로 gitignore에 .env를 추가한 뒤, ec2에서 코드를 clone 받으면 .env파일이 없이 clone 된다.

중요한 정보 빼고 clone 된 것이므로, ec2에서 따로 .env파일을 생성해주어야한다.

나중에 nano .env 등을 이용해서 ec2 내에서 .env를 수동으로 작성하자.

 

그전에,

일단 github에 새로운 repository 부터 만들어 두자..

그리고 settings.py에서 데이터 베이스 부분을 아래와 같이 바꾸자

(import 및 pip를 해야할 수도 있다. 경고문구를 보고 적절히 설치하자)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': config("DATABASE_NAME"),
        'USER': config("DATABASE_USERNAME"),
        'PASSWORD': config("DATABASE_PASSWORD"),
        'HOST': config("DATABASE_HOST"),
        'PORT': config("DATABASE_PORT", cast=int),
    }
}

그리고 .env를 생성해서 아래 코드를 복붙하자.

참고로 장고 시크릿키도 깃허브에 올리면 안된다!! 

시크릿키를 포함해서, 아까 입력한 데이터 베이스 정보들을 복붙한 아래 코드에 추가해두자.

 

HOST 부분에는 RDS에 들어가서 "엔드포인트에" 있는 것을 쓰면 된다.

mysql.xxxxxxxxxxx.ap-northeast-2.rds.amazonaws.com 이런식으로 쓰면 된다.

 

NAME, USERNAME, PW는 아까 RDS 생성시 만든 것을 입력하면 된다. 잊으면 곤란하다 했던 그것..!

SECRET_KEY=
DEBUG=True
DATABASE_NAME=
DATABASE_USERNAME=
DATABASE_PASSWORD=
DATABASE_HOST=
DATABASE_PORT=3306

GitHub의 Django에서 민감한 정보 보호 | Delft Stack

 

GitHub의 Django에서 민감한 정보 보호

GitHub의 Django에서 민감한 정보를 보호하는 방법 알아보기

www.delftstack.com

위 링크를 참고하여도 좋다.

 

DB 설정을 바꿨으면 python manage.py makemigrations 를 하고 python manage.py migrate 를 하면된다

그런데 오류가 날 것이다!

pip install mysqlclient 를 해주고 다시 위의 두 명령어를 실행하면 된다.

 

이제 개인정보를 다 가렸고 migrate까지 마쳤다면 github 에 올려보자.

깃허브에 올리고, 서버에 접속해서 git clone (복사해서 다운받는다고 생각하면 됨)을 하는 과정을 거쳐야한다.

나는 파이참을 사용해서 프로젝트를 만들었는데, 터미널에

git init
git add *
git commit -m "first commit"
git remote add origin https://github.com/방금 만든 레포지토리 주소
git push -u origin master

을 입력하면 깃허브에 업로드 된다.

 

4. EC2 서버에서 Django작동하기

거의 다 왔다. 이제 ec2에서 git clone 을 받으면 된다

ec2에 어떻게 접속하느냐? putty 를 사용하면 된다.

putty를 다운받자.

 

그리고 ec2에 접속하기 위해 (window 운영체제의 경우) 아까 다운받은 키페어인 .pem 파일을 .ppk파일로 바꾸어야한다.

putty 를 다운받으면 puttygen도 같이 다운로드 되는걸로 알고있는데 puttygen에 들어가보자.

 

+) 처음부터 .ppk파일로 다운받았으면 puttygen을 거치는 과정을 패스하고 바로 putty에 접속하면 된다!

 

이렇게 뜨면, Load를 눌러서 아까 다운받은 .pem파일을 불러오자. .pem 파일이 뜨지 않는다면 

이 부분을 All Files로 바꾸면 뜰 것이다.

그리고 save private key를 하면 .ppk 파일이 생성된다.

생성되었다면 putty를 실행시켜보자.

이런식으로 뜰텐데, Host Name 부분에 아까 만든 서버의 IP 주소를 입력하자.

나는 ec2-*-**-**-**.ap-northeast-2.compute.amazonaws.com 이런식으로 입력했다.

( "*-**-**-**" 위치에는 각자의 정보를 입력한다.)

 

그리고 왼쪽의 SSH를 클릭하면 Auth가 뜨는데, 그 곳을 클릭한 후 아래 Browse를 눌러 아까 만든 ppk 파일을  불러오자.

그리고 Open을 누르면 어쩌구 저쩌구 창이 뜬다. Accept를 누르자.

 

+) 지금은 화면이 바뀌어서, SSH -> Auth -> Credentials -> Private Key file for authentications -> Browse 를 눌러 ppk 파일을 불러와야한다.

 

ppk 파일을 불러오고 Open을 누르면

login as : 라고 뜰텐데 거기에는 ubuntu 라고 입력해주면 된다.

성공적으로 접속했다!

 

여기서 git clone 을 해서 우리가 업로드해둔 프로젝트를 클론받고,

가상환경을 만들고, pip install -r requirements.txt 해서 필요한 패키지를 다운받고

python manage.py runserver하면 실행이 된다.

그리고 ec2-*-**-**-**.ap-northeast-2.compute.amazonaws.com 로 접속하면 runserver가 되고 있는 동안에 모두가 우리의 프로젝트에 접속할 수 있다! (localhost 로 접속했을 때랑은 달리, URL만 알면 누구나 접속이 가능한 것!)

 

그런데 여기서 runserver를 멈추거나, putty를 종료하면 접속이 불가능해진다.

왜냐하면 무중단 배포 작업을 하지 않았기 때문이다.

 

무중단 배포를 해서 24시간 내내 사람들이 나의 서버에 접속하게 하면 더 좋다.

그렇게 하기 위해 WSGI, Nginx 등을 사용하면 되는데, 아래의 블로그에 아주 친절히 설명되어있으니

더 해보고 싶은 사람들은 하면 좋을 것 같다. 

 

더 해보면 좋을 것들

- WSGI 사용해서 배포하기

- Nginx 사용해서 배포하기

- DNS 적용해서 배포하기

 

위의 것들을 하기 위해 참고하면 좋을 블로그는 다음과 같다.

Django 서비스 AWS로 배포하기 - [3] uWSGI 연결하기 — 네로의 다락방 (tistory.com)

 

Django 서비스 AWS로 배포하기 - [3] uWSGI 연결하기

Django 서비스 AWS로 배포하기 - [1] 프로젝트 준비와 AWS 서버 대여 Django 서비스 AWS로 배포하기 - [2] github과 프로젝트 업로드 지난 포스트 까지 서버에 나의 프로젝트를 git을 통해 업로드 해보았습니

nerogarret.tistory.com

위 블로그를 따라해봤는데 무중단 배포까지 성공적으로 마칠 수 있었다!

'Dev > Cloud' 카테고리의 다른 글

[AWS] Lambda를 사용해보자 (+ REST API)  (0) 2022.10.01