跳至內容

如何以最短停機時間對未加密的 Amazon RDS for MySQL 或 MariaDB 資料庫執行個體進行加密?

3 分的閱讀內容
0

我嘗試為未加密的 Amazon Relational Database Service (Amazon RDS) for MySQL 或 MariaDB 資料庫執行個體建立加密的讀取複本。然而,我收到了一個錯誤。

簡短說明

Amazon RDS 對加密的資料庫執行個體設定了以下限制

  • 您無法修改現有未加密的 Amazon RDS 資料庫執行個體來加密該執行個體。
  • 您無法從未加密的執行個體建立加密的讀取複本。

由於您無法加密現有的 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:)」

若要以最短停機時間加密未加密的資料庫執行個體,請完成以下步驟:

  1. 加密您從資料庫執行個體的未加密讀取複本建立的未加密快照。
  2. 從加密快照還原新的資料庫執行個體,以部署新的加密資料庫執行個體。
  3. 使用 MySQL 複寫,同步來源與新加密資料庫執行個體之間的變更。
  4. 確認新的加密資料庫執行個體已與來源資料庫執行個體同步。
  5. 切換您的連線,然後將流量重新導向到新的資料庫執行個體。

解決方法

加密未加密的快照

若要加密您從未加密讀取複本建立的未加密快照,請完成以下步驟:

  1. 為來源未加密 RDS 資料庫執行個體建立臨時讀取複本。在此範例中,來源未加密資料庫執行個體為 SOURCE-EU,臨時讀取複本為 TEMP-RR

  2. 連線至 TEMP-RR。然後,執行以下命令來監控複本延遲,直到 Seconds_Behind_Master 穩定維持在 0

    mysql> SHOW SLAVE STATUS \G
    Seconds_Behind_Master: 0

    **注意:**穩定值表示 TEMP-RR 已與 SOURCE-EU 同步。

  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 (是)。

從加密快照還原新的資料庫執行個體

從複製的快照還原新的資料庫執行個體,並開啟加密。在此範例中,新的加密資料庫執行個體為 NEW-RR-EN

修改 SOURCE-EU 安全群組中的傳入規則,以允許來自 NEW-RR-EN 的流量。如果您在兩個資料庫執行個體上使用相同的安全群組,則可以使用與 SOURCE-EU 相同的安全群組 ID 參考。

**注意:**允許從 NEW-RR-EN 傳出流量至 SOURCE-EU

將來源執行個體的變更同步到新的加密執行個體

若要使用 MySQL 複寫將來源同步至新的加密資料庫執行個體,請完成以下步驟:

  1. 登入 SOURCE-EU
  2. 執行以下命令來設定複寫使用者,並授予該使用者必要權限:
    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 替換為您的密碼。
  3. 執行以下命令以連線至 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資料庫執行個體端點。將 repl_userpassword123 替換為您建立的使用者名稱與密碼。使用 Relay_Master_Log_FileExec_Master_Log_Pos 值,透過 mysql.rds_set_external_master 程序設定複寫。如果 SOURCE-EU公開存取,且 NEW-RR-EN 設為私有,則請使用 SOURCE-EU 的私有 IP 位址,而非 rds-endpoint
  4. NEW-RR-EN 執行以下命令以啟動複寫:
    mysql > CALL mysql.rds_start_replication;

確認加密執行個體已與來源執行個體同步

若要確認新的加密資料庫執行個體已與來源資料庫執行個體同步,請完成以下步驟:

  1. NEW-RR-EN 執行以下命令,以確認 SOURCE-EUNEW-RR-EN 之間的複寫已成功且保持同步:

    mysql> SHOW SLAVE STATUS \G

    如果來源資料庫執行個體與讀取複本之間的連線成功,則輸出會類似以下內容:

    Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0
  2. Seconds_Behind_Master 穩定維持在 0 之後,停止流量並關閉 SOURCE-EU 上的連線。
    **注意:**停止所有連線至 SOURCE-EU 的應用程式伺服器與用戶端,以確保您不會對 SOURCE-EU 進行變更。您也可以暫時鎖定 SOURCE-EU 所使用的安全群組。您必須阻止來自任何應用程式或用戶端的傳入流量,但 NEW-RR-EN 與使用者執行這些動作的主機除外。

切換您的連線並將流量重新導向到新的資料庫執行個體

若要切換您的連線並將流量重新導向到新的資料庫執行個體,請完成以下步驟:

  1. 以資料庫領導使用者身分連線至 NEW-RR-EN,然後執行以下命令以停止複寫:

    MySQL > call mysql.rds_stop_replication;

    **注意:**執行此命令後,NEW-RR-EN 將不再從 SOURCE-EU 複寫資料。

  2. 若要將 NEW-RR-EN 提升為獨立伺服器,請執行以下命令,以停止 SOURCE-EUNEW-RR-EN 之間的複寫關係:

    MySQL > call mysql.rds_reset_external_master;
  3. 若要將所有應用程式、用戶端與資料庫連線指向 NEW-RR-EN,請在所有連線字串中指定 NEW-RR-EN DNS 端點。或者,重新命名 SOURCE-EU,然後修改 NEW-RR-EN 以使用與 SOURCE-EU 相同的名稱。

  4. 確認 NEW-RR-EN 上的安全群組規則允許來自適當應用程式與用戶端的傳入流量。

  5. 刪除 SOURCE-EU
    **注意:**在生產環境中套用此作業之前,最佳實務是先在測試執行個體上測試此作業。

相關資訊

使用資料庫執行個體讀取複本

如何為未加密的 Amazon RDS 資料庫執行個體建立加密的快照?

MySQL 網站上的複寫疑難排解

使用外部來源執行個體設定二進位日誌檔位置複寫