본문으로 바로가기

AWS(Flask + uwsgi + Nginx)에 mysql 연동하기

category aws 서버구축 2021. 2. 3. 20:31

개요 

이전글과 이어지며 mysql기능을 추가하는 글이다.

aws서버를 사용하는 특징이있는데 db 연동을 할때 주의할점이 있다.

 

 

이전글: 2021/01/24 - [aws 서버구축] - docker-compose로 서버 구축하기(Flask + uwsgi + Nginx)(ubuntu)

 

docker-compose로 서버 구축하기(Flask + uwsgi + Nginx)(ubuntu)

도커 환경 세팅 본 환경은 aws ubuntu 18.04이다. start $sudo apt-get update $sudo apt-get upgrade python3 install $sudo apt-get install python3 $sudo apt install python3-pip docker install & setting $..

wpgur.tistory.com

 

1. [db/init.sql] 생성

  
use W2A;

CREATE TABLE UserInfo (
	id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
	username VARCHAR(30) NOT NULL,
	hashed_password VARCHAR(255) NOT NULL,
	email VARCHAR(50) NOT NULL,
	UNIQUE KEY EMAIL (email));

먼저 docker의 루트 디렉토리에 db 디렉토리를 생성한뒤 .sql 파일을 설정해준다. 이는 docker가 실행되면서 필요한 db를 생성해주는 역할을 한다

+미리 얘기하자면 로그인과 회원가입을 위한 초기 TABLE 설정이다.

 

여기서 W2A는 사용자가 사용할 DB명이며 이는 docker-compose.yml에서 생성 시켜준다. 

 

주의!!

처음 docker-compose up 할때 db가 생성되므로 첫 docker-compose up 때는 지정한 W2A(db)가 없어 제대로 실행이 안될수 있지만 이는 한번 더 실행하면 제대로 실행되므로 당황하지 말자.

 

 

 

2. [docker-compose.yml] 수정

docker-compose.yml

 

services 아래 db를 생성해주자.

     db:
                image: mysql:5.7
                restart: always
                environment:
                        - MYSQL_USER=admin
                        - MYSQL_PASSWORD=admin
                        - MYSQL_ROOT_PASSWORD=password
                        - MYSQL_DATABASE=W2A
                        - MYSQL_ALLOW_EMPTY_PASSWORD=yes
                volumes:
                        - ./db/:/docker-entrypoint-initdb.d/
                        - ./db/data:/var/lib/mysql
                ports:
                        - "3306:3306" 

의미를 설명하자면 environment를 통해 MYSQL의 비밀번호와 사용자를 설정해줄수있으며 MYSQL_DATABASE=W2A를 통해 W2A의 DB를 자동으로 생성해 주는 역할을 한다.

 

volume는 로컬 디렉터리의 특정 경로를 컨테이너 내부로 마운트하는 역할을 하는데

 

여기에서는 /db폴더를 경로로 줘서 이를 통해 안에 넣어둔 init.sql 파일을 실행시킬수 있고

/db/data를 경로로 줌으로써 자동으로 mysql에 필요한 파일들을 data 디렉토리를 생성한뒤 그안에 넣어주는 역할을 한다.

  flask:
                build: ./flask
                container_name: flask
                restart: always
                environment:
                        - APP_NAME=FlaskTest
                depends_on:
                        - db
                expose:
                        - 5000

또한 기존 flask에서 DB를 다룰예정임으로 depends_on: - db를 추가해준다.

 

 

3. [flask/requirements.txt]

requirements.txt

Flask-SQLAlchemy==2.4.4
PyMySQL==1.0.2

기존 파일에 다음과 같은 모듈을 추가 해주는데 python에서 db를 사용할때 필요한 모듈이다.

 

pymysql 모듈만 사용예정이지만 SQLALchemy를 모듈도 사용해 다루는 방법도 있으니 알려주기 위해 주가해봤다.

 

 

4. [flask/route/app_route.py] 수정

어쩌면 제일 핵심인 app_route.py를 수정할 것이다. 

참고로 필자는 flask/app.py에서 이를 불러 사용할 것이다.

 

 

 

import pymysql

본론으로 들어가서 flask에서 mysql을 연동하여 사용하기 위해선 먼저 pymysql을 import 시킨뒤

 

db = pymysql.connect(host='aws_public_ip', port=3306, user='root', passwd='password',db='W2A', charset='utf8')

cursor = db.cursor()

다음과 같이 db 서버에 연결을 시켜준다. 여기서 host는 aws public 주소를 사용해야하며 나머지 옵션은

docker-compose.yml에서 설정한 값을 입력해준다.

 

삽질....

퍼블릭 주소로 설정하지않고 localhost로 처음에 설정해주었더니 db를 연결하지못하고 server error가 계속 떴던 경험이 있다.

 

aws public 주소는

여기서 사용되는 주소이며 그냥 리눅스 서버를 사용하신다면 localhost로 박아놓으면 될것이다.

 

 

+데이터 사용 예시

# SQL query 작성
sql = """
            INSERT INTO UserInfo (username, hashed_password, email)
            VALUES (%s, %s, %s);
        """
        
 
# SQL query 실행
cursor.execute(sql)

 
# 데이터 변화 적용
db.commit()


#db 종료
db.close()

 

 

5. DB 연결 확인하는 방법

docker-compose up한뒤

cmd 창이든 리눅스 터미널이든 mysql에 aws 주소와 성정한 포트와 사용자를 입력해서 원격접속하면 잘 생성이 되었는지 안되었는지 확인해볼수 있다.

 

+또한 docker-compose.yml에 서비스로 phpmyadmin를추가한다면 db를 웹에서 관리할 수 도있는데 필자는 계속 서버주소가 프라이빗으로 설정되어서 제대로된 연결이 힘들어서 원격으로 db에 접속해서 확인하는 방법을 선택했다.

 

 

 

 

 

 

 

 

참고:up-to-date-items.tistory.com/7