Django:제로부터 시작하는 인스타그램 만들기 - DevOps #3 - docker를 이용한 mysql 연결해보고 AWS RDS도 사용해보기

     

 


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

 

 

 

 

 

 

시작하기 전에

지난 시간에 nginx와 uwsgi를 이용해서 장고서비스를 EC2에 띄웠습니다. 지금도 잘 되는지 한번 접속해 봐야겠군요.

 

로그인!

 

로그인!

 

43.201.26.170

 

접속이 잘 되네요 ㅎㅎ 

하지만 언제까지 이렇게 ip주소로 접속할 수는 없으니 도메인을 하나 적용해야겠습니다. 제가 자주 사용하는 건 무료 도메인 서비스인 duckdns입니다.

 

Duck DNS (www.duckdns.org)

 

Duck DNS

Duck DNS free dynamic DNS hosted on AWS news: login with Reddit is no more - legal request support us: become a Patreon

www.duckdns.org

 

위 사이트에 접속해서 구글로 로그인하고, 원하는 도메인 이름 선택하면 xxx.duckdns.org로 접속이 가능합니다. 저는 djangoinsta.duckdns.org로 만든 다음 제 ec2에 ip주소를 넣어주었습니다.

 

djangoinsta.duckdns.org/main 으로 접속~!!

자 이제 도메인도 넣었겠다 본격적으로 DB를 바꿔볼까요?

 

 

 

sqlite3은 뭘까?

DB의 종류는 매우 많은데, django의 경우 따로 설정하지 않으면 sqlite3이라는 db를 사용하게 됩니다. sqlite3은 파일에 저장되는 db이며 아주 간단하게 사용할 수 있다는 장점이 있는 db입니다.

 

공홈 - SQLite Home Page

 

 

이 DB 설정은 django프로젝트에 settings.py에 가면 확인할 수 있습니다.

 

...
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

...

위처럼 DATABASES = 하고 django.db.backends.sqlite3이라고 되어있는 것을 확인할 수 있습니다. 만약 우리가 DB를 다른 것으로 바꾸고 싶으면 바로 이 부분을 수정하면 됩니다.

 

 

일단 mysql 띄우기

제 경험상 개인용으로 사용하는 DB는 크게 두 개로 나뉘는데 mysql과 postgredb입니다. 학생분들이나 멘티분들 만나보면 대부분 이 둘 중에 하나를 사용합니다. 기준은 저도 잘 모르겠네요 ㅋㅋ 

 

아무튼 여기서는 mysql을 사용할 예정입니다. 제가 django프로젝트에 연동할 목적으로 mysql을 사용하는 방법은 몇 가지가 있는데, 제일 선호하는 방식은 docker를 이용해서 mysql을 사용하는 방식입니다. 저희가 지난 시간에 설치했던 nginx나 uwsgi처럼 서버 자체에 mysql을 설치해도 되긴 합니다. 하지만 저희의 궁극적인 목표는 AWS에 있는 RDS를 이용해 DB를 사용하는 것이기 때문에, 서버에 직접 설치하지 않고 docker로 mysql을 설치해서 연동해 보고, 바로 RDS로 넘어가도록 하겠습니다.

 

사실 docker로 mysql 띄우는 건 명령어 한 줄만 입력하면 됩니다. 하지만 그전에 docker가 깔려있어야 하는데요, EC2를 만들면 기본으로 설치되어 있으면 좋은데,, 한번 docker라고 명령어를 입력해 봅니다.

 

 

어림없쥬?

 

설치가 안되어있네요 ㅎㅎ 그래도 친절하게 어떻게 설치하라고 나옵니다 ㅋㅋ 

 

보통 내 컴퓨터에 docker를 설치할 때는 docker-desktop을 설치하는데, 서버에는 docker-ce를 설치해야 합니다. docker-ce는 community engine의 약자인 것 같은데 docker 엔진만 따로 설치됩니다. docker-ee는 community와 반대로 기업용인 enterprise engine인 것 같습니다. 

 

설치 방법은 아래와 같습니다.

 

curl -fsSL https://get.docker.com/ | sudo sh
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기

알아서 설치됨

위에 줄을 입력하면 알아서 설치되고, 아랫줄은 현재 로그인한 유저한테 docker권한을 주는 명령어입니다. 없으니까 나중에 실행할 때 에러가 나더라구요. 설치 후 docker라고 치면 이전과 다르게 뭐라 뭐라 뜨는 걸 확인할 수 있습니다.

 

이제 docker로 mysql을 실행하면 되는데, 아래 한 줄을 입력하면 됩니다.

 

docker run --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_PASSWORD=password mysql

 

기본적으로 docker run은 docker를 실행하는 명령어이고, 그 뒤에 옵션을 주르륵 달면 됩니다. 여기서 사용한 옵션은 --name으로 실행하는 docker 컨테이너에 이름을 넣어주고, -p옵션으로 포트를 정해주었습니다. mysql의 경우 기본적으로 3306 포트를 사용하기 때문에 외부에서 들어오는 3306 포트를 docker 컨테이너의 3306 포트로 포워딩할 수 있도록 -p 3306:3306이라고 적어줍니다. -e는 환경변수를 주는 옵션인데 MYSQL_ROOT_PASSWORD와 MYSQL_PASSWORD를 추가합니다. 이 패스워드는 나중에 django 설정에 넣어야 하니 여러분이 원하시는 비밀번호를 입력하시면 됩니다. 마지막으로 맨 뒤에 mysql은 docker 컨테이너를 실행할 이미지를 가리키는데, mysql이라고 입력하면 docker 서버에 있는 mysql 공식 이미지를 이용해서 docker 컨테이너를 실행합니다. 특정 버전을 명시해 줄 수 있지만 그냥 mysql이라고 쓰면 최신버전으로 설치됩니다. 

 

보통 mysql은 5.7, 8.0 두 가지 버전을 많이 사용하는데, 저희는 그냥 최신버전을 설치하겠습니다. 아마 mysql이라고 치면 8.0이 설치되었던 것 같은 느낌이네요.

 

permission denied

만약 위와 같이 권한 오류가 난다면, 터미널 껐다 켜면 됩니다.

 

docker로 mysql 실행

제대로 실행이 되면 mysql:lastest 버전의 이미지를 다운로드하는 글씨가 나오고, 그 후에 mysql이 구동되는 글씨들이 쭈르륵 나옵니다. 그리고 바로 mysql이 실행되어 버리기 대문에 터미널에서 뭘 할 수가 없습니다. ㅎㅎ 백그라운드로 실행되게 해야 하는데 일단은 바로 실행되게 만들었습니다.

 

mysql이 실행중인 모습

 

 

내 컴퓨터에서 mysql 접속해 보기

 

자 그럼 mysql이 잘 떠있는지 확인하기 위해서는 컴퓨터에서 DB접속하는 프로그램으로 접속해 보면 됩니다. 저는 젯브레인에서 만든 DataGrip이라는 툴을 사용하고 있습니다.

 

host와 user, password 입력

host는 우리의 EC2를 입력해 주고, port는 3306으로 지정합니다. 그러면 EC2의 3306으로 통신하게 되고, 우리가 docker를 실행할 때 3306으로 들어온 외부 통신은 docker에 있는 3306으로 포워딩하기 때문에 mysql과 통신하게 됩니다. 

 

하지만 지금 아무 설정 없이 하게 되면 통신 실패가 뜰탠대요, AWS console에서 방화벽을 열어주어야 합니다. 

 

mysql open

mysql은 아까 말한 것처럼 3306 포트를 사용합니다. AWS RDS에서 제공하는 Aurora도 Mysql과 똑같이 3306을 기본으로 사용합니다. 나중을 위해 체크~!

 

포트를 열고 다시 datagrip으로 돌아와서 접속시도를 해보면 아까는 Fail이 떨어졌는데 지금은 Success가 됩니다.

 

성공

 

자 이제 DB가 생긴 것을 확인했으니, django에서 해당 DB를 바라보도록 settings.py를 수정합니다. 

 

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '43.201.26.170',
        'NAME': 'mysql-db',
        'USER': 'root',
        'PASSWORD': 'password',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

 

위에 주석처리된 것은 sqlite3 설정이고, 아래가 mysql설정입니다. ENGINE 설정값이 기존에 sqlite3에서 mysql로 바뀐 것을 확인할 수 있습니다. 그밖에 서버 주소인 HOST, DB이름인 mysql-db, 포트 3306등이 추가된 것을 확인할 수 있습니다. 이제 한번 로컬에서 django를 실행해 보겠습니다.

 

에러~!

 

그냥 실행하면 did you install mysqlclient?라는 에러를 볼 수 있습니다. 이건 저희 프로젝트에서 mysql을 사용할 준비가 안되었다는 건데요, mysql을 사용하려면 mysql 지원 패키지를 설치해야 합니다. 설치는 간단합니다. pip install mysqlclient 하면 됩니다.

 

여기서! 아마 많은 분들이 에러를 만나실 텐데,, python에 mysqlclient가 상당히 문제가 많습니다. OS별로 어디는 잘되고 어디는 안되고 그러거든요 ㅋㅋ 아마 맥에서는 x-code 버전에 따라서 될 대가 있고 안될 대가 있고 그렇습니다 ㅡㅡ 오히려 윈도는 에러가 날 경우 이전 버전을 설치해서 해결되는 경우가 있습니다.

 

pip install mysqlclient==2.0.3

 

맥의 경우 아주 다양한 해결방법들이 있는데, 해결방법이 에러 케이스마다 다르기 때문에 구글링 하시는 걸 추천드립니다. 이렇게 개발환경 구성하는 게 까다로워서 아싸리 django 역시 docker로 띄우는 걸 선호하긴 합니다. (여기서는 쌩으로 하지만,, ㅎㅎ)

 

mysqlclient가 설치되었다면 다시 로컬에서 django를 실행해 봅니다.

 

unknown database 'mysql-db'

 

에러가 나네요. mysql-db라는 데이터베이스를 알 수 없다고 나오는데 왜일까요?

 

우리는 EC2에서 도커로 mysql-db라는 이름의 mysql을 실행했습니다. 그래서 database이름을 mysql-db라고 적었지만, 사실 도커의 이름이 mysql-db이지 database의 이름이 mysql-db가 아닙니다. 괜히 같은 이름으로 했더니 헷갈리는군요.

 

DB이름을 변경하겠습니다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '43.201.26.170',
        'NAME': 'djangoinsta',
        'USER': 'root',
        'PASSWORD': 'password',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

 

name을 djangoinsta로 변경했습니다. 다시 한번 django를 실행해 볼까요?

 

다시 에러 발생

이름만 바뀌고 같은 에러가 나오는군요. 이건 실제로 djangoinsta라는 db가 없기 때문입니다. 장고는 기본적으로 ORM을 지원하고, ORM이란 모델 = 테이블 이 자동으로 매핑된다는 의미입니다. 이 기능을 활용하기 위해 필요한 것이 바로 migration인데요, 저희가 장고를 사용하면서 모델을 변경할 때마다 해주던 migrate를 해주어야 DB가 생기게 됩니다. 기존에 sqlite3은 우리가 제일 처음 migrate를 해주었기 때문에 사용할 수 있었고, mysql 역시 migrate를 해주어야 사용할 수 있습니다. 

 

그럼 python manage.py makemigrations, python manage.py migrate를 해봅시다~!

 

같은 에러

역시 Unknown databse가 나오는데요, 이건 저희가 mysql로 db를 띄웠지만, 거기서 djangoinsta라는 db를 생성하지 않아서 그렇습니다. 가장 초기에 database를 생성하는 건 사용자가 해주어야 합니다.

 

datagrip에서 create schema를 통해 우리가 띄운 mysql에 djangoinsta라는 database를 추가해 줍니다.

schema생성

요게 어디서는 database라고 부르는데 어디서는 schema라고 부릅니다. 아주 용어가 헷갈리죠?

django_devops에서 오른쪽 클릭을 해서 create schema를 해줍니다. 이름은 우리가 장고 settings.py에서 설정했던 djangoinsta이고 collation에 utf8 mb_general_ci를 선택해 줍니다. 요건 테이블에 들어가는 문자에 대한 인코딩인데, 요걸 안 해주면 한글이 테이블에 들어가면 깨지게 됩니다. 

 

생성완료

생성을 하면 그림처럼 djangoinsta 항목이 생기게 됩니다. 이게 django_devops라는 mysql서버에 있는 database가 생긴 겁니다. 다시 migrate를 하면 이제 에러가 안나는 것을 확인할 수 있습니다.

 

완료

자 이제 migrate가 완료되었습니다. datagrip에서 보면 실제로 테이블이 생긴 것을 확인할 수 있습니다.

 

생겼다~!

자 이제 django를 실행해 봅니다. 

 

실행 완료

 

제대로 실행되는 것을 알 수 있습니다. 

 

서버에 있는 django와 mysql 연동

 

이제 수정한 settings.py를 서버에도 적용해 봅시다. github에 push 하고 서버에서 pull~!

 

settings 수정버전 적용 완료

아 저희가 mysqlclient를 설치했으니 서버도 마찬가지로 설치를 해야겠네요. 통일하기 위해서 requirements.txt에 추가해 줍니다.

 

pip freeze를 통해서 requirements.txt 업뎃

서버에서도 설치를 위해 pip3 install -r requirements.txt를 해줍니다.

에러 발생!!

 

아니 ㅋㅋ 우분투에서도 mysqlclient 설치하다가 에러가 나는군요.. 크흑..

 

하지만~! 구글링 해보면 아주 간단하게 답이 나옵니다 ㅎㅎ 

 

sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

 

위 명령어로 mysqlclient관련 패키지를 설치해 주면 됩니다. 

성공

 

이제 django를 재시작하면 되는데 재시작하는 방법은 uwsgi 서비스를 내렸다 올리면 됩니다. 

 

sudo systemctl restart uwsgi

 

그리고 /tmp/uwsgi.ini 로그를 한번 확인해 봅시다.

정상 실행 확인

 

잘 실행되었군요? 그럼 인스타에 접속해 볼까요?

 

잘 실행됨~!

잘 실행되는데 뭐가 바뀐 건지 모르겠군요 ㅎㅎ 이럴 때는 회원가입이나 글을 써보면 됩니다. 우리는 DB를 mysql로 바꿨기 때문에 데이터가 저장되면 mysql에 생기게 되기 때문이죠.

 

테스트 회원가입

회원가입을 했으면 다시 datagrip으로 가서 테이블을 확인합니다. 

 

테이블에 데이터 확인~!

제대로 적용이 되었으면 User테이블에 데이터가 한 건 생긴 것을 확인할 수 있습니다~!!! 구우우웃~!!!

이제 django와 docker로 실행한 mysql과의 연동 한 단계가 끝났습니다~!

 

 

Secret 정보들 관리

RDS와 연동하기 전에 하나 수정해야 할 부분이 있는데요, 현재 장고 프로젝트를 보면 DB접속 패스워드가 노출되어 있습니다. 

 

떡하니~

그 밖에도 DB user이름이나 host ip가 코드에 적혀있는데, 이대로 github에 올리게 되면 public repo라면 공개적으로 노출됩니다. 그럼 다른 사람들도 볼 수 있기 때문에 내 서버에 들어와서 나쁜 짓(?)을 할 수 있겠죠? 실제로 이렇게 github에 코드를 잘 못 올려서 해킹되는 사례가 많습니다. 

 

요런 민감한 정보들을 Secret data라고 부르기도 하는데요, 요론 정보들은 보통 환경변수를 통해 관리하거나 별도 솔루션을 사용해 관리합니다. 저희도 이런 정보들을 환경변수로 바꿔보겠습니다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ.get('MYSQL_HOST'),
        'NAME': os.environ.get('MYSQL_DB_NAME'),
        'USER': os.environ.get('MYSQL_USER'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

 

자 이런 식으로 바꿔줍니다. os에 혹시 빨간 줄이 난다면 settings.py 맨 위에 import os를 추가해주어야 합니다. 

 

os.environ.get('XXX')라는 게 환경변수 'XXX'의 값을 받아오겠다~라는 뜻입니다. 환경변수라는 건 윈도에서는 아마 여러분이 JAVA를 설치할 때 설정해 보셨을 텐데, 제어판 어디 어디 들어가서 세팅하는 OS에 종속적인 상수값입니다. 리눅스에서는 보통. bash_profile이나. profile에 PATH로 추가하면 됩니다. 

 

저는 윈도우에서 쓸 때는 잘 세팅 안 하기 때문에... 먼저 우분투에서 어떻게 세팅되는지 한번 보여드리겠습니다.

 

홈 경로에 있다

 

우분투 홈경로에 가서 ls -la를 하게 되면 숨김파일까지 표시되는데요, 여기서. profile을 열어봅니다.

 

.profile

요론게 나오는데 여기 맨~~ 아랫줄에 하나를 추가합니다.

 

요롷게

이렇게 추가하면 환경변수 세팅이 끝납니다. 터미널을 껐다 켜거나 source. profile을 해서 변경한 환경설정을 적용해 줍니다. 그리고 세팅된 값을 확인해 보려면 echo &{변수명} 하면 됩니다.

 

변수명 설정 완료

 

쉽쥬? 이제 소스에는 DB에 대한 호스트값이나 유저이름, 비밀번호들이 입력되지 않고 서버에 있는 환경변수값을 읽어서 세팅하게 됩니다. 요게 지금은 서버가 하나라 저희가 직접 들어가서 세팅하지만, 나중에 서버가 많아지면 자동으로 설정되게 만들어야 하고, 이게 힘들면 이렇게 공개되면 안 되는 중요정보들을 관리하는 솔루션을 사용하게 됩니다.

 

이제 서버에서는 환경변수값을 읽어서 사용하는데, 로컬에서는 어떻게 사용하게 될까요? 방법이 여러 가지가 있는데, 내 컴퓨터에도 환경설정 값을 넣어주는 방법이 있고, 로컬환경에 알맞은 값을 디폴트로 세팅하는 방법이 있습니다. 1번은 내 컴퓨터에 환경변수를 설정해줘야 하는데, 저는 사용하는 컴퓨터가 여러대라 일일이 세팅하기 귀찮더라고요. 그래서 후자를 많이 씁니다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ.get('MYSQL_HOST', '43.201.26.170'),
        'NAME': os.environ.get('MYSQL_DB_NAME', 'djangoinsta'),
        'USER': os.environ.get('MYSQL_USER', 'root'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD', 'password'),
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

요롷게 콤마로 default값을 줄 수 있습니다.

 

그런데 이렇게 되면 이전과 똑같이 정보가 노출되지 않나요?라고 생각할 수도 있는데, 지금은 서버에서 사용하는 값과 같은 값을 디폴트로 써서 그렇지, 실제로 서버에서 사용하는 mysql이랑 내 컴퓨터에서 사용하는 mysql은 다를 겁니다. 지금은 서버에 mysql을 접속하게 만들었지만 보통은 로컬에서 테스트할 때는 로컬용 mysql을 띄워놓고 사용하기 때문에 정보가 다르겠죠? 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ.get('MYSQL_HOST', 'localhost'),
        'NAME': os.environ.get('MYSQL_DB_NAME', 'djangoinsta'),
        'USER': os.environ.get('MYSQL_USER', 'root'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD', 'localdb_password'),
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

요론식으로요.

 

아무튼 이렇게 적용해 놨으니 한번 제대로 실행되는지 서버에 코드를 배포해 봅시다.

 

서버에 적용

git pull로 소스를 반영하고 uwsgi를 재부팅해줍니다. 그리고 /tmp/uwsgi.log를 확인하거나 직접 브라우저로 접속해서 제대로 실행되는지 봐줍니다.

 

에러없음!

에러가 없네요~! 아마 설정값을 제대로 못 읽어왔다면 mysql을 못 찾는다는 에러가 발생했을 겁니다. 제대로 적용 됐는지 확인하는 방법도 있는데 python 콘솔에 접속해서 직접 코드를 때려보면 됩니다.

 

직접 코드로 때리기

환경변수값이 잘 나오죠? 

 

 

AWS RDS로 적용하기

 

자 이제 마지막으로 AWS에 RDS를 사용해서 연결해 보도록 하겠습니다. 방법은 생각보다 심플합니다.

 

  • AWS에서 RDS를 이용해 aurora(mysql) DB를 만든다.
  • 기본 database를 만들어준다. (djangoinsta schema생성해 준 것처럼 RDS에서도 생성해줘야 함)
  • 환경변수값을 위에서 만든 DB 정보로 바꿔준다.
  • 마이그레이션을 한다.

먼저 RDS를 생성하기 위해 AWS 콘솔로 접속합니다.

 

RDS 생성메뉴

콘솔에서 RDS 대시보드로 넘어간 뒤 새로운 데이터베이스 생성을 누릅니다.

그럼 위 화면처럼 어떤 DB를 만들 건지 선택하라고 나오는데, 요 화면이 거의 매년 바뀌는 것 같네요 ㅋㅋ 관련 포스팅을 여러 번 쓴 거 같은데 매번 화면이 바뀌니... 

 

일단 저희는 Aurora를 만들 겁니다. 옆에 MySQL도 있는데 Aurora는 AWS에서 MySQL을 자기네들이 조금 커스터마이징 한 DB입니다. AWS피셜로 성능이 5~13배 정도 좋다고 하네요. 실제로 사용하는 데는 MySQL과 똑같기 때문에 Aurora를 고릅니다. 

 

개발용

프로덕션과 개발/테스트 템플릿을 고르는 게 나오는데 프로덕션을 선택하면 클러스터로 구성해서 DB가 두 개가 생기게 될 겁니다. 개발/테스트 선택!

 

관리자 계정 생성

그 아래는 클러스터 구분인데 요건 DB가 여러 개 생길 경우 DB이름 앞에 prefix를 정하는 겁니다. DB가 A, B가 있으면 {클러스터이름}-A, {클러스터이름}-B로 표기됩니다. 

 

그 아래는 admin계정을 정하는 게 있는데 요건 여러분이 원하는 비번을 설정해 주시면 됩니다. 아마 저희가 따로 DB계정 생성해서 쓰지 않을 것이기 때문에 요게 django에서 RDS로 접속할 때 쓰이는 계정이 될 것 같습니다.

 

성능 설정

그 아래는 인스턴스 스펙을 설정하는데, 처음엔 엄청 고급모델이 선택되어 있습니다 ㅎㄷㄷ 저희는 돈이 없으니 가장 싼 t3.small을 선택합니다. 요것도 공짜요금입니다.

 

HA

그 아래는 가용성 및 내구성이 있는데, 요건 HA라고 해서 High Available 설정입니다. 회사에서 HA, HA 거리는데 가용성이라고 쓰면 되지 왜 자꾸 HA라고 해서 못 알아먹게 하나,, 생각했었던 기억이 있네요 ㅋㅋㅋ 

 

일단 가용성이란 말은 DB가 문제가 생겼을 때 정상작동을 지원하는 성능(?)이라고 생각하시면 됩니다. 가용성이 높으면 장애가 나도 서비스가 되도록 알아서 처리해 준다는 의미입니다. 여기서 다중 AZ를 선택하게 되면 DB가 여러 개 생기게 됩니다. 이렇게 여러 개를 생성하면 한쪽에서 장애 나면 다른 쪽 DB로 서비스되기 때문이죠. 나중에 서비스용으로 할 때는 가용성을 선택하는 게 좋으나, 저희는 일단 없어도 되기 때문에 아래를 선택합니다.

 

길다..

그다음 설정은 좀 내용이 깁니다. 네트워크 정보를 입력하는 건데 디폴트로 해도 무난합니다. 다만 하나 봐줘야 하는 게 있는데 '퍼블릭 액세스'라고 되어있는 부분을 체크해야 합니다. 이걸 체크 안 하면 외부에서 DataGrip이나 MySQL WorkBench 같은 툴로 접속이 안됩니다. 요거 체크해 주시고, 다른 VPC설정이나 기타는 디폴트로 하겠습니다. 요거는 글로 설명하기는 좀 길어서,, 유튜브영상에서는 설명하도록 하겠습니다. ㅎㅎ 궁금하시면 유튜브로,,

 

생성!

그 밖에 설정은 특별한 게 없기 때문에 데이터베이스 생성을 누릅니다. 

 

DB생성은 한 5분? 정도 걸리는 것 같네요. 클라우드 서비스기 빠른 경우가 있고, 느린 경우가 있어서.. ㅋㅋ 저는 한 5분 걸린 것 같습니다.

 

생성중...

생성되는 동안 방화벽 작업을 해둡니다. 위처럼 DB가 생기는데 2개가 생기는 것처럼 보이지만 위에는 클러스터(그룹)라서 그냥 그루핑 해주는 놈입니다. 아래 라이터 인스턴스라고 쓰여있는 놈이 진짜 DB인데, 애를 선택해서 보안그룹을 눌러줍니다. 

 

방화벽 설정

 

저는 기존에 RDS 사용하는 게 있어서 이것저것 추가가 많이 되어있는데, 여러분들은 3306으로 0.0.0.0/0만 있으면 될 겁니다. 이게 퍼블릭 액세스 옵션을 켜면 자동으로 생기는지 기억이 안 나네요. @_@ 만약 있다면 그냥 냅두시면 되고, 없으면 추가하시면 됩니다.

 

실행 완료

방화벽 설정하는 동안 실행이 됐네요. 여기서 연결 & 보안에 있는 엔드포인트를 잘 보셔야 합니다. 이게 저희가 접속하는 DB의 HOST입니다. 

 

데이터그립 접속

이전에 EC2에 띄운 docker-mysql처럼 데이터그립에서 AWS RDS로 접속합니다. host는 위에서 말한 엔드포인트를 적어주시면 되고 user와 password는 아까 설정한 admin 계정을 사용하면 됩니다. 자세히 보면 Driver를 Aurora로 바꿨는데, 데이터그립은 MySQL과 Aurora를 구분하더군요. 그냥 MySQL을 사용하셔도 됩니다. (MySQL WorkBench에서도 접속 가능)

 

접속을 하면 똑같이 djangoinsta라는 DB를 만들어줍니다.

 

똑같이 만들어주기

 

DB를 만들었으니 이제 마이그레이션을 해주면 되는데요, docker-mysql을 할 때는 로컬에서 마이그레이션을 시켜줬는데, 이번엔 서버에서 마이그레이션을 시켜주겠습니다. 

 

일단 변경된 DB로 접속하도록 환경변수를 수정합니다.

 

.profile변경

HOST를 바꿔주고 USER와 PASSWORD를 세팅합니다. PASSWORD는 여러분이 설정한 PASSWORD를 입력하면 됩니다.

 

마이그레이션

프로젝트 경로로 이동한 다음 migrate!! 그럼 마이그레이션이 진행되는 화면을 볼 수 있습니다. 

 

다 끝나고 DataGrip에서 테이블이 정상적으로 생성되었는지 확인합니다.

 

테이블 생성

이제 django를 재실행하고, RDS에 연결이 잘 되었는지 확인합니다.

 

sudo systemctl restart uwsgi

정상실행 확인

 

실행해 보았는데 아직 docker-mysql로 접속하고 있는 것을 확인했다. 왜!?

혹시나 해서 docker를 내려보았다.

 

mysql 내리기

 

docker ps를 하면 구동 중인 도커 컨테이너 리스트가 나온다. 여기서 docker stop {container id}로 실행 중인 도커를 종료할 수 있다. down인 줄 알았는데 틀렸음.. ㅎㅎ

 

docker를 끄고 다시 접속해 보았더니...

mysql경로가 바뀌지 않았따.

mysql경로가 바뀌지 않았다. 확인해 보니 uwsgi를 사용할 경우 환경변수를 읽지 못한다는 것이다. 뚜루루...

그래서 아마 우리가 환경변수를 읽지 못했을 대 디폴트로 넣어놓은 값으로 DB가 연결되었고, 잘되고 있는 줄 착각하고 있었던 것이다. 

 

이럴 때는 당황하지 말고, uwsgi.ini에다가 환경변수를 추가하면 된다.

 

[uwsgi]
socket = /home/ubuntu/uwsgi.sock
master = true
processes = 1
threads = 2
chdir = /home/ubuntu/django_zero_to_instagram_devops
wsgi-file = Jinstagram/wsgi.py
chmod-socket = 666
vacuum = true
die-on-term = true

logger = file:/tmp/uwsgi.log
pythonpath = /home/ubuntu/.local/lib/python3.8/site-packages

env=MYSQL_HOST=database-1-instance-1.cahfm1ikomik.ap-northeast-2.rds.amazonaws.com
env=MYSQL_USER=admin
env=MYSQL_PASSWORD=adminpassword
env=MYSQL_DB_NAME=djangoinsta

 

이렇게 되면 문제는 uwsgi.ini를 github에 추가해 놨었는데, ini파일은 github에서 빼야 한다는 것이다. ㅋㅋㅋ 이런 서버 설정 같은 건 코드에서 빠지는 게 맞지...

 

gitignore에 추가

자 이제 실행해 보면 정상적으로 실행됩니다. 

 

가입테스트
확인 완료!

 

 

 

마치며

이번 포스팅에서는 docker를 이용해 mysql 띄우기, RDS를 이용해 aurora 띄우기를 해보고, 우리가 만든 django 서비스와 연결했습니다. RDS 같은 경우는 실무에서 굉~~ 장히 많이 사용하기 때문에 사용법을 알아두면 좋습니다. 물론 실제로 사용할 때는 환경 세팅이 매우 복잡한 경우가 많지만요. 아마 devops팀에서 잘 세팅해 줄 겁니다 ㅎㅎ 

 

devops 편을 3개 정도 만들었는데, 이 정도면 사실 어느 정도 개인 프로젝트 서비스하는데 많은 정보가 담겨있지 않나,, 생각이 되네요. 더 하고 싶은 건 음.. 자동배포를 만든다거나 django와 uwsgi도 docker로 만드는 내용? 요 내용은 기존 포스팅에 많으니 상관없긴 한데, 자동으로 이미지를 말아서 배포까지 되게 만들면 좋은데 말이죠.

 

다음 포스팅에서는 자동화 관련으로 준비해 보아야겠습니다. 자동화 부분은 살짝 어려울 것 같아서 유튜브 영상은 두 개로 나눠야겠네요 ㅎㅎ 

 

그럼 오늘은 여기까지~~

반응형

댓글

Designed by JB FACTORY