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-RRRelay_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

5.    操作の完了に必要な時間のバイナリログが保持されるよう、SOURCE-EUバイナリログが保持時間のパラメータを設定します。次の例では、バイナリログの保持時間は 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.    SOURCE-EU セキュリティグループのインバウンドルールを変更し、NEW-RR-EN からのトラフィックを許可します。両方の DB インスタンスで同じセキュリティグループを使用している場合、同じセキュリティグループ ID リファレンス (SOURCE-EU) を使用できます。

注: 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_File および Exec_Master_Log_Pos のキャプチャされた値を使用して、mysql.rds_set_external_master プロシージャでレプリケーションをセットアップします。

注: SOURCE-EUパブリックにアクセス可能で、NEW-RR-EN (新しい暗号化された DB インスタンス) が [private] (プライベート) に設定されている場合は、rds-endpoint の代わりに (SOURCE-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-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 の名前を変更してから、NEW-RR-EN を変更して SOURCE-EU が使うのと同じ名前を使用します。

18.    NEW-RR-EN のセキュリティグループのルールによって、適切なアプリケーションとクライアントからのインバウンドトラフィックが許可されていることを確認します。

19.    アプリケーションとクライアントを NEW-RR-EN にポイントして環境をテストしたら、SOURCE-EU を削除します。

ヒント: このオペレーションを本番環境に適用する前に、テストインスタンスでこのオペレーションをテストすることがベストプラクティスです。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?