RDS Master 사용자 vs rdsadmin 사용자
기본적으로 RDS를 생성하실 때 Master 권한이 있는 사용자를 설정합니다.
하지만 실제 RDS 의 DB에 접속하여 사용자를 확인해보면 우리가 설정한 Master 권한의 사용자가 아닌 "rsadmin" 이라는 사용자에 모든 권한이 있는 것을 확인할 수 있습니다.
따라서 이번 시간에는 AWS Managed 서비스인 RDS를 사용하시는 엔지니어 분들께서 헷갈리실 수 있는 주제에 대해 다뤄보도록 하겠습니다.
"rdsadmin" 사용자는 AWS에서 RDS 데이터베이스를 관리하는 데 사용하는 RDS 관리를 위한 시스템 사용자입니다.
그리고 이 rdsadmin 사용자는 Super-user 이며 AWS에서는 이 사용자에 대한 액세스 권한을 고객에게 부여하지 않습니다.
이것은 내부 전용이며 기본적으로 localhost로 설정되어 있으며 DBA가 사용자 측에서 변경하실 수 없고 사용할 수 없습니다.
즉, 해당 사용자는 AWS에서 사용하는 사용자로 고객님께서는 설정 혹은 변경하실 수 없으며, RDS 생성 시에 모든 권한을 가지며 localhost 로 설정되어있습니다.
또한 AWS에서는 "rdsadmin" 사용자에 대한 권한을 고객들에게 부여하지 않으므로 따로 설정하실 수 없습니다.
고객이 사용할 수 있는 유일한 최고 권한 사용자는 RDS 인스턴스의 마스터 사용자입니다.
만약 Master 사용자를 사용하셔야 한다면, RDS 생성할 때 함께 생성한 마스터 사용자를 이용하셔야 합니다.
또한 RDS의 Master 사용자의 암호를 변경하고 싶으시다면 콘솔에서 아래와 같이 설정할 수 있습니다.
RDS 인스턴스를 선택하신 후 [수정] 을 선택합니다.
[새 마스터 암호] 필드에 사용하려는 마스터 사용자 암호를 입력합니다.
[계속] 을 선택한 다음, [DB 인스턴스 수정] 을 선택합니다.
하지만 위에 적힌 이유로 rdsadmin 의 암호는 사용자가 변경할 수 없습니다.
RDS Mysql 복제 프로세스 중지
다음으로, 읽기 복제본 동기화 중지하는 방법에 대해 안내 드리겠습니다.
기존 서버에서 mysql 과 같은 DB를 생성하여 작업할 때는 주로 명령어를 사용했으나, RDS에서는 Slave 동기화를 중지하시려면 mysql.rds_stop_replication 프로시저를 실행 해야 합니다.
복제본 (slave)를 중지 하기 위해서 관리자 권한이 필요하지만 RDS에서는 설치형 MYSQL과는 다르게 마스터 계정의 권한에도 제한이 존재합니다.
slave stop; 과 같은 명령은 mysql 관리 영역으로 rds에서 제공하는 master 계정으로는 수행이 불가능합니다.
하지만 RDS에서는 프로시저를 호출하는 방법으로 이러한 기능들을 지원하고 있습니다.
아래 문서에서 참조하여 설명 드리자면, Amazon RDS 외부에서 실행 중인 MySQL 인스턴스에서 데이터를 가져오도록 복제를 구성하는 경우 가져오기가 완료된 후 읽기 전용 복제본에서 mysql.rds_stop_replication을 호출하여 복제 프로세스를 중지하셔야 합니다.
자세한 내용과 방법은 아래 링크에서 확인하실 수 있습니다.
# RDS Mysql slave 중지 프로시저
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/mysql_rds_stop_replication.html
아래는 내부적인 TEST 진행 및 결과입니다.
RDS의 읽기 복제본을 생성합니다.
-
RDS 읽기 복제본의 엔드포인트로 Master 사용자로 접속합니다
mysql -h replication-test2.cslhbb9jqvu2.ap-northeast-2.rds.amazonaws.com -u admin -p
-
복제본에서 Slave 상태를 확인합니다.
✅전체 사용자 확인MySQL [mysql]> select user, host from user;
RDS를 생성할 때 설정한 admin 사용자와 wordpress 사용자 외에 여러 사용자가 있는 것을 확인할 수 있습니다.
또한 rdsadmin 과 같은 RDS에서 자동으로 생성 된 사용자들의 host는 "localhost"로 AWS에서 밖에 접근할 수 있는 것을 확인하였습니다.
✅사용자 권한 확인
Master 권한을 가진 admin 사용자의 권한과 rdsadmin 의 권한의 차이점을 확인할 수 있습니다.MySQL [mysql]> show grants for admin; MySQL [mysql]> show grants for rdsadmin@localhost;
*️⃣ admin
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON . | GRANT FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES
*️⃣ rdsadmin
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON . | | GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON .
rdsadmin 의 권한이 더 많은 것을 확인할 수 있습니다.
✅ Slave 상태 확인MySQL [mysql]> SHOW SLAVE STATUS\G; ************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.23.3.233 Master_User: rdsrepladmin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin-changelog.042250 Read_Master_Log_Pos: 61134 Relay_Log_File: relaylog.000015 Relay_Log_Pos: 61255 Relay_Master_Log_File: mysql-bin-changelog.042250 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: innodb_memcache.cache_policies,innodb_memcache.config_options,mysql.plugin,mysql.rds_configuration,mysql.rds_history,mysql.rds_monitor,mysql.rds_replication_status,mysql.rds_sysinfo Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 61134 Relay_Log_Space: 61692 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1544914222 Master_UUID: 580dbf4d-c8ea-11eb-ac66-02df28525e1a Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set, 1 warning (0.32 sec)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
을 확인하여 해당 replication 이 Slave 로서 동작하고 있음을 확인 할 수 있습니다.
- 이 상태에서 stop slave; 명령어를 보낸 결과입니다.
MySQL [mysql]> stop slave; ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or REPLICATION_SLAVE_ADMIN privilege(s) for this operation
--> ERROR 와 같이 Access denied 메세지를 출력하며 동작하지 않는 것을 확인할 수 있습니다.⭐ 참고 : 복제본 동기화 중지를 하기 위해서는
REPLICATION SLAVE
권한이 필요합니다.-
위에 안내 드린 방법처럼 프로시저를 실행합니다.
MySQL [mysql]> CALL mysql.rds_stop_replication;
-
이후 다시 Slave 상태를 확인하시면 정상적으로 Slave 동기화가 중지된 것을 확인하실 수 있습니다.
MySQL [mysql]> SHOW SLAVE STATUS\G; ************************** 1. row *************************** Slave_IO_State: Master_Host: 172.23.3.233 Master_User: rdsrepladmin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin-changelog.042250 Read_Master_Log_Pos: 90951 Relay_Log_File: relaylog.000015 Relay_Log_Pos: 91072 Relay_Master_Log_File: mysql-bin-changelog.042250 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: innodb_memcache.cache_policies,innodb_memcache.config_options,mysql.plugin,mysql.rds_configuration,mysql.rds_history,mysql.rds_monitor,mysql.rds_replication_status,mysql.rds_sysinfo Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 90951 Relay_Log_Space: 91509 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1544914222 Master_UUID: 580dbf4d-c8ea-11eb-ac66-02df28525e1a Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set, 1 warning (0.00 sec)
즉, CALL mysql.rds_stop_replication; 프로시저를 호출하여 slave 동기화를 중지 시키면 될 것으로 보여지며 테스트를 진행하시면서 어려운 점이 있다면 기술 지원 포털에 문의 남겨주시길 바랍니다.