프레임워크/AWS

AWS EC2에 MySQL 배포하기

Julie825 2025. 3. 27. 22:35

도커 컴포즈로 서버랑 같은 컴퓨터에 DB를 띄우려고 씨름하다가, 내가 왜 확장성도 없이 이런짓을 하나 싶어서 DB를 별도 인스턴스로 분리하기로 결정했다. 그리고 DB 설정 오류 잡는데에 3일이 걸렸다.

한번 설정 꼬이면 에러가 산으로 가서 인스턴스를 몇번을 지웠다 만들었는지 모르겠다.

삽질을 하며 알아낸 것은 아래 스텝을 무조건 지켜야한다는 것이다.

 

1. EC2 인스턴스 생성

Amazon Linux 쓰면 괜히 꼬이는 것같아서 ubuntu 이미지를 사용하였다.

그리고 도커를 사용할 계획이라면, t2.small 이상을 선택해야 시스템 오버헤드를 감당하는 것 같다.

 

좀 내리면 네트워크 설정이 나오는데, 우측 상단의 편집을 눌러서 인바운드 / 아웃바운드 모두 IP, 주요포트를 열어주자.

 

인바운드 주요포트

- 22 : 우리 컴퓨터가 EC2에 ssh를 연결해야한다.

- 3306 : MySQL 기본 포트이다.

아웃바운드 주요포트

- 80, 443 : EC2속에서 HTTP(or HTTPS)로 라이브러리 받아와야한다.

 

2. sudo모드 진입 + mysql 설치

편리한 아마존 콘솔에서 인스턴스 id를 누른 후 우측 상단 '연결'을 눌러 브라우저로 콘솔에 진입하자.

 

매번 sudo 입력할 수 없으니 'sudo su' 명령으로 root 유저로 전환한 후, mysql을 받아준다.

# 다운로드
sudo su
apt update & apt-get update & apt install mysql-server

# 접속확인
mysql -u root -p
mysql> exit

 

이제 남은건 방화벽과의 싸움이다.. 아래 사항에 대해 꼼꼼히 통신을 허용해줘야한다.

- ubuntu의 방화벽

- EC2 컨테이너의 인바운드/아웃바운드 정책

- MySQL 기본 설정

- MySQL 유저의 접속 허용 ip 설정

 

3. ubuntu 방화벽 설정

ufw allow 3306

위 명령어로 3306 포트를 열어준다.

사실 단순히 포트 말고도 tcp만 허용한다던지, 서비스명을 설정한다던지 할 수 있다.

그런 세부 설정을 넣으면 더 안전하게 관리할 수 있을 것이다.

 

4. MySQL 유저 ip 설정

MySQL에는 root 외에도 여러 유저를 만들 수 있다.

귀찮은데 그냥 root쓸까 생각도 했지만, 안전하지 않은 방법이라 MySQL이 이러한 접속에 여러 장애물을 만들었다.

그래서 그냥 권한이 조금 큰 유저를 새로 생성하는 것이 훨씬 낫다.

root 유저 비밀번호 설정한 적 없는데..? 한다면 그냥 엔터 치거나 root 치면 넘어간다.

 

root 로그인 후 아래를 그대로 따라해주자.

# root로 로그인. 꼭 옵션을 다 붙여야한다!!
mysql -u root -p

# mysql 콘솔 진입 - id : dev, pw : devpw 인 사용자를 만드는 커맨드
CREATE USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY 'devpw';
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%';
FLUSH PRIVILEGES;

# dev가 잘 만들어졌는지 확인
SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| dev              | %         | mysql_native_password |
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

 

plugin이 엄청난 장애 복병이다. 

DBeaver는 mysql_native_password를, Homebrew로 받은 9.0짜리 mysql 클라이언트는 무조건 caching_sha2_password를 사용하고있다. Spring JPA는 두 방식에 모두 대응하고있다.

 

그리고 쿼리에서 아무리 플러그인 mysql_native_password 쓰라고해도 어느순간 caching_sha2_password으로 바뀌어있다.

셋업 다 하고 인스턴스를 삭제하는 불상사를 막으려면, 미리 DBeaver 플러그인을 바꿔주자.

스크롤 내리다보면 플러그인 설정이 보인다.

 

5. MySQL 방화벽 해제 - conf 파일 수정

MySQL 설정파일 경로는 아래와 같다.

/etc/mysql/mysql.conf.d/mysqld.cnf

 

vi 혹은 nano로 파일 설정을 편집해줘야한다.

파일을 열어서 쭉.. 내리다보면 bind_address라는 속성이 있는데, 접속을 허용할 ip를 의미한다.

우리는 집, 카페, 학교 돌면서 작업해야하니 0.0.0.0으로 모든 ip를 열어주자.

...
# bind-address          = 127.0.0.1 # 주석처리하기
# mysqlx-bind-address   = 127.0.0.1 # 주석처리하기
bind-address          = 0.0.0.0 # 추가하기
...

 

혹시 플러그인이 말썽일 것 같으면 기본 플러그인 바꾸는 것도 이 파일에서 할 수 있다.

...
[mysqld] # 이 섹션 바로 밑에 넣어야한다.
default_authentication_plugin = mysql_native_password # 추가
...

 

이 설정은 Mysql을 재시작해야 적용된다. 

systemctl restart mysql

 

설정이 끝난김에 mysql 잘 살아있는지도 확인한다. 

ubuntu@ip-000-00-00-000:~$ apt-get install net-tools && netstat -tcl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 _localdnsproxy:domain   0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN     
tcp        0      0 _localdnsstub:domain    0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:33060              [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN

State가 LISTEN으로 잘 떠있는 것을 볼 수 있다.

 

6. ec2 인바운드 아웃바운드 수정

인바운드 22, 3306 및 아웃바운드가 허용되었는지 인스턴스 > 보안 탭에서 다시 확인한다.

 

7. DB 연결확인

telnet 호스트 포트로 연결을 확인해본다.

클라이언트가 무언가 수신한 후에 금세 끊어지면 문제가 없는 것이다.

telnet 인스턴스_퍼블릭_IP 3306

 

이제 mysql 커맨드로 연결해본다.

mysql -h 인스턴스_퍼블릭_IP -u dev -p

 

이것도 된다면 DBeaver의 연결 옵션을 allowPublicKeyRetrieval=true로 바꾸고 연결해본다.

 

혹시 도저히 상상도 못한 에러가 난다면.. 인스턴스를 삭제하고 다시 시도해보는 것을 추천드립니다.

ex)ERROR 2059 (HY000): Authentication plugin 'mysql_native_password' cannot be loaded


감사한 블로그들

- 우분투에서 su 명령으로 sudo 생략하기

- 우분투에 mysql 설치하기

- Mysql 연결팁

- AWS MySQL 배포

- MySQL DBeaver 셋팅