MySQL または MariaDB の暗号化されていない Amazon RDS DB インスタンスを最小限のダウンタイムで暗号化するにはどうすればよいですか?
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 インスタンスを最小限のダウンタイムで暗号化するには、次の手順に従います。
- DB インスタンスの暗号化されていないリードレプリカから取得した暗号化されていないスナップショットを暗号化します。
- 暗号化されたスナップショットから新しい DB インスタンスを復元して、暗号化された新しい DB インスタンスをデプロイします。
- MySQL レプリケーションを使用して、ソースから暗号化された新しい DB インスタンスに対して、変更を同期します。
- 新しい、暗号化された DB インスタンスがソース DB インスタンスと同期していることを確認します。
- 接続を切り替え、トラフィックを新しい DB インスタンスにリダイレクトします。
解決策
暗号化されていないスナップショットを暗号化する
暗号化されていないリードレプリカから取得した暗号化されていないスナップショットを暗号化するには、次の手順を実行します。
-
暗号化されていないソース Amazon RDS DB インスタンスの一時的なリードレプリカを作成します。この例では、暗号化されていないソース DB インスタンスは SOURCE-EU と呼ばれ、一時的なリードレプリカは TEMP-RR と呼ばれます。
-
TEMP-RR に接続し、Seconds_Behind_Master が値 0 で安定するまで、レプリカラグをモニタリングします。安定した値は、TEMP-RR が SOURCE-EU と同期していることを示しています。
mysql> SHOW SLAVE STATUS \G Seconds_Behind_Master: 0
-
TEMP-RR でレプリケーションプロセスを停止します。
MySQL > call mysql.rds_stop_replication; +---------------------------+ | Message | +---------------------------+ | Slave is down or disabled | +---------------------------+
-
TEMP-RR の Relay_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
-
操作の完了に必要な時間のバイナリログが保持されるよう、SOURCE-EU で、バイナリログの保持時間パラメータを設定します。次の例では、バイナリログの保持時間は 24 時間に設定されています。
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
-
TEMP-RR のスナップショットを取得します。オプションで、スナップショットの作成後に TEMP-RR を削除します。
-
TEMP-RR のスナップショットをコピーし、暗号化を有効にするをはいに設定します。
暗号化されたスナップショットから新しい DB インスタンスを復元する
暗号化されたスナップショットから新しい DB インスタンスを復元するには、次の手順を実行します。
- 暗号化が有効になっているコピーされたスナップショットから新しい DB インスタンスを復元します。この例では、暗号化された新しい DB インスタンスを NEW-RR-EN と呼びます。
- SOURCE-EU セキュリティグループのインバウンドルールを変更し、NEW-RR-EN からのトラフィックを許可します。両方の DB インスタンスで同じセキュリティグループを使用する場合、SOURCE-EU と同じセキュリティグループ ID リファレンスを使用できます。
注:NEW-RR-EN から SOURCE-EU へのアウトバウンドトラフィックを許可してください。
ソースインスタンスからの変更を新しい暗号化されたインスタンスに同期する
MySQL レプリケーションを使用して、ソースからの変更を新しい暗号化された DB インスタンスに同期するには、次の手順を実行します。
- SOURCE-EU にログインします。
- レプリケーションユーザーを設定し、そのユーザーに必要な許可を付与します。
**注:**repl_user を自分のレプリケーションユーザー名に置き換え、password123 を自分のパスワードに置き換えてください。mysql> create user 'repl_user'@'%' identified by 'password123'; mysql> grant replication slave, replication client on *.* to 'repl_user'@'%'; mysql> show grants for 'repl_user'@'%';
- NEW-RR-EN に接続し、SOURCE-EU へのレプリケーション接続を設定します。
**注:**rds-endpoint を SOURCE-EU の DB インスタンスエンドポイントに置き換えます。repl\ _user と password123 は、作成したユーザー名とパスワードに置き換えます。Relay_Master_Log_File と Exec_Master_Log_Pos の値を使用して、mysql.rds_set_external_master プロシージャを使用してレプリケーションを設定します。SOURCE-EU がパブリックアクセス可能で、NEW-RR-EN が「プライベート」に設定されている場合は、rds-endpoint の代わりに SOURCE-EU のプライベート IP アドレスを使用します。mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );
- NEW-RR-EN から、レプリケーションを開始します。
mysql > CALL mysql.rds_start_replication;
暗号化されたインスタンスがソースインスタンスと同期していることを確認する
新しい暗号化された DB インスタンスがソース DB インスタンスと同期していることを確認するには、次の手順を実行します。
-
NEW-RR-EN から、レプリケーションが成功し、SOURCE-EU と NEW-RR-EN の間で同期しいることを確認します。
mysql> SHOW SLAVE STATUS \G
ソース DB インスタンスとリードレプリカ間の接続が成功すると、出力は次のようになります。
Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0
-
Seconds_Behind_Master が値 0で安定したら、トラフィックを停止し、SOURCE-EU で接続を閉じます。
**注:**SOURCE-EU に接続するすべてのアプリケーションサーバーとクライアントを停止し、SOURCE-EU に新たな変更が加えられていないことを確認します。オプションで、SOURCE-EU が使用するセキュリティグループを一時的にロックできます。NEW-RR-EN とユーザーがこれらのアクションを実行するホストを除く、すべてのアプリケーションまたはクライアントからのインバウンドトラフィックを回避する必要があります。
接続を切り替えて、トラフィックを新しい DB インスタンスにリダイレクトする
接続を切り替えてトラフィックを新しい DB インスタンスにリダイレクトするには、次の手順を実行します。
-
データベースリーダーユーザーとして NEW-RR-EN に接続し、レプリケーションを停止します。
MySQL > call mysql.rds_stop_replication;
**重要:**このコマンドを実行すると、NEW-RR-EN は SOURCE-EU からのデータをレプリケートしなくなります。
-
NEW-RR-EN をスタンドアロンサーバーに昇格するには、SOURCE-EU と NEW-RR-EN の間のレプリケーション関係を停止します。
MySQL > call mysql.rds_reset_external_master;
-
すべてのアプリケーション、クライアント、およびデータベース接続を NEW-RR-EN に指定するには、すべての接続文字列に NEW-RR-EN DNS エンドポイントを指定します。または、SOURCE-EU の名前を変更してから、NEW-RR-EN を変更して SOURCE-EU が使うのと同じ名前を使用します。
-
NEW-RR-EN のセキュリティグループのルールによって、適切なアプリケーションとクライアントからのインバウンドトラフィックを許可されていることを確認します。
-
SOURCE-EU を削除する
**注:**このオペレーションを本番環境に適用する前に、テストインスタンスでこのオペレーションをテストすることがベストプラクティスです。
関連情報
KMS キーを使用して Amazon RDS スナップショットを暗号化するにはどうすればよいですか?
MySQL ウェブサイトでのレプリケーションのトラブルシューティング
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 5ヶ月前lg...
- 質問済み 7年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 4年前
- AWS公式更新しました 4年前