개요 🔔

이번 포스팅에서는 진행중이었던 DDocker 프로젝트를
파이어베이스에서 Node.js 서버로 마이그레이션 하는 과정에서
Firestore 의 기능을,
AWSEC2MySQL 을 설치하여 구현하는 방법을 기록하고자 한다.


RDS 란 ❔

데이터베이스를 다루다 보면,
비 관계형 데이터베이스 (NoSQL)관계형 데이터베이스 (SQL) 들을 한 번쯤은 들어 봤을 것이다.

RDS 는 관계형 데이터베이스의 약자이며,
AWS 에서 제공하는 클라우드 형태의 관계형 데이터베이스를 AWS RDS 라고 칭한다.

만약,
데이터베이스를 로컬에서 관리한다고 가정해보자.
제일 먼저 이를 관리할 개발자가 필요할 것이며,
서버의 과부하로 인해
사용자가 데이터베이스에 접근하지 못하는 경우를 대비하여 24시간 내내 감시할 사람이 필요 할 것이다.

이를 위해 중앙화 된 서버(클라우드) 를 통해 위와같은 불편함을 대신 처리해주는 역할을
AWSRDS 서비스가 대신 처리 해 준다.

하지만,
해당 포스팅에서는 AWSRDS 서비스를 사용하지 않고,
이 모든 과정을 직접 경험 해 보고자
직접 EC2 안에 관계형데이터베이스 (MySQL) 을 설치하여 사용하는 목적으로 작성하고자 한다.


MySQL 설치 💻

터미널에 아래 리눅스 명령으로 MySQL 서버를 설치 해 준다.

apt-get install mysql-server

위 사진과 같이 Permission denied 에러가 발생한다면 sudo 명령을 통해 관리자 모드로 접근 하면 된다.

sudo apt-get install mysql-server

설치가 끝난다면 아래와 같은 화면을 볼 수 있을텐데,
이를통해 MySQL 서버가 정상적으로 설치 됬음을 알 수 있다.

Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
👉 시스템의 커널이 최신 상태이며, 업데이트를 통해 변경된 부분이나
재시작이 필요한 서비스, 컨테이너, 사용자세션, 가상머신 등이 없음을 의미한다.

설치된 MySQL 의 버전을 확인한다.

mysql --version

그리고,
데이터베이스를 실행하는 명령어를 입력하는데, 명령어를 실행하면 터미널에 아무것도 출력되지 않는게 정상이다.

sudo service mysql start

실행중인 데이터베이스를 확인하려면 아래 명령어를 실행하면 된다.

sudo service mysql status

이미 EC2 에 MySQL 이 설치가 되어있었다..🤦‍♂️
해당 게시물 참조 👉 https://bit.ly/3TMAz7J


사용자 설정 👶

설치 후 MySQL 을 실행하면,
임시로 root 계정과 비밀번호가 발급되어있는 상태이므로
CLI 명령으로 데이터베이스에 접근하여 계정과 비밀번호를 변경 해 주어야한다.

만약, 암호 설정 없이 EC2 를 종료 할 경우 찾을 방법이 없다.
초기화 하는 방법이 있지만 다소 번거로운 작업이 필요하다.

sudo mysql -u root -p

초기 상태이므로 비밀번호를 입력하라는 Enter password: 가 나온다면 엔터 키를 누르면 된다.

아래 명령을 통해 비밀번호를 변경 할 수 있다.

5 버전의 경우 👉 UPDATE user SET PASSWORD=PASSWORD("암호") WHERE user="root";
8 버전의 경우 👉 ALTER user "root"@"localhost" identified WITH mysql_native_password BY "변경할 비밀번호";

이전과 같이 빈 값을 입력하여 root 사용자에 접근하려하면 에러가 발생하고,
변경한 비밀번호를 적게되면 정상적으로 접근이 가능함을 확인할 수 있다.


외부 접근 허용 👋

MySQL 에서 제공하는 GUI 프로그램인 Workbench 를 통해
할당받은 EC2 IP 주소로 접근하려하면 에러가 발생할 것이다.

아래와 같이 EC2인바운드 규칙 을 추가 해 주어야 한다.

그리고, 다시 터미널로 돌아와
mysqld.cnf 파일을 수정 해 주어야 한다.

먼저 관리자 계정으로 접근하고,
/etc/mysql 경로로 이동하여 bind-address 를 찾아 수정 해 주면 된다.

grep -r 'bind' ./

cd 명령으로 해당 경로로 이동 후, 설정 파일을 열어 해당 부분을 0.0.0.0 으로 변경 해 주면 된다.

이제 진짜 마지막이다 ❗❗
다시 터미널로 돌아와 MySQL 서버를 재 시작 해 주면 끝이다.

sudo systemctl restart mysql

MySQL Workbench 에서 생성된 데이터베이스에 접근 해 보겠다.

에러 발생….🤮
오 하지만 에러를 금방 해결할 수 있을 것 같다..❗


계정 생성 👼

위 에러 메세지를 보면,
외부 환경인 EC2 에 내가 접근하려고 하는데,
내부 ip 주소로는 외부 ip 주소에 접근할 수 가 없기 때문에 접속 가능한 계정을 생성 해 주어야 한다.

  • 계정 조회

아래 명령을 통해 외부, 내부 ip 에 접근 가능한 계정을 생성 해 준다.

CREATE USER '계정아이디'@'localhost' IDENTIFIED BY '비밀번호';
CREATE USER '계정아이디'@'호스트' IDENTIFIED BY '비밀번호';

그리고, 생성한 계정에 권한을 부여 해 주어야 한다.

GRANT ALL PRIVILEGES ON *.* TO '계정아이디'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO '계정아이디'@'호스트';

권한 부여 후에는 이를 적용하는 명령어를 실행 해 주어야 한다.

FLUSH PRIVILEGES;

모든 적용이 끝난 후 다시 MySQL WorkBench 에서 생성한 외부ip 접근 가능 사용자 정보를 입력하고,
Test Connection 을 해 보면 정상적으로 연결이 됨을 확인할 수 있다 ✨


인코딩 방식 변경 🔮

아래 설정은 기존의 UTF-8 방식의 4Btye 가변 길이 인코딩 방식을 적용하는 방법이다.

MySQLUTF-8 방식의 인코딩 방식을 지원하지만,
3Byte 방식을 지원했었으며 이후 업데이트를 통해 4Btye 를 추가했다.
👉 이는 MySQL 5.5 & MariaDB 5.5 이후 버전에서만 사용 가능하다.

루트 경로로 이동하여
/mysql 디렉토리에 있는 my.cnf 파일에 vim 에디터를 사용하여 접근한다.

vim 은, 별도의 설치 없이 파일을 수정할 수 있는 에디터 기능을 제공한다.

파일 내부로 진입했다면, 네모 박스의 옵션을 추가 해 주고 저장한다.

파일의 변경이 있을 경우, 재시작을 해 주어야 한다.

sudo service restart mysql

Reference 🌊

https://velog.io/@ghldjfldj/AWS-RDS%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-zuaaizv4
https://velog.io/@cptkuk91/AWS-EC2%EC%97%90-MySQL-%EC%84%A4%EC%B9%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
https://joonyon.tistory.com/entry/MySQL-root-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%84%A4%EC%A0%95
https://www.lesstif.com/dbms/mysql-error-1698-28000-89555999.html
https://goddaehee.tistory.com/292
https://goddaehee.tistory.com/331