RDS MySQL 초기 설정 가이드

개요

MySQL 초기 셋업을 위한 치트시트.
DB 생길 때마다 같은 작업이 반복되어서 나중에 참고하려고 작성한 가이드.

이 가이드에서는 다음 2가지 방식을 설명하고 있습니다.

  1. MySQL 엔진 기반의 RDS에 세팅하기
  2. EC2 on MySQL 세팅하기

 

1. RDS 설정 가이드

환경

시스템 구조도

Bastion host (EC2)

베스천 호스트는 데이터베이스에 사용할 랜덤 패스워드를 생성하고, RDS에 원격 접속해서 쿼리를 실행하는 역할을 합니다.

 

RDS 환경

 

베스천 호스트 설정

랜덤 패스워드 생성

GPGGNU Privacy Guard를 사용하여 길이가 14자인 임의의 강력한 비밀번호를 생성합니다.

$ gpg --gen-random --armor 1 14
ryTtS60vWxk5CmiS9jA=

생성한 패스워드는 이후 DB 사용자 생성 과정에서 사용할 예정이기 때문에 메모장에 따로 기록해놓습니다.

 

gpg 패키지

랜덤 패스워드를 생성하는 베스천 호스트에 gpg 패키지가 미리 설치되어 있어야 합니다.
Amazon Linux 2와 Amazon Linux 2022에는 기본적으로 gpg 명령어가 설치되어 있습니다.

맥북의 경우 brew install gpg 명령어로 설치 가능합니다.

 

DB 클라이언트 설치

Amazon Linux 2022부터 기본 패키지 관리자로 dnf를 사용합니다.
dnf를 사용해 Amazon Linux 2022에 mariadb-server 패키지를 설치합니다.

$ sudo dnf install mariadb-server -y

 

mariadb-server 패키지 설치를 완료한 다음에는 터미널에서 mysql 명령어를 사용할 수 있습니다.
베스천 호스트에서 RDS로 접속합니다.

$ mysql \
    -u <YOUR_RDS_USER_NAME> \
    -h <YOUR_RDS_ENDPOINT> \
    -p

 

RDS 설정

MySQL 버전 확인

SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.28    |
+-----------+

접속한 RDS의 DB 엔진은 MySQL 8.0.28입니다.

 

데이터베이스 생성

하나의 MySQL DB는 내부적으로 여러 개의 데이터베이스로 구성될 수 있습니다.

새 데이터베이스를 생성합니다.

CREATE DATABASE gatsby_db_core;
--              ~~~~~~~~~~~~~~
--               DATABASE NAME

 

계정 생성

DB 유저를 생성하고 패스워드를 세팅합니다.

CREATE USER gatsby_db_user_core@'%' IDENTIFIED BY 'ryTtS60vWxk5CmiS9jA=';
--          ~~~~~~~~~~~~~~~~~~~  ~                 ~~~~~~~~~~~~~~~~~~~~
--             DATABASE USER     From Any             USER PASSWORD

 

권한 부여

GRANT ALL PRIVILEGES ON gatsby_db_core.* TO 'gatsby_db_user_core'@'%';
--                      ~~~~~~~~~~~~~~ ~     ~~~~~~~~~~~~~~~~~~~   ~
--                       DATABASE NAME |       DATABASE USER       From Any
--                                     |
--                             Allow all actions

 

유저 리스트 확인

유저 정보는 Admin 권한을 가진 DB 계정에서 확인 가능합니다.
유저 정보는 mysql이라는 이름의 데이터베이스에 저장되어 있습니다.

-- mysql 데이터베이스 접속
USE mysql;

-- 유저 리스트 조회
SELECT user, host, password_last_changed, account_locked
  FROM user;

 

설정 적용

FLUSH PRIVILEGES;

flush privileges 명령어는 데이터베이스에 설정을 적용하라는 의미입니다.
권한 설정 후에는 반드시 해당 명령어를 실행해야 합니다.

 

참고자료

Amazon Linux 2022 - Package management tool
패키지 관리자 설명 및 사용법을 설명하는 AWS 공식문서

 

2. EC2에 MySQL 설정 가이드

RDS를 사용하는 대신, EC2 인스턴스를 생성한 후 직접 MySQL 8.0.31을 설치 + 세팅하는 가이드

 

설치 환경

대상 EC2 환경은 다음과 같습니다.

 

설치 가이드

MySQL 8.0.31 설치

EC2에 SSH 또는 SSM Session Manager를 통해 원격 접속한 후, 다음 명령어를 실행합니다.

외부에서 패키지를 받아오기 때문에 해당 인스턴스는 (NAT Gateway 또는 Internet Gateway를 통해) 퍼블릭 인터넷으로 나갈 수 있는 서브넷 영역에 위치해야 합니다.

# Step 1: Install wget
sudo yum install wget

# Step 2: Use wget to download the MySQL Yum repository.
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# Step 3: Now, install the mysql locally
sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm

# Step 4: Install MySQL community server
sudo yum install mysql-community-server

# Step 5: Confirm your MySQL service status
sudo systemctl status mysqld

 

설치 후 MySQL 버전을 확인합니다.

$ mysql --version
mysql  Ver 8.0.31 for Linux on aarch64 (MySQL Community Server - GPL)

EC2 인스턴스에 MySQL 8.0.31이 설치된 걸 확인할 수 있습니다.

참고한 자료

 

패스워드 세팅

MySQL을 설치하게 되면 기본적으로 root 계정에 자동 생성된 초기 패스워드를 통해 접속할 수 있습니다.
초기 root 패스워드 확인은 MySQL 로그에서 확인할 수 있습니다.

$ sudo grep 'temporary password' /var/log/mysqld.log
2022-12-13T05:47:41.193141Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: <RANDOM_STRING>

 

초기 root 패스워드를 확인한 이후 로컬에서 MySQL DB에 접근합니다.

$ mysql -u root -p
Enter password: <RANDOM_STRING_HERE>

 

패스워드 변경

root 계정의 초기 패스워드를 변경합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY '<YOUR_NEW_PASSWORD_HERE>';

 

데이터베이스 및 유저 생성

주의
root 패스워드를 초기 비밀번호 그대로 유지하고 아래 명령어를 실행할 경우, 명령어를 실행할 수 없습니다. 반드시 root 계정의 초기 비밀번호를 변경해주어야 합니다.

-- Database 생성
CREATE DATABASE my_test_db;

-- User 생성
CREATE USER my_test_poweruser IDENTIFIED BY '<USER_PASSWORD_HERE>';

-- User에 Database 관련 모든 권한 부여
GRANT ALL PRIVILEGES ON my_test_db.*
                     TO 'my_test_poweruser'@'%';

 

유저 리스트를 조회해서 새로 생성한 유저가 보이는지, 최근 패스워드가 업데이트된 시간 정보를 확인합니다.

-- mysql 데이터베이스 접속
USE mysql;

-- 유저 리스트 조회
SELECT user, host, password_last_changed, account_locked
  FROM user;

 

마지막으로 권한 변경사항을 데이터베이스에 적용합니다.

-- 권한 변경사항 적용
FLUSH PRIVILEGES;

 

이것으로 MySQL에 접근해서 사용할 수 있는 기본 세팅이 완료되었습니다.