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

최종 업데이트 날짜: 2020년 8월 19일

MySQL 또는 MariaDB용의 암호화되지 않은 Amazon Relational Database Service(Amazon RDS) 인스턴스의 암호화된 읽기 전용 복제본을 생성하려고 했습니다. 그러나 다음 오류가 표시됩니다.

"You cannot create an encrypted Read Replica from an unencrypted DB instance. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID:"

최소한의 가동 중단으로 암호화되지 않은 DB 인스턴스를 암호화하려면 어떻게 해야 합니까?

간략한 설명

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

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

다음을 수행합니다.

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

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

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

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

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

이 프로세스는 다운타임을 최소화합니다.

해결 방법

1.    암호화되지 않은 소스 Amazon RDS DB 인스턴스에 대한 임시 읽기 전용 복제본을 생성합니다. 이 예제에서 암호화되지 않은 소스 DB 인스턴스는 SOURCE-UE이고 임시 읽기 전용 복제본은 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스냅샷을 복사하고 [암호화 활성화(Enable Encryption)]를 [예(Yes)]로 설정합니다.

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

9.    NEW-RR-EN의 트래픽을 허용하도록 SOURCE-EU 보안 그룹의 인바운드 규칙을 수정합니다. 동일한 보안 그룹을 두 DB 인스턴스 모두에서 사용하는 경우 SOURCE-EU와 동일한 보안 그룹 ID 참조를 사용할 수 있습니다. Amazon RDS 콘솔에서 [데이터베이스(Databases)]를 선택합니다. DB 인스턴스를 선택한 다음 [연결 및 보안(Connectivity & Security)] 탭을 선택합니다. [보안 그룹(Security group)]을 선택하고 [인바운드(Inbound)] 탭을 선택합니다. [편집(Edit)]을 선택하고 보안 그룹 ID를 입력한 다음 [저장(Save)]을 선택합니다.
참고: 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-EU의 엔드포인트입니다. 암호화되지 않은 소스 DB 인스턴스(SOURCE-UE)에 공개적으로 액세스할 수 있는 경우 (DB 인스턴스의 Publicly Accessible 속성이 예(Yes)로 설정된 경우), rds-endpoint 대신 프라이빗 IP 주소를 제공합니다.

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

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

mysql > CALL mysql.rds_start_replication;

13.    NEW-RR-EN에서 SOURCE-EUNEW-RR-EN 간에 복제가 동기화되는지 확인합니다.

mysql> SHOW SLAVE STATUS \G
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-ENSOURCE-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를 삭제할 수 있습니다.

팁: 이 작업을 프로덕션 환경에 적용하기 전에 복원된 인스턴스에서 테스트하는 것이 모범 사례입니다