서버개발자가 되는법 - #11 AWS RDS 세팅하기. Django에서 RDS 오로라(aurora) DB연동하기

     

목차 - 2020/09/29 - [Study/서버] - 서버개발자가 되는법 - 목차

 

유튜브 - 

 

 

 

들어가기 전에

 

이번 포스팅에서는 AWS에서 제공하는 데이터베이스 서비스인 RDS를 세팅하는 법을 진행하도록 하겠습니다. 아마 개인적으로 프로젝트하실 때 가장 많이 사용하는 게 mysql이나 porstgre를 쓰실 텐데요, AWS에서 제공하는 RDS에서도 mysql과 postgre를 제공합니다. 추가로 Aurora라고 하는 DB를 제공하는데, mysql과 흡사한데 내부적인 엔진 개선을 통해 mysql보다 5배 빠르고, postgre보다는 20배 빠르다고 합니다. 내부적인 데이터 저장방법이나 쿼리엔진을 개선해서 빠른 것 같습니다. 

 

그전에 RDS라는 서비스에 대해서 먼저 알아보면 좋을 것 같은데요, 우리가 mysql을 사용할 때 컴퓨터나 서버에 mysql을 설치해서 실행시키는데, RDS는 이미 설치된 mysql서버를 제공해주는 역할을 합니다. 다만 그 서버에 접속할 수는 없고 DB 자체만 서비스로 제공하게 됩니다. 이점이 장점이 될 수도 있고 단점이 될 수도 있는데, 서버에 설치하게 되면 서버와 DB 둘 다 관리해야 되는데 RDS를 사용하게 되면 DB만 관리하면 되기 때문에 관리적인 측면에서 공수를 아낄 수 있습니다. 하지만 서버 설정을 바꿔주면서 DB를 좀 더 세세하게 다루고 싶을 때는 RDS를 사용하는 게 단점이 될 수 있습니다. 

 

우리가 가장 많이 쓰는 EC2가 서버 인스턴스를 제공해주는 역할이라면 RDS는 DB를 제공해주는 역할입니다. 가장 많이쓰는 AWS 서비스 중에 하나죠. 하지만 RDS를 세팅하는 과정은 EC2만큼은 간단하지 않습니다. 많이 안 써서 생소한 것도 있긴 한데, 리플리케이션과 같은 설정들이 디폴트로 잡혀있기 때문에 하나를 만들면 두 개가 생성돼서 당황하기도 합니다 ㅎㅎ.

 

일단 여기서는 AWS RDS중에 Aurora를 이용해서 만들어 보고, Django와 연동까지 해보도록 하겠습니다. Aurora는 mysql과 매우 비슷하기 때문에 mysql를 사용하신 분이면 쉽게 사용할 수 있는 DB입니다. (대신 가격이 mysql보다 살짝 비쌉니다.)

 

 

 

RDS 세팅하기

 

일단 AWS 콘솔에 들어갑니다. 검색창에 RDS라고 치면 RDS서비스가 나옵니다.

RDS 검색하면 바로 나옴!
RDS 콘솔 화면

 

저는 현재 DB 인스턴스가 하나 있어서 1/40으로 되어있습니다. 왼쪽 메뉴에서 데이터베이스를 선택합니다.

 

데이터베이스 생성

현재 실행중인 데이터베이스를 확인할 수 있는 메뉴입니다. 제가 만들어놓은 Aurora MySQL이 하나 돌고 있군요 ㅎㅎ

오른쪽 위에 데이터베이스 생성 버튼을 눌러 새로 데이터베이스를 만들 수 있습니다.

 

생성 화면

 

표준 생성과 손쉬운 생성이 있습니다. 손쉬운 생성일 경우 디폴트로 이것저것 자동으로 해줍니다. 뭐뭐 설정할 수 있는지 확인해보기 위해 우리는 표준 생성으로 해봅시다.

 

가장 먼저 엔진을 고릅니다. 아까 말했듯이 AWS에서만 제공되는 Aurora가 제일 처음에 있습니다. (상술 보소?) 그 옆으로 MySQL, MariaDB, PostgreSQL, Oracle, MSSQL이 있습니다. Oracle까지 있다는 게 조금 놀랍습니다. 저희는 여기서 Aurora를 누릅니다.

 

 

Aurora를 선택하면 아래 에디션을 고를 수 있습니다. MySQL을 호환하는 Aurora가 있고 PostgreSQL을 호환하는 Aurora가 있습니다. 저는 MySQL이 편해서 MySQL을 선택하겠습니다. PorstgreSQL이 편하시면 PostgreSQL을 선택하셔도 됩니다. 나중에 DB 접속할 때 설정만 바꾸면 됩니다 ㅎㅎ

 

그 아래는 용량 유형정보가 있습니다. 프로비저닝과 서버리스가 있는데, 프로비저닝은 DB 사용량을 어느 정도 예측해서 클러스터를 구축해놓는 옵션이고, 서버리스는 부하에 따라서 Aurora가 알아서 조절합니다. 나중에 옵션을 조절할 수 있지만, 구축 시점에서 중요한 것은 프로비저닝으로 구축하면 DB인스턴스가 두 개가 뜨게 됩니다. 하나는 쓰기 전용, 하나는 읽기 전용입니다. 읽기 전용은 Read Replica라고 부르는데, DB에 쓰기는 지원하지 않고 읽기만 되는 인스턴스입니다. 쓰기 전용은 쓰기/읽기가 전부 되는 DB 인스턴스입니다. 쓰기 전용 DB인스턴스가 메인이고 읽기 전용 DB인스턴스는 복제된(Replication) DB입니다. 거의 실시간으로 데이터가 복제가 되는데 몇 ms정도의 오차는 있다고 합니다. (이전에 업무 회의에서 AWS에 물어봤는데 100ms 안쪽이라고 합니다.) 이렇게 읽기 전용 인스턴스가 있다면 '고가용성(HA)'를 구성하는데 매우 좋습니다. 하지만 사이드 프로젝트, 개인 프로젝트로 사용하기에는 너무 오버스펙이기 때문에 돈이 좀 아깝습니다 ㅎㅎ

 

프로덕션 or 개발/테스트

 

프로비저닝을 선택할 경우 아래 템플릿을 선택하는 옵션이 추가됩니다. 프로덕션과 개발/테스트가 있는데, 프로덕션을 누를경우 고가용성을 위해 두 개의 AZ에 인스턴스가 하나씩 생성되게 됩니다. AZ는 Available Zone이라고 해서 AWS 내에 물리적인 서버 위치라고 생각하시면 됩니다. AWS 서울 리젼에는 AZ가 4개가 존재하게 되는데 4개 중에 하나의 AZ가 장애가 나도 다른 3개는 멀쩡하기 때문에 고가용성을 위해 4개의 AZ를 나눠서 사용하게 됩니다. 따라서 처음 설계할 때부터 어떤 AZ를 사용할지, 몇 개의 AZ를 사용할지 선택해야 합니다. 여기서 프로덕션을 할 경우 어떻게 되는지 보기 위해 프로덕션을 선택해봅니다.

 

 

DB 설정

 

이제 DB 이름과 마스터 ID/PW를 설정하는 칸이 있습니다. 이름은 그냥 디폴트로 만들고, ID와 PW를 입맛대로 설정합니다. 나중에 DB에 접속할 때 사용할 ID이기 때문에 신중히 정하셔야 합니다.

 

 

DB 크기 설정

 

Aurora가 설치될 서버 인스턴스 크기를 결정할 수 있습니다. 메모리 최적화 클래스는 상당히 비싼 인스턴스이기 때문에 버스터블 클래스를 눌러서 t3.small로 해줍니다. ㅎㅎ 잠깐 만드는 건데도 돈 조금이라도 아껴야죠~!

 

 

가용성 설정

아까 얘기한 AZ 설정 옵션입니다. 다른 AZ에 복제본을/리더 노드 생성을 누르면 인스턴스 두개가 서로 다른 AZ에 뜨게 됩니다. 어떻게 뜨는지 확인하기 위해 냅둡니다 ㅋㅋ

 

연결 설정

 

이제 네트워크 설정 부분이 남았는데, VPC와 서브넷은 여러분이 따로 AWS 상에 VPC와 서브넷을 구축하지 않았다면 디폴트로 하시면 됩니다. 퍼블릭 액세스 옵션이 중요한데, 이 옵션을 켜야 여러분이 DB Tool을 이용해 해당 DB에 접속할 수 있습니다. 따러서 퍼블릭 액세스 옵션은 예를 눌러줍니다. 보안그룹 역시 여러분이 따로 설정하지 않았다면 디폴트를 눌러줍니다. 

 

추가구성

 

마지막으로 추가구성에서는 로그나 백업, 초기 데이터베이스 이름 등을 결정할 수 있습니다. 초기 데이터베이스를 정하면 나중에 Django와 연동하기 쉽기 때문에 하나 만들어줍니다. 여기서는 djangodb라고 지어놓겠습니다. 

 

DB 클러스터 파라미터 그룹은 DB의 설정값들을 저장해 논 그룹을 선택하는 옵션입니다. DB 설정값이라고 하면 DB의 세션정보다 기타 언어 설정들, 우리가 mysql config에서 설정할 수 있는 값들을 말합니다. 일단은 디폴트로 선택되어있는 값으로 진행합니다.

 

그 아래 옵션들은 로그관리, 백업관리 이기 때문에 그냥 넘어가겠습니다. 기본값으로 진행합니다.

 

데이터베이스 생성

 

마지막으로 데이터베이스 생성을 누르면 DB 인스턴스가 실행됩니다.

 

 

생성중

 

다시 데이터베이스 메인화면으로 돌아가게 되는데, 리전 클러스터 하나, 리더 인스턴스 두 개가 뜬 모습을 확인할 수 있습니다. 원래 하나는 라이터고 하나는 리더인데 처음엔 둘 다 리더네요. 애초에 라이터, 리더라니.. 번역이 좀 안 좋은 것 같습니다 ㅋㅋㅋ 영어 모드로 바꿀게요.

 

영어모드

바꾸는 사이 writer로 바뀌었네요. 필드 중에 AZ를 보시면 하나는 ap-northeast-2a, 하나는 ap-northeast-2d로 돼있는 것을 볼 수 있습니다. 서울 리젼(ap-northeast-2)에는 AZ가 4개가 있다고 했는데 각각 a, b, c, d로 구분됩니다. 따라서 쓰기 전용 인스턴스는 a AZ에서 실행되고, 읽기 전용 인스턴스는 d AZ에서 실행되고 있는 겁니다. 아직 status가 creating인데, available로 바뀌면 이 DB Tool을 이용해서 접속해보도록 하겠습니다.

 

 

DB Tool을 이용해서 접속해보기

 

저는 DataGrip이라는 젯브레인에서 나온 Tool을 사용합니다. 유료이기 때문에 학생이신 분은 학생 라이선스를 이용해 1년씩 무료로 사용할 수 있습니다. 인텔리J나 파이참을 사용하신 분이라면 UI가 비슷해서 쓰기 좋은 Tool입니다. DataGrip 말고 SQL워크벤치나 DB에버를 사용하셔도 됩니다. 접속 설정은 비슷하니까요~

 

MySQL 접속으로 설정

 

어떤 tool이든 간에 새로운 연결을 하는 옵션은 비슷합니다. MySQL연결을 한다고 선택하면 Host, User, Password, URL 등을 적으라고 나옵니다.

 

설정창

이름은 여러분이 원하는 대로 지으시면 되고, Host에는 URL을 적으면 됩니다. URL은 AWS 콘솔에서 확인 가능합니다.

 

DB 인스턴스를 누르면 Endpoint값이 나옴

 

Host, User, Password, Database를 입력하면 URL이 자동으로 생성됩니다. 생성되지 않으면 꾸른 Tool... jdbc:mysql://{Host}:{Port}/{Database} 형식으로 url을 수기로 입력하면 됩니다 ㅎㅎ.

 

Datagrip에서는 Test Connection을 해볼 수 있는데, 아래 Test Connection을 누르면 됩니다.

 

얄루~

 

DataGrip은 똑똑해서 이게 MySQL이 아니라 Aurora라는 정보도 줍니다. 젯브레인 짱~

 

만약 접속이 안된다면 포트 문제입니다. 저는 디폴트로 포트가 열려있는데, 혹시 안 열려 있을 수도 있거든요. AWS 콘솔에 가서 보안 그룹을 확인해야 합니다.

 

인스턴스를 눌러야 보안그룹 설정이 나온다

 

클러스터 말고 인스턴스를 누르면 보안 그룹 설정이 나옵니다. 보안 그룹이 default로 되어있는 게 보이는데 누르면 방화벽이 어떻게 설정되어 있는지 확인할 수 있습니다.

 

 

in-bound 설정

in-bound 설정에서 3306 포트가 전체로 열려있는지 확인합니다. 위에 밑줄 쳐진 게 없으면 3306 포트가 닫혀있다는 겁니다. 만약 없다면 추가해줍시다.

 

 

mychew DB 연결완료

 

DB는 만들었지만 테이블이 없어서 뭐 확인할 수 없습니다 ㅎㅎ

 

 

 

Django랑 연동해보기

 

이제 RDS에 만든 DB에 테이블을 생성해보도록 하겠습니다. 그냥 쿼리로 생성할 수도 있지만 Django랑 연동후 migrate 하게 되면 자동으로 테이블이 생성될 겁니다. 그럼 테이블도 생성하고 Django랑 연동도 해보고 1석 2조 ^^

 

Django 기본 프로젝트를 만들어봅시다.

 

mychew라는 기본 프로젝트 맨듬 ㅎㅎ

 

지난 강의들을 보신 분이면 settings.py에 DB설정이 있다는 걸 알고 계실 겁니다. 기본적으로 sqlite3으로 설정되어있는데 여기를 mysql로 바꿉니다. Aurora for MySQL이기 때문에 mysql로 설정해도 연동이 됩니다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST':  'database-1.cluster-cahfm1ikomik.ap-northeast-2.rds.amazonaws.com',
        'NAME': 'djangodb',
        'USER': 'mychew',
        'PASSWORD': 'cholol.tistory.com',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

 

아까 Tool에서 DB 접속할 때와 같은 값을 넣어주시면 됩니다. 이제 migrate를 해볼까요?

아 그전에 mysqlclient를 설치해야 합니다.

 

pip install mysqlclient

 

자 이제 진짜 migrate를 해봅시다.

 

(venv) C:\Users\tkdle\PycharmProjects\mychew>python manage.py migrate
System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
        HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangopro
ject.com/en/3.2/ref/databases/#mysql-sql-mode
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

(venv) C:\Users\tkdle\PycharmProjects\mychew>

뭐라 뭐라 나오죠? 그럼 다시 DB로 돌아가 볼까요?

 

테이블이 짠~

아까는 테이블이 없었는데, 지금은 테이블이 있습니다! 얄루~

우리가 model을 아무것도 안 만들었지만, Django 내부적으로 필수 기본 model들이 있기 때문에 migrate를 하게 되면 기본 테이블들이 생성됩니다. 

 

Django와 RDS 연동 끝~

 

 

 

 

정리하면서

 

이번 포스팅에선 RDS에 Aurora를 생성해보고, Django와 연동시키는 작업까지 완료했습니다. 이제 아마 개인적으로 프로젝트할 때 RDS를 사용해 보실 수 있을 겁니다. 하지만 여기서 다룬 건 연결 까지고 사용하면서 여러 가지 설정을 더 해줘야 합니다. 

 

예를 들면 mySql에 characterset 설정값 같은 건데, mysql 사용하면서 한글이 안되던 문제를 겪으신 분이 있을 겁니다. 그럴 때 mysql 설정에서 characterset을 바꿔줬었는데, 그런 설정들을 AWS 콘솔에서 DB 파라미터 그룹으로 설정할 수 있습니다. 

 

그리고 Django에서 DB에 접속하기 위해 ID/PW를 적어줬는데요, 이렇게 되면 누가 소스를 보면 DB에 계정 정보를 탈취할 수 있기 때문에 보안상 문제가 됩니다. 이런 경우 보통 id/pw를 환경변수에 등록해서 감추는 방법을 사용하곤 합니다. 윈도에서 환경변수 세팅이 번거롭기 때문에 이 포스팅에서는 다루지 않았습니다.(는 핑계고 귀찮아서.. mac에서는 .profile에 등록하기만 하면 되는데 ..ㅎㅎ) 내용을 알려드렸으니 한번 검색해서 찾아보세요~!

 

우리가 만든 RDS는 쓰기 모드와 읽기 모드가 있습니다. Django에서 두 가지 DB 인스턴스에 대한 정보를 입력해놓고, DB Write를 하는 코드에서는 쓰기모드 인스턴스를 사용하고 단순 조회만 하는 코드에서는 읽기모드 인스턴스를 사용한다면, DB 부하를 줄일 수 있기 때문에 서비스 속도가 향상됩니다. 단- 실시간을 보장하기는 하지만 완전 실시간은 아니라는 점을 참고하세요~!

 

RDS를 만드는 과정에서 여러 설정들이 있었기 때문에 한 번씩 바꿔가면서 어떻게 만들어지나 보는 것도 여러분들이 RDS를 사용하는데 도움이 됩니다. 하나하나 부딪혀보면서 배워봅시다~! 

 

 

 

 

 

 

 

반응형

댓글

Designed by JB FACTORY