AWS RDS + Django 데이터베이스 설정

박도준·2020년 7월 12일
9

Django+AWS+MySQL

목록 보기
4/6
post-thumbnail
post-custom-banner

RDS란?

Amazon Relational Database Service(Amazon RDS)는 AWS 클라우드에서 관계형 데이터베이스를 더 쉽게 설치, 운영 및 확장할 수 있는 웹 서비스입니다.

이 서비스는 산업 표준 관계형 데이터베이스를 위한 경제적이고 크기 조절이 가능한 용량을 제공하고 공통 데이터베이스 관리 작업을 관리합니다.

자세한 내용은 여기

지원하는 데이터베이스 엔진

  • Amazon Aurora
  • MySQL
  • MariaDB
  • Oracle
  • SQL Server
  • PostgreSQL

버전 지원 (참고)


MySQL 인스턴스 생성

MySQL 엔진을 사용하여 RDS 인스턴스를 생성해보겠습니다.

서비스 -> RDS 클릭

데이터베이스 항목에서 데이터베이스 생성을 클릭합니다.

db 생성 방식을 선택합니다.

손쉬운 생성을 선택하면 DB엔진만 골라서 인스턴스를 생성할 수 있으며, 추가적인 설정은 인스턴스 생성 후에 변경할 수 있습니다.

저는 설정들에 대한 정보를 알아볼 것이므로 표준 생성을 하겠습니다.

그리고 엔진 옵션에서 엔진 유형과 버전을 선택합니다.

사용하는 용도에 따라 템플릿을 선택합니다.

설명에 필요한 정보들을 기입합니다.

프리티어는 선택할 것 없이 기본값이 선택이 돕니다.

스토리지를 선택하는데 두가지 유형을 선택할 수 있습니다.

  • 범용(SSD) : 광범위한 데이터베이스 워크로드에 적합합니다. 3 IOPS/GiB가 기본적으로 제공되며 3,000 IOPS까지 버스팅 가능합니다.

  • 프로비저닝된 IOPS(SSD) : I/O를 많이 사용하는 데이터베이스 워크로드에 적합합니다. 1,000~30,000 IOPS 범위의 I/O를 프로비저닝할 수 있는 유연성을 제공합니다.

더 자세한 내용을 알고 싶다면 여기

스토리지 자동 조정 기능은 처리량이 급증하여 DB 여유 공간이 부족할 때, 자동으로 스토리지를 확장하는 기능입니다.

최대 스토리지 입계값은 해당 DB 인스턴스가 자동으로 확장할 수 있는 제한 값입니다.

다중 AZ 배포를 사용해 DB 인스턴스에 고가용성과 장애 조치 기능을 지원합니다.
어떻게 고가용성을 지원하는지 문서 참고

  • VPC/서브넷 그룹

    • VPC가 구성되어 있다면 선택하고, default를 사용해도 무방합니다.
  • 퍼블릭 액세스 가능

    • public ip를 할당하여 VPC 외부에서 DB 인스턴스 접근을 허용할 것인지를 체크합니다.
  • VPC 보안 그룹

    • 인/아웃바운드 규칙이 정의된 보안 그룹을 선택합니다.
    • EC2에서 접근하게 하려면, 보안그룹을 새로 생성한 후 EC2의 보안 그룹을 연결해줍니다.
  • 가용 영역

    • 가용 영역은 다른 가용 영역에서 발생하는 장애를 격리하여 고가용성을 개선하며 해당 리전의 지연 시간이 낮은 연결을 지원합니다.
  • 포트

    • MySQL 기본 포트인 3306을 사용합니다.

테이터베이스 인증 방법

  • 암호 인증
    • DB암호를 사용하여 인증
  • 암호 및 IAM 데이터베이스 인증
    • IAM 정책으로 인증

추가 구성은 필요에 따라서 수정하면 됩니다.

이렇게 설정을 마치고, 데이터베이스 생성을 하면 아래와 같이 생성된 것을 볼 수 있습니다.


Django에서 RDS 접근하기

이제 생성한 rds를 Django에 연결해보겠습니다.

settings.py에 들어가서 아래와 같이 DATABASES를 수정해줍니다.

  • NAME : 생성한 DB 이름(뒤에 생성한 데이터베이스의 이름을 적어줍니다.)
  • USER : RDS 생성시 입력했던 유저명
  • PASSWORD : RDS 생성시 입력했던 패스워드
  • HOST : RDS 엔드포인트 주소
  • PORT : DB 포트 번호

그리고 OPTIONS에 적혀있는 Strict Mode 설정을 하는 이유는 MySQL의 CHAR 나 VARCHAR 필드가 가진 글자 수 제한을 넘어서는 데이터가 입력되는 경우 제한된 글자 수 만큼만 데이터가 잘려서 입력된다거나, -1 을 입력했는데 0이 들어가는 문제를 막기 위함입니다.

Strint 모드를 설정하면 올바르지 않은 데이터가 입력되었을 때 오류를 일으키면서 데이터 입력이 되지 않습니다.
(Strict 모드는 기본적으로 설정되어있지 않으며, MySQL 5.7 버전 부터는 기본적으로 설정되어있다고 합니다.)

그리고 migrate를 실행한다.

python3 manage.py migrate


트러블 슈팅

에러 1. error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat)

django에서 제공하는 MySQL 연동 드라이버 모듈은 3가지가 있습니다.

  • MySQLdb - 제일 안정적인 드라이버, Python3는 지원하지 않음
  • Mysqlclient - MySQLdb를 개선한 패키지, Python3.3 이상의 버전도 지원하고 있음, 장고에서 추천함
  • MySQL Connector/Python - MySQL 개발사 오라클에서 제공하는 드라이버

저는 Mysqlclient를 설치했습니다.

pip install Mysqlclient

이때 에러1과 같은 에러가 발생하였습니다.
에러를 살펴보면 Microsoft Visual C++ 9.0를 설치하라는 것인데 용량도 크고 설치 기간도 오래걸리기 때문에 부담이 큽니다.

그래서 다른 해결 방법으로 Mysqlclient를 미리 컴파일된 pip용 whl파일을 다운받아 해결하는 것입니다.

whl파일 다운은 여기에서

여기서 자신의 python버전(cp)와 파이썬 비트(win)에 맞는 mysqlclient를 다운받는다.

다운 받은 파일을 django 프로젝트 내에 위치시킨다.

그리고 설치를 한다.

pip install [설치 경로]

에러 2. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

다시 실행해보면 아래와 같은 오류가 발생합니다.

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

이유는 장고 버전이 2.2. 로 업그레이드되면서 pymysql을 비롯한 몇몇 라이브러리들이 그 변화에 대응을 못하기 때문입니다.

그래서 장고 버전을 2.1로 다운그레이드 했습니다.

pip3 install django==2.1

에러 3.pymysql.err.OperationalError: (2003,"Can't connect to MySQL server on

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'android-akinator-mysql. cx2m6uauubyd.ap-northeast-2.rds.amazonaws.com' (timed out)")

제가 생성한 db가 외부에서 접속이 안되서 생기는 문제입니다.

생성한 db 인스턴스에서 VPC 보안 그룹을 클릭합니다.

그리고 인바운드에 위치 무관을 추가해줍니다.

에러 4. django.db.utils.InternalError: (1049, "Unknown database

django.db.utils.InternalError: (1049, "Unknown database 'android-akinator-mysql'")

이 에러의 원인을 찾고 해결하는데 오랜 시간이 걸렸습니다.

우선 이 에러는 db가 없어서 생긴 문제였습니다.
분명 Amazon rds에서 mysql 인스턴스를 만들었기 때문에 db를 생성했다고 생각했는데 여기서 제 생각이 틀린 것이였습니다.

우선 Amazon rds는 Amazon Relational Database Service로 클라우드에서 관계형 데이터베이스를 간편하게 설정, 운영 및 확장할 수 있는 서비스입니다.

이를 이용해서 mysql이나 mariadb등의 엔진을 만들 수 있습니다. 이것들을 실행하는 것이 db 인스턴스입니다.

저는 이 db 인스턴스를 생성하면 데이터베이스를 생성한 것이라고 생각했기 때문에 위의 에러에서 왜 unknown인지 알 수 없었습니다.

이제 에러의 원인을 알았으니 해결해보겠습니다.


MySQL Workbench이용하여 스키마 생성하기

스키마라는 용어가 나왔는데 MySQL은 3계층 구조로 데이터베이스가 존재하지 않습니다.
그렇기 때문에 MySQL에서 스키마를 데이터베이스라고 부르는 경우가 많습니다.

mysql workbench를 설치합니다.

설치를 완료하면 실행을 합니다.
MySQL을 연결해줘야 하기 때문에 MySQL Connections + 버튼을 클릭합니다.

그러면 아래와 같은 창이 뜹니다.

  • Connection Name : 아무 이름
  • Hostname : RDS의 엔드 포인트
  • Port : MySQL은 3306
  • Username : RDS를 만들 때 정했던 마스터 사용자 이름
  • Password-Store in Vault : RDS를 만들 때 정했던 마스터 암호

그리고 Test Connection을 하면 연결여부를 알 수 있습니다. 연결이 됐다면 ok를 누르고 나오면 방금 연결한 내역이 아래 화면에 있습니다.

선택하여 들어갑니다.

이제 db를 생성해보겠습니다.
아래 사진 빨간 네모로 표시해둔 db 생성 버튼을 누룹니다.

그러면 아래와 같은 화면을 볼 수 있습니다.

  • Name : 새롭게 생성할 스키마(db)의 이름
  • Collation : 해당 스키마에서 다국어를 사용하는 경우 '문자 집합'을 어떻게 사용할 것인지를 설정(저는 유니코드 기반으로 작업을 하기 때문에 utf8-utf8_bin으로 설정)

스키마에 대한 기본 정보를 입력했다면 아래의 그림처럼 'Apply' 버튼을 눌러서 스키마를 생성합니다.

그러면 제대로 설정했는지 창이 한 번 더 출력되고, 확인을 한 후 'Apply'버튼을 눌러 스키마를 생성합니다.

아래와 같이 Schemas 목록에 추가된 것을 볼 수 있습니다.

db를 생성했으므로 settings.py에 가서 NAME에 생성한 db명을 적어줍니다.
그리고 migrate를 하면 에러없이 동작하는 것을 볼 수 있습니다.

MySQL Workbench를 통해 db를 확인해보면 아래와 같이 테이블이 생성된 것을 볼 수 있다.

profile
Better late than never
post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 7월 12일

감사요

1개의 답글