situation
AWS EC2 (ubuntu) 인스턴스에 프로젝트를 배포하고 mysql을 설치한 상태이고,
로컬에서 원격 mysql을 관리하기 위해 로컬 dbeaver를 instance에 연결해야 하는 상황이다
하지만 dbeaver에서 인스턴스에 연결하려고 하면 timeout이 됐다
데이터베이스는 아무나 수정하는 것을 막기위해 정해진 user만 접근가능하고 user마다 비번을 입력하여야 접근할 수 있다.
접근할 수 있는 user가 뭐가 있는지
먼저 인스턴스 상 mysql의 user를 확인해봤다.
일반적으로 MySQL 사용자 계정은 username@hostname의 형식으로 이루어져 있다.
mysql에 접근하기 위해서는 이 세 가지가 맞아야 한다.
- username: 유저이름
- 호스트: 접근을 요청하는 origin
- 유저의 비번
그래서 root@localhost를 살펴보면
root은 현재 mysql이 위치한 로컬의 유저이므로 로컬 mysql 접근이 가능한 것이다.
하지만 내가 원하는 것은 내 컴퓨터의 dbeaver에서 => EC2 인스턴스로 접근하는 것이다
이는 인스턴스 입장에서 보면 외부의 누군가가 로컬(인스턴스)로 접근하려는 것과 같다.
그럼 이 상황에서 나의 컴퓨터가 아무리 원격 mysql에 접근하려고 해도 다음과 같은 이유로 접근할 수 없다.
- 내 컴퓨터의 유저는 root이 아니다
- 현재 접근가능한 호스트는 localhost밖에 없다
- 유저도 없는데 비번이 있겠냐
따라서 접근하고 싶으면 새로운 user를 추가해줘야 한다
유저 추가
- 유저이름은 아무거나 정한다
- 내 컴퓨터의 고정된 호스트이름
- 비번은 설정하면 된다
난 2번 호스트 이름을 임시로 %로 설정했다.
%는 모든 호스트에서든 접속을 허용한다는 것을 의미하는데
내 컴퓨터가 고정된 IP가 없기 때문이다. (고정된 IP주소가 있다면 보안을 위해 그것을 쓰길 추천한다. )
자 그럼 다음의 명령어로 유저를 추가해 보자
CREATE USER 'ujunglim'@'%' IDENTIFIED BY '비번';
추가한 뒤 새로고침
FLUSH PRIVILEGES;
Inbound rule 추가
EC2 Inbound rule은 외부에서 내부로 들어오는 데이터의 도착 및 처리를 관리하는 규칙이다.
이는 일반적으로 방화벽 등의 보안 장치에서 설정하며, 외부로부터의 접근을 허용하거나 차단하는 데 사용된다.
즉 외부에서(dbeaver) => EC2 인스턴스에 접근하려면 이때 사용되는 포트와 프로토콜을 허용해야 한다는 것이다.
이는 AWS Security Groups 탭의 Edit inbound rules에서 추가할 수 있다.
Type은 mysql을 선택하고 0.0.0.0/0로 소스를 지정해 줬다
0.0.0.0/0는 해당 포트에 대한 모든 IP 주소의 외부 연결을 허용한다는 의미이다.
port는 인스턴스의 문들이며 debeaver는 이 허용된 문으로 인스턴스와 연결한다.
이제 dbeaver를 확인해 보자
dbeaver가 원격 mysql에 연결됐고 추가한 유저ujunglim도 보인다.
이제 사용자가 CRUD를 동작하면 나의 Express서버에서 쿼리를 날려 인스턴스 안의 mysql를 수정할 수 있고
dbeaver에서 인스턴스 내의 데이터베이스의 상황을 확인할 수 있다
참고
https://stackoverflow.com/questions/15872543/access-mysql-remote-database-from-command-line