MySQL または MariaDB の暗号化されていない Amazon RDS DB インスタンスを最小限のダウンタイムで暗号化する方法を教えてください。

最終更新日: 2021 年 1 月 25 日

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 インスタンスを変更してインスタンスを暗号化することはできません。
  • 暗号化されていない DB インスタンスから暗号化されたリードレプリカを作成することはできません。

これらの制限を回避するには、「MySQL または MariaDB の暗号化されていない Amazon RDS DB インスタンスを最小限のダウンタイムで暗号化する方法を教えてください」を参照してください。

以下を実行します。

1.    DB インスタンスの暗号化されていないリードレプリカから取得した暗号化されていないスナップショットを暗号化します。

2.    暗号化されたスナップショットから新しい 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-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) を使用できます。

  a.Amazon RDS コンソールから、[Databases] (データベース) を選択します。

  b.DB インスタンスを選択し、[Connectivity & Security] (接続とセキュリティ) タブを選択します。

  c.[Security group] (セキュリティグループ)、[Inbound] (インバウンド) タブの順に選択します。

  d.[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_File および Exec_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-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 の名前を変更してから、NEW-RR-EN を変更して SOURCE-EU が使うのと同じ名前を使用します。

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

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

ヒント:この操作を本番環境に適用する前に、復元したインスタンスでこの操作をテストすることがベストプラクティスです。