개발놀이터

데이터베이스 서버와 애플리케이션 서버를 분리해보자 : 실전4 (MySQL 설치, DBeaver 연결) 본문

사이드 프로젝트/온라인 쇼핑몰 ver.4

데이터베이스 서버와 애플리케이션 서버를 분리해보자 : 실전4 (MySQL 설치, DBeaver 연결)

마늘냄새폴폴 2023. 8. 13. 18:41

우리는 앞서 private subnet에 접근하는데 성공했습니다. 이제 여기에 도커와 MySQL을 설치하고 외부 연결 서비스인 DBeaver에 연결해보도록 하겠습니다. 

 

이전 포스팅과 이어지는 포스팅입니다. 

https://coding-review.tistory.com/454

 

데이터베이스 서버와 애플리케이션 서버를 분리해보자 : 실전3 (EC2 연결)

앞선 포스팅에서 우리는 EC2 인스턴스를 생성했습니다. 이제 우리는 EC2 인스턴스에 접속해보도록 하겠습니다. 이전 포스팅과 연결되는 포스팅입니다. https://coding-review.tistory.com/453 데이터베이스

coding-review.tistory.com

 

도커로 MySQL 띄우기

우선 도커와 도커 컴포즈를 다운받습니다. 

 

$ sudo apt-get update
$ sudo apt-get install docker
$ sudo apt-get install docker-compose

우리가 만약 NAT 게이트웨이를 설정하지 않았다면 위의 명령어는 에러를 내뱉습니다. 

 

NAT 게이트웨이를 통해 외부 네트워크 통신이 가능했기 때문에 가능한 명령어입니다. 

 

이제 MySQL을 컨테이너로 띄워보죠. 

 

$ (sudo) docker pull mysql:8.0.33
$ mkdir docker
$ cd docker
$ vim docker-compose-mysql.yml

 

docker 이미지를 풀링하는데 만약 에러가 뜬다면 sudo를 붙여서 한번 도전해보세요! 

 

이제 docker-compose 를 만들어봅시다. 

 

version: "3.8"
services:
  db:
    image: mysql:8.0.33
    container_name: mysql-container
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/ks/datadir:/var/lib/mysql

이렇게 만들어 두고 이제 실행해서 컨테이너를 띄워보죠.

 

$ sudo docker-compose -f ./docker-compose-mysql.yml up -d

 

이렇게 MySQL을 띄웠습니다. 

 

이제 사용자를 만들고 연결이 진짜 됐는지 확인하기위한 테스트 데이터베이스를 하나 만들고 DBeaver로 접속해보겠습니다. 

 

패스워드는 아까 우리가 만든 yml 파일에서 만든 password입니다. 

 

mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

이렇게 사용자를 만들어두고 데이터베이스를 하나 만들어보죠

 

좀 특이한 이름을 지어야 이따 DBeaver에 연결했을 때 바로 알 수 있을 것 같아서 특이한 이름을 하나 만들었습니다. 

 

자 이제 DBeaver로 가보죠. 

 

DBeaver 연결

 

왼쪽위 연결 버튼을 클릭하고 MySQL을 선택합니다. 

 

SSH 탭에서 다음과 같이 입력합니다. 

 

1. Use SSH 체크

2. Host/IP 에 우리가 만든 application-server EC2 인스턴스의 퍼블릭 IPv4를 입력합니다. 

3. User Name 에 우리는 Ubuntu 22.0.4 LTS 버전이기 때문에 ubuntu를 입력합니다. 만약 아마존 리눅스라면 ec2-user를 입력합니다. 

4. Authentication Method 를 Public Key로 바꿔주고

5. Private Key에 우리의 ppk 키를 pem 키로 변환한 뒤 pem 키를 입력합니다. 

 

여기서 잠깐! ppk 를 pem으로 변환하는 방법

PuTTY를 설치했다면 puttygen이라는 exe 파일이 있을겁니다. 우리는 puttygen을 이용해 ppk 를 pem으로 바꿀겁니다. 

Load를 누르고 우리의 application.ppk 파일을 선택합니다. 

 

이렇게 선택이 되었고 위의 메뉴에서 Conversions에서 Export Open SSH Key를 클릭합니다. 

 

모두 예를 누르고 원하는 이름을 입력합니다. 저는 application.pem 으로 만들었습니다. 

 

그럼 이렇게 pem 키가 만들어집니다. 

 

'

이걸 DBeaver Private Key에 넣어줍니다. 

 

Test tunnel configuration을 눌러보면 Connected가 잘 보입니다. 만약 Auth fail이 뜬다면 DBeaver 버전업을 하셔야합니다.

 

그리고 다시 Main으로 돌아옵니다. 

 

1. Server Host 에는 우리의 database-server의 프라이빗 IPv4를 입력합니다. 

2. Username에는 이전에 MySQL 컨테이너 내부에서 create user 'test'@'%' identifed 'password'; 를 기억하시면 됩니다. 

3. Password에는 identified 뒤에 적었던 password를 입력하면 됩니다. 

 

이제 Test Connection 을 클릭하면?

 

어? 이건 뭐죠? 

 

이건 allowPublicKeyRetrieval을 True로 설정해주지 않아서 그렇습니다.

바로 이부분입니다. 위의 Driver properties 의 저부분을 TRUE로 바꿔줍니다. 

 

바꾸고 Test Connection을 누르면?

 

이렇게 잘 연결된 것을 볼 수 있습니다. 

 

이제 우리가 만들었던 igotyou 데이터베이스가 있는지 확인해봐야죠!

 

잘 있군요. 

 

마치며

자 이렇게 길고도 긴 여정이 끝났습니다. 

 

우리는 VPC와 서브넷, 라우터와 라우팅 테이블, 인터넷 게이트웨이, NAT 게이트웨이에 대해서 개념적으로 알아봤고, 실전을 통해 데이터베이스 서버와 애플리케이션 서버를 분리했습니다. 

 

스프링하고 연결하는건 정말 어렵지 않기 때문에 포스팅하지 않았습니다. 스프링하고의 연결은 application.yml 파일에 datasource 부분의 url을 

jdbc:mysql://<database-server의 프라이빗 IPv4>:3306/<데이터베이스 이름>?serverTimezon=UTC&characterEncoding=UTF-8

이렇게 적어주면 됩니다. 

 

어? 스프링 프로젝트는 어떻게 private subnet에 접근할 수 있는건가요? 

 

그것은 바로 스프링 프로젝트 자체가 public subnet에 위치하고 있기 때문입니다. 기억을 잘 떠올려보면 우리가 private subnet에 접근하기 위해 어떤 절차를 거쳤었죠? 

 

맞습니다. pem 키를 가지고 프라이빗 IPv4에 접근했습니다. public subnet에서는 프라이빗 IPv4 주소만 알고 있으면 언제든지 라우팅 테이블을 통해 접근이 가능합니다. 

 

우리는 private subnet의 라우팅 테이블을 SSH 통신이 가능하게끔 22포트를 열어줬고 MySQL을 사용할 것이기 때문에 3306 포트를 열어줬었죠? 

 

때문에 public subnet에 존재하고있는 스프링 프로젝트는 프라이빗 IPv4와 3306 포트만 알고 있으면 언제든지 접근할 수 있습니다. 

 

이 방식은 우리가 DBeaver로 private subnet에 위치하고 있는 데이터베이스에 연결한 것과 같은 이치입니다. 

 

자 이렇게 긴 여정을 끝내도록 하겠습니다. 블로그 포스팅만 거의 4시간 가까이 걸렸네요. 

 

정말 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~