영웅은 죽지 않는다

[AWS] EC2 우분투와 MySQL 연동 삽질 과정 본문

Programming/Web

[AWS] EC2 우분투와 MySQL 연동 삽질 과정

YoungWoong Park 2022. 6. 5. 02:06

 

 

 

[Web] AWS EC2 서버 구매 및 접속하기 (Mac OS 기준)

AWS EC2 서버 구매하기 https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2 위 사이트에 접속해서 인스턴스 설치를 해야 한다. 오른쪽 위의 인스턴스 시작을 누른 뒤에, 나는 리..

heroeswillnotdie.tistory.com

 

위 글의 [ FileZilla 설치 및 응용 ]에서

4. 내 서버에 파일 넣기

까지는 똑같은 과정이다.

 

저기서는 Flask와 MongoDB 기준으로 AWS 설정을 했고

지금 하고 있는 프로젝트는 Django와 MySQL로 진행하고 있기에

 

그 이후 과정부터는 설정값을 조금씩 바꾸어 주어야 한다.

 

그리고 저 글에서는 파이참 기반이어서 포트가 5000 또는 5001번이었고

여기선 vscode로 돌렸기에 8000번이다.

 

이것들을 바탕으로 세팅 시작

 

 

기본 EC2 서버 환경 세팅

 

1. 한국시간 세팅

 

sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

2. 파이썬 세팅 (python3 -> python)

 

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

 

3. pip 세팅 (pip3 -> pip)

 

# pip3 설치
sudo apt-get update
sudo apt-get install -y python3-pip

# pip3 대신 pip 라고 입력하기 위한 명령어
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1

 


 

MySQL 설치 및 EC2와 연동

 

1. 우분투 서버 업데이트 및 mysql-server 설치

 

sudo apt-get update
sudo apt-get install mysql-server

 

 

2. MySQL 설치 및 실행여부 확인

 

dpkg -l | grep mysql-server

 

sudo netstat -tap | grep mysql

-> 여기서 netstat에 에러가 발생하면

sudo apt install net-tools 를 통해 net-tools를 설치하면 된다고 한다.

 

 

 

3. MySQL 접속 및 사용할 DB 생성

 

sudo mysql -u root -p

 

CREATE DATABASE <DB 이름>;

SHOW DATABASES; # 잘 만들어졌는지 확인

 

4. User 생성

 

나는 username을 root로 설정했다.

 

USE <DB 이름>
CREATE user 'root'@'%' IDENTIFIED BY '<비밀번호>';

 

여기서도 삽질을 살짝 했었다.

'%'의 의미는 외부 접근 권한을 부여하는 것인데,

저기에 localhost를 넣었다가 자꾸 localhost에 대한 권한 에러(Access denied for ....)가 자꾸 나서 ㅠ

사람을 미치게 했었다

 

뭐 보안이 중요한 프로젝트라면 host를 지정해주는 게 맞기는 하지만

크게 상관이 없다면 host를 %로 지정해서 기존에 사용하던 계정에 외부 접근 권한을 허용하자..

 

 

5. User 사용 권한 설정

 

grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges # 변경 내용을 메모리에 적용

 

여기서도 위와 같이 외부 접근 권한을 허용했다.

 

show grants for root; # 권한 적용 확인

 

권한 적용이나 테이블 관리 등은 타이핑 하나하나에 심혈을 기울여서 하도록 하자.

 

구글링 첫번째 내용으로 슥슥 하다가 내 환경이랑 다르면

다시 죄다 revoke 해야하고 drop 해야하고 난리가 나버린다

 

 

6. 외부 접속 설정

 

- conf.d 디렉토리로 이동

(디렉토리가 다른 경로에 있다면 그곳으로 이동한다.)

 

cd /etc/mysql/mysql.conf.d

 

 

 

- mysqld.cnf 파일 수정

 

sudo vi mysqld.cnf

 

들어가게 되면, 수많은 에디터 설정값들이 나온다.

그곳에서는 입력 모드로 전환하지 않으면 일반적인 백스페이스, 타이핑 등이 먹지 않는다.

아래를 확인하고 집중하자

 

- 입력 모드로 전환하기 -> a

- 입력 모드 빠져나오기 -> esc

- 내용 저장하고 에디터 빠져나오기 -> 콜론(:) 누른 후 (wq) 적은 후 엔터

 

이것을 바탕으로, 설정값들 중 bind-address를

127.0.0.1 에서 0.0.0.0 으로 변경한다.

 

외부 설정을 허용하기 위한 것이다.

 

 

7. AWS EC2 인스턴스에 MySQL 접속 포트 추가

 

- 인스턴스 -> 보안 -> 보안 그룹 -> 인바운드 규칙 편집

 

 

8. MySQL WorkBench 연동

 

- Hostname에는 본인의 퍼블릭 IPv4 주소값을 입력

- Username에 본인의 username 입력

 

Test-Connection으로 연결 성공 여부 확인

 

 

9. 기존 본인 파일에 Host 값들 수정하기

 

나같은 경우,

Django 내에서 pymysql 라이브러리로

내 로컬과 MySQL 서버로 연동하는 코드가 있었다.

 

db = pymysql.connect(host='localhost', user='root', password='*******',
                    db='capston', charset='utf8mb4')

 

위와 같이 작성되어 있는 부분이 있었는데,

host 값을 localhost가 아닌 내 퍼블릭 IPv4 주소로 바꾸어 주어야 한다.

 

또, settings.py에서도

 

DATABASES = my_settings.DATABASES
SECRET_KEY = my_settings.SECRET_KEY

 

 

위처럼 보안을 위해서 database와 secret key 값을 my_settings.py에서 불러오도록 했었고,

git ignore가 돼있는 my_settings.py를 들어가면

DATABASES 부분에서도 'HOST':'localhost'로 입력이 되어 있었다.

 

그 부분도 똑같이 바꾸어 준다.

 

 

 

10. Filezilla에서 우분투 서버로 내 파일 업로드

 

 

수정한 파일들을 파일질라의 드래그 앤 드롭으로 서버로 옮기거나,

 

아니면 깃허브에 커밋&푸쉬 후 클론을 새로 받아오자.

 

 

 

11. utf8 또는 utf8mb4 설정

 

ㅎr.. 여기서 많은 시간을 보낸 것 같다

 

내 코드에는 pymysql로 데이터베이스에 직접 INSERT하는 코드가 있었는데,

 

거기에는 한글을 포함해 이모티콘까지 있어서

기존 내 로컬에서는 utf8mb4로 바꾸어 주었었다.

 

근데 내가 위에서 CREATE TABLE로 생성했을 때 기본 값을 적용하지 않아서

따로 지정을 해주었어야 했다

 

이것저것 해보았는데, 갓 스오플에서 해결한 코드가 있다.

 

일단 sudo mysql -u root -p를 통해 mysql로 접속하자

 

sudo mysql -u root -p

ALTER DATABASE <DB 이름> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

원래는 내 DB를 use한 상태에서

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

를 입력했었는데

자꾸 똑같은 에러가 발생하는 것이었다

 

그냥 각 테이블이 아닌 DB 전체를 바꾸어 보니까 돼더라

 

 

12. 기쁘게 runserver

 

 

여기까지 왔으면 python manage.py runserver 정도는 2초만에 타이핑 할 것인데

 

왜인지는 모르겠으나 0:8000으로 접속해야 내 퍼블릭 주소로 넘어간다고 한다.

아마 외부 접속을 허용해서 그런듯??

 

참고로 SSH 접속 끊어도 서버가 계속 돌게 하려면

 

nohup python manage.py runserver 0:8000 &

 

위 코드를 입력하면 된다.

 

완성

 

 

Quit the server with CONTROL-C.가 뜬 걸 보고 기분이 너무 좋아서 쓰는 글.

 

 

 


 

참고한 블로그

 

 

[AWS] AWS EC2에 mysql 설치하기 (ubuntu)

1. ubuntu 패키지 정보 업데이트 sudo apt update 2. mysql 설치 apt를 이용하여 mysql 을 설치합니다. 설치 과정에서 y/n를 묻는 문구가 나오면, y 를 입력하여 설치합니다. sudo apt install mysql-server 3...

mirae-kim.tistory.com

 

 

"Incorrect string value" when trying to insert UTF-8 into MySQL via JDBC?

This is how my connection is set: Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password); And I'm getting the following er...

stackoverflow.com