MySQL 또는 MariaDB용의 암호화되지 않은 Amazon RDS DB 인스턴스를 최소한의 다운타임으로 암호화하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 9월 8일

MySQL 또는 MariaDB용의 암호화되지 않은 Amazon Relational Database Service(Amazon RDS) 인스턴스의 암호화된 읽기 전용 복제본을 생성하려고 했습니다. 그러나 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

Amazon RDS에는 다음과 같은 암호화된 DB 인스턴스 제한 사항이 있습니다.

  • 암호화되지 않은 기존 Amazon RDS DB 인스턴스를 수정하여 암호화할 수는 없습니다.
  • 암호화되지 않은 인스턴스로 암호화된 읽기 전용 복제본을 생성할 수 없습니다.

기존 Amazon RDS 인스턴스를 암호화할 수 없으므로 암호화된 인스턴스를 새로 만들어야 합니다. 그렇지 않으면 암호화되지 않은 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 인스턴스를 암호화하려면 다음 단계를 따릅니다.

1.    DB 인스턴스의 암호화되지 않은 읽기 전용 복제본에서 암호화되지 않은 스냅샷을 생성하여 암호화합니다.

2.    암호화된 스냅샷에서 새 DB 인스턴스를 복원하여 암호화된 새 DB 인스턴스를 배포합니다.

3.    MySQL 복제를 사용하여 소스의 변경 사항을 암호화된 새 DB 인스턴스와 동기화합니다.

4.    암호화된 새 DB 인스턴스가 원본 DB 인스턴스와 동기화되어 있는지 확인합니다.

5.    연결을 전환하여 트래픽을 새 DB 인스턴스로 리디렉션합니다.

해결 방법

다운타임을 최소화하면서 복제 설정

1.    암호화되지 않은 소스 Amazon RDS DB 인스턴스에 대한 임시 읽기 전용 복제본을 생성합니다. 이 예제에서 암호화되지 않은 소스 DB 인스턴스는 SOURCE-EU이고 임시 읽기 전용 복제본은 TEMP-RR입니다.

2.    TEMP-RR에 연결하고 Seconds_Behind_Master가 값 0에서 안정될 때까지 복제 지연을 모니터링합니다. 이는 TEMP-RRSOURCE-EU와 동기화되었음을 나타냅니다.

mysql> SHOW SLAVE STATUS \G
Seconds_Behind_Master: 0

3.    TEMP-RR에서 복제 프로세스를 중지합니다.

MySQL > call mysql.rds_stop_replication;
+---------------------------+
| Message                   |
+---------------------------+
| Slave is down or disabled |
+---------------------------+

4.    TEMP-RR에서 Relay_Master_Log_FileExec_Master_Log_Pos 값을 기록합니다.

mysql> SHOW SLAVE STATUS \G
Relay_Master_Log_File: mysql-bin-changelog.000012
Exec_Master_Log_Pos: 123

5.    SOURCE-EU에서 binlog retention hours 파라미터를 설정하여 작업을 완료하는 데 필요한 시간 동안 바이너리 로그를 보존하도록 합니다. 다음 예제에서는 binlog retention hours가 24시간으로 설정되었습니다.

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

6.    TEMP-RR의 스냅샷을 생성합니다. 필요한 경우 스냅샷을 생성한 후 TEMP-RR을 삭제합니다.

7.    TEMP-RR스냅샷을 복사하고 [암호화 활성화]를 []로 설정합니다.

8.    암호화가 활성화된 복사된 스냅샷에서 새 DB 인스턴스를 복원합니다. 이 예제에서는 암호화된 새 DB 인스턴스를 NEW-RR-EN이라고 합니다.

9.    NEW-RR-EN의 트래픽을 허용하도록 SOURCE-EU 보안 그룹의 인바운드 규칙을 수정합니다. 동일한 보안 그룹을 두 DB 인스턴스 모두에서 사용하는 경우 SOURCE-EU와 동일한 보안 그룹 ID 참조를 사용할 수 있습니다.

참고: NEW-RR-EN에서SOURCE-EU로의 아웃바운드 트래픽이 허용되는지 확인하세요.

10.    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을 사용자의 암호로 바꿉니다.

11.    NEW-RR-EN에 연결하고 SOURCE-EU에 대한 복제 연결을 설정합니다.

mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123’ , 'mysql-bin.000012' , 123 , 0 );

rds-endpointSOURCE-EUDB 인스턴스 엔드포인트입니다.

사용자 이름(repl_user)과 암호(password123)는 10단계에서 생성한 사용자 이름 및 암호입니다. 4단계에서 캡처한 Relay_Master_Log_FileExec_Master_Log_Pos 값을 사용하여 mysql.rds_set_external_master 프로시저를 사용한 복제를 설정합니다.

참고: SOURCE-EU공개적으로 액세스할 수 있고 NEW-RR-EN(새로운 암호화된 DB 인스턴스)이 ‘private’로 설정된 경우, rds-endpoint 대신 (SOURCEE-EU의) 프라이빗 IP 주소를 사용합니다.

12.    NEW-RR-EN에서 복제를 시작합니다.

mysql > CALL mysql.rds_start_replication;

13.    NEW-RR-EN에서 복제가 성공적이었으며 SOURCE-EUNEW-RR-EN 간이 동기화되었는지 확인합니다.

mysql> SHOW SLAVE STATUS \G

원본 DB 인스턴스와 읽기 전용 복제본 간의 연결에 성공하면 출력은 다음과 같습니다.

Slave_IO_State: Waiting for master to send event
Seconds Behind master: 0

14.    Seconds_Behind_Master가 값 0에서 안정되면 트래픽을 중지하고 SOURCE-EU에서 연결을 닫습니다. 가동 중지 시간이 시작됩니다.

참고: SOURCE-EU에 연결하는 모든 애플리케이션 서버 및 클라이언트를 중지하여 SOURCE-EU에 새로 변경된 사항이 없는지 확인합니다. 필요한 경우 SOURCE-EU에 사용되는 보안 그룹을 일시적으로 잠글 수 있습니다. 이렇게 하면 NEW-RR-EN과 사용자가 이러한 작업을 수행하는 호스트를 제외한 모든 애플리케이션 또는 클라이언트의 인바운드 트래픽이 차단됩니다.

15.    데이터베이스 마스터 사용자로 NEW-RR-EN에 연결하고 복제를 중지합니다.

MySQL > call mysql.rds_stop_replication;

중요: 이 명령을 실행한 후에는 NEW-RR-EN이 더 이상 SOURCE-EU의 데이터를 복제하지 않습니다.

16.    SOURCE-EUNEW-RR-EN 간의 복제 관계를 중지하여 NEW-RR-EN을 독립 실행형 서버로 승격합니다.

MySQL > call mysql.rds_reset_external_master;

17.    모든 연결 문자열에서 NEW-RR-EN DNS 엔드포인트를 지정하여 모든 애플리케이션, 클라이언트 및 데이터베이스 연결을 NEW-RR-EN으로 지정합니다. 또는 SOURCE-EU의 이름을 변경한 다음 SOURCE-EU에 사용되는 것과 동일한 이름을 사용하도록 NEW-RR-EN을 수정합니다.

18.    NEW-RR-EN의 보안 그룹 규칙이 적절한 애플리케이션 및 클라이언트의 인바운드 트래픽을 허용하는지 확인합니다.

19.    애플리케이션과 클라이언트를 NEW-RR-EN에 연결하고 환경을 테스트하고 나면 SOURCE-EU를 삭제합니다.

팁: 이 운영을 생산 환경에 적용하기 전에 테스트 인스턴스에서 이 운영을 테스트해 보는 것이 좋습니다.