암호화되지 않은 Amazon Relational Database Service(Amazon RDS) for MySQL 또는 MariaDB DB 인스턴스의 암호화된 읽기 복제본을 만들려고 했습니다. 하지만 오류가 발생했습니다.
간단한 설명
Amazon RDS에는 다음과 같이 암호화된 DB 인스턴스에 대한 제한이 있습니다.
- 암호화되지 않은 기존 Amazon RDS DB 인스턴스를 수정하여 인스턴스를 암호화할 수 없습니다.
- 암호화되지 않은 인스턴스에서 암호화된 읽기 복제본을 만들 수 없습니다.
기존 RDS DB 인스턴스는 암호화할 수 없으므로 암호화된 인스턴스를 새로 만들어야 합니다. 그렇지 않으면 암호화되지 않은 Amazon RDS for MySQL 인스턴스의 암호화된 읽기 복제본을 만드는 경우 다음 오류가 발생합니다.
"You cannot create an encrypted Read Replica from an unencrypted DB instance. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID:)"
가동 중지 시간을 최소화하면서 암호화되지 않은 DB 인스턴스를 암호화하려면 다음 단계를 완료하십시오.
- DB 인스턴스의 암호화되지 않은 읽기 복제본에서 가져온 암호화되지 않은 스냅샷을 암호화합니다.
- 암호화된 스냅샷에서 새 DB 인스턴스를 복원하여 암호화된 새 DB 인스턴스를 배포합니다.
- MySQL 복제를 사용하여 소스에서 암호화된 새 DB 인스턴스로 변경 사항을 동기화합니다.
- 암호화된 새 DB 인스턴스가 소스 DB 인스턴스와 동기화되었는지 확인합니다.
- 연결을 전환한 다음, 트래픽을 새 DB 인스턴스로 리디렉션합니다.
해결 방법
암호화되지 않은 스냅샷 암호화
암호화되지 않은 읽기 복제본에서 가져온 암호화되지 않은 스냅샷을 암호화하려면 다음 단계를 완료하십시오.
-
암호화되지 않은 소스 RDS DB 인스턴스에 대한 임시 읽기 복제본을 만듭니다. 이 예제에서 암호화되지 않은 소스 DB 인스턴스는 SOURCE-EU이고 임시 읽기 복제본은 TEMP-RR입니다.
-
TEMP-RR에 연결합니다. 그 후 다음 명령을 실행하여 Seconds_Behind_Master가 값 0으로 안정될 때까지 복제본 지연을 모니터링합니다.
mysql> SHOW SLAVE STATUS \G
Seconds_Behind_Master: 0
참고: 안정된 값은 TEMP-RR이 SOURCE-EU와 동기화되어 있음을 나타냅니다.
-
다음 명령을 실행하여 TEMP-RR에서 복제 프로세스를 중지합니다.
MySQL > call mysql.rds_stop_replication;
+---------------------------+
| Message |
+---------------------------+
| Slave is down or disabled |
+---------------------------+
-
다음 예와 같이 TEMP-RR에서 Relay_Master_Log_File 및 Exec_Master_Log_Pos의 값을 확인합니다.
mysql> SHOW SLAVE STATUS \G
Relay_Master_Log_File: mysql-bin-changelog.000012
Exec_Master_Log_Pos: 123
-
SOURCE-EU에서 binlog 보존 시간 파라미터를 설정하여 작업을 완료하는 데 필요한 시간 동안 바이너리 로그를 보존합니다. 다음 예제에서는 binlog 보존 시간이 24시간으로 설정되어 있습니다.
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
-
TEMP-RR의 스냅샷을 만듭니다. 선택적으로 스냅샷을 만든 후 TEMP-RR을 삭제합니다.
-
TEMP-RR의 스냅샷을 복사한 다음, 암호화 사용을 예로 설정합니다.
암호화된 스냅샷에서 새 DB 인스턴스 복원
복사한 스냅샷에서 새 DB 인스턴스를 복원하고 암호화를 활성화합니다. 이 예제에서 암호화된 새 DB 인스턴스는 NEW-RR-EN입니다.
SOURCE-EU 보안 그룹에서 인바운드 규칙을 수정하여 NEW-RR-EN의 트래픽을 허용합니다. 두 DB 인스턴스에서 동일한 보안 그룹을 사용하는 경우 SOURCE-EU와 동일한 보안 그룹 ID 참조를 사용할 수 있습니다.
참고: NEW-RR-EN에서 SOURCE-EU로 향하는 아웃바운드 트래픽을 허용합니다.
소스 인스턴스에서 암호화된 새 인스턴스로 변경 사항 동기화
MySQL 복제를 사용하여 소스에서 암호화된 새 DB 인스턴스로 변경 사항을 동기화하려면 다음 단계를 완료하십시오.
- SOURCE-EU에 로그인합니다.
- 다음 명령을 실행하여 복제 사용자를 설정하고 사용자에게 필요한 권한을 부여합니다.
mysql> create user 'repl_user'@'%' identified by 'password123';
mysql> grant replication slave, replication client on *.* to 'repl_user'@'%';
mysql> show grants for 'repl_user'@'%';
참고: repl_user을 복제 사용자 이름으로 바꾸고 password123을 암호로 바꿉니다.
- 다음 명령을 실행하여 NEW-RR-EN에 연결하고 SOURCE-EU에 대한 복제 연결을 수립합니다.
mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );
참고: rds-endpoint를 SOURCE-EU의 DB 인스턴스 엔드포인트로 바꿉니다. repl_user 및 password123을 만든 사용자 이름 및 암호로 바꿉니다. Relay_Master_Log_File 및 Exec_Master_Log_Pos 값을 사용하여 mysql.rds_set_external_master 프로시저로 복제를 설정합니다. SOURCE-EU가 공개적으로 액세스 가능이고 NEW-RR-EN이 프라이빗으로 설정된 경우 rds-endpoint 대신 SOURCE-EU의 프라이빗 IP 주소를 사용합니다.
- NEW-RR-EN에서 다음 명령을 실행하여 복제를 시작합니다.
mysql > CALL mysql.rds_start_replication;
암호화된 인스턴스가 소스 인스턴스와 동기화되었는지 확인
암호화된 새 DB 인스턴스가 소스 DB 인스턴스와 동기화되었는지 확인하려면 다음 단계를 완료하십시오.
-
NEW-RR-EN에서 다음 명령을 실행하여 복제가 성공했으며 SOURCE-EU와 NEW-RR-EN 간에 동기화되었는지 확인합니다.
mysql> SHOW SLAVE STATUS \G
소스 DB 인스턴스와 읽기 복제본 간의 연결이 성공하면 출력은 다음과 유사합니다.
Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0
-
Seconds_Behind_Master가 0 값으로 안정된 후 트래픽을 중지하고 SOURCE-EU에서 연결을 닫습니다.
참고: SOURCE-EU에 연결하는 모든 애플리케이션 서버 및 클라이언트를 중지하여 SOURCE-EU를 변경하지 않도록 합니다. 선택적으로 SOURCE-EU가 사용하는 보안 그룹을 일시적으로 잠글 수 있습니다. NEW-RR-EN 및 사용자가 이러한 작업을 수행하는 호스트를 제외한 모든 애플리케이션 또는 클라이언트의 인바운드 트래픽을 차단해야 합니다.
연결을 전환하고 트래픽을 새 DB 인스턴스로 리디렉션
연결을 전환하고 트래픽을 새 DB 인스턴스로 리디렉션하려면 다음 단계를 완료하십시오.
-
데이터베이스 리더 사용자로 NEW-RR-EN에 연결한 후 다음 명령을 실행하여 복제를 중지합니다.
MySQL > call mysql.rds_stop_replication;
참고: 이 명령을 실행하면 NEW-RR-EN이 더 이상 SOURCE-EU의 데이터를 복제하지 않습니다.
-
NEW-RR-EN을 독립 실행형 서버로 승격하려면 다음 명령을 실행하여 SOURCE-EU와 NEW-RR-EN 간의 복제 관계를 중지합니다.
MySQL > call mysql.rds_reset_external_master;
-
모든 애플리케이션, 클라이언트 및 데이터베이스 연결을 NEW-RR-EN으로 가리키려면 모든 연결 문자열에 NEW-RR-EN DNS 엔드포인트를 지정합니다. 또는 SOURCE-EU의 이름을 바꾼 다음, NEW-RR-EN을 SOURCE-EU가 사용하는 것과 동일한 이름을 사용하도록 수정합니다.
-
NEW-RR-EN의 보안 그룹 규칙이 적절한 애플리케이션 및 클라이언트의 인바운드 트래픽을 허용하는지 확인합니다.
-
SOURCE-EU를 삭제합니다.
참고: 프로덕션 환경에서 이 작업을 적용하기 전에 테스트 인스턴스에서 이 작업을 테스트하는 것이 모범 사례입니다.
관련 정보
DB 인스턴스 읽기 복제본 작업
암호화되지 않은 Amazon RDS DB 인스턴스의 암호화된 스냅샷을 만들려면 어떻게 해야 합니까?
MySQL 웹 사이트의 복제 문제 해결
외부 소스 인스턴스로 바이너리 로그 파일 위치 복제 구성