Comment puis-je chiffrer une instance de base de données Amazon RDS non chiffrée pour MySQL ou MariaDB avec un temps d'arrêt minimal ?

Date de la dernière mise à jour : 08/09/2021

Je souhaite créer un réplica en lecture chiffré de mon instance Amazon Relational Database Service (Amazon RDS) pour MySQL ou MariaDB. Cependant, je reçois un message d'erreur. Comment puis-je résoudre ce problème ?

Brève description

Amazon RDS a les limitations suivantes pour les instances de base de données chiffrées :

  • Vous ne pouvez pas modifier une instance de base de données Amazon RDS existante pour la chiffrer.
  • Vous ne pouvez pas créer un réplica en lecture chiffré à partir d'une instance non chiffrée.

Comme vous ne pouvez pas chiffrer une instance Amazon RDS existante, vous devez créer une nouvelle instance chiffrée. Sinon, lorsque vous créez un réplica en lecture chiffré d'une instance Amazon RDS for MySQL non chiffrée, vous recevez le message d'erreur suivant :

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

Pour chiffrer une instance de base de données non chiffrée avec un temps d'arrêt minimal, procédez comme suit :

1.    Cryptez un instantané non chiffré que vous prenez à partir d'un réplica en lecture non chiffré de l'instance de base de données.

2.    Restaurez une nouvelle instance de base de données à partir de l'instantané chiffré, afin de déployer une nouvelle instance de base de données chiffrée.

3.    Procédez à une réplication MySQL pour synchroniser, avec la nouvelle instance de base de données chiffrée, les modifications apportées à l'instance source.

4.    Vérifiez que la nouvelle instance de base de données chiffrée se synchronise avec l'instance de base de données source.

5.    Modifiez vos connexions et redirigez votre trafic vers la nouvelle instance de base de données.

Résolution

Configuration de la réplication avec un temps d'arrêt minimal

1.    Créez un réplica en lecture temporaire pour l'instance de base de données Amazon RDS source non chiffrée. Dans cet exemple, l'instance de base de données source non chiffrée s'appelle SOURCE-EU et le réplica en lecture temporaire s'appelle TEMP-RR.

2.    Connectez-vous au réplica TEMP-RR, puis contrôlez le temps de latence. La valeur Seconds_Behind_Master doit être stable et correspondre à 0. Si tel est le cas, le réplica TEMP-RR se synchronise avec l'instance SOURCE-EU:

mysql> SHOW SLAVE STATUS \G
Seconds_Behind_Master: 0

3.    Arrêtez le processus de réplication sur TEMP-RR.

MySQL > call mysql.rds_stop_replication;
+---------------------------+
| Message                   |
+---------------------------+
| Slave is down or disabled |
+---------------------------+

4.    Prenez note des valeurs Relay_Master_Log_File et Exec_Master_Log_Pos applicables au réplica TEMP-RR :

mysql> SHOW SLAVE STATUS \G
Relay_Master_Log_File: mysql-bin-changelog.000012
Exec_Master_Log_Pos: 123

5.    Dans SOURCE-EU, définissez le paramètre binlog retention hours (heures de conservation binlog) pour conserver les journaux binaires durant le temps nécessaire à l'exécution de l'opération. Dans l'exemple suivant, binlog retention hours (heures de conservation binlog) a la valeur 24 heures :

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

6.    Créez un instantané du réplica TEMP-RR. Si vous le souhaitez, supprimez TEMP-RR après avoir capturé l'instantané.

7.    Copiez l'instantané du réplica TEMP-RR, puis définissez l'option Activer le chiffrement sur Oui.

8.    Restaurez une nouvelle instance de base de données à partir de l'instantané copié pour lequel le chiffrement est activé. Dans cet exemple, la nouvelle instance de base de données chiffrée s'appelle NEW RR-EN.

9.    Modifiez les règles entrantes dans le groupe de sécurité de SOURCE-EU pour autoriser le trafic à partir de NEW RR-EN. Si vous utilisez le même groupe de sécurité sur les deux instances de base de données, vous pouvez utiliser la même référence d'ID de groupe de sécurité que SOURCE-EU.

Remarque : assurez-vous d'autoriser le trafic sortant vers SOURCE-EU à partir de NEW-RR-EN.

10.    Connectez-vous à SOURCE-EU, configurez un utilisateur de réplication, puis accordez les autorisations nécessaires à l'utilisateur :

mysql> create user 'repl_user'@'%' identified by 'password123';
mysql> grant replication slave, replication client on *.* to 'repl_user'@'%';
mysql> show grants for 'repl_user'@'%';

Remarque : remplacez repl_user par votre nom d'utilisateur de réplication, et mot de passe123 par votre mot de passe.

11.    Connectez-vous à NEW RR-EN et établissez une connexion de réplication vers SOURCE-EU :

mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );

rds-endpoint est le point de terminaison de l'instance de base de données pour SOURCE-EU.

Le nom d'utilisateur (repl_user) et le mot de passe (mot de passe123) sont identiques à ceux que vous avez créés lors de l'étape 10. Utilisez les valeurs Relay_Master_Log_File et Exec_Master_Log_Pos, dont vous avez pris note lors de l'étape 4, pour configurer la réplication au moyen de la procédure mysql.rds_set_external_master.

Remarque : si SOURCE-EU est accessible publiquement et que NEW-RR-EN (nouvelle instance de base de données chiffrée) est défini sur « privé », utilisez l'adresse IP privée (de SOURCE-EU) au lieu de rds-endpoint.

12.    À partir de l'instance NEW-RR-EN, démarrez la réplication :

mysql > CALL mysql.rds_start_replication;

13.    À partir de NEW-RR-EN, vérifiez que la réplication a réussi et qu'elle est synchronisée entre SOURCE-EU et NEW-RR-EN.

mysql> SHOW SLAVE STATUS \G

Si votre connexion entre l'instance de base de données source et le réplica en lecture est réussie, votre sortie ressemble à ceci :

Slave_IO_State: Waiting for master to send event
Seconds Behind master: 0

14.    Une fois que la valeur Seconds_Behind_Master est stable et correspond à 0, mettez fin au trafic et désactivez les connexions sur l'instance SOURCE-EU. Les temps d'arrêt commencent alors.

Remarque : arrêtez tous les serveurs d'applications et clients qui se connectent à SOURCE-EU pour vous assurer qu'aucune nouvelle modification n'est apportée à SOURCE-EU. Si vous le souhaitez, vous pouvez verrouiller temporairement le groupe de sécurité utilisé par l'instance SOURCE-EU. Ceci empêche le trafic entrant à partir de n'importe quelle application ou de n'importe quel client, à l'exception de l'instance NEW RR-EN et de l'hôte à partir duquel l'utilisateur exécute ces actions.

15.    En tant qu'utilisateur principal de la base de données, connectez-vous à l'instance NEW RR-EN et mettez fin à la réplication :

MySQL > call mysql.rds_stop_replication;

Important : après avoir exécuté cette commande, NEW-RR-EN ne réplique plus les données de SOURCE-EU.

16.    Promouvez l'instance NEW RR-EN au rang de serveur autonome en désactivant la relation de réplication entre l'instance SOURCE-EU et l'instance NEW-RR-EN :

MySQL > call mysql.rds_reset_external_master;

17.    Pointez toutes les applications, tous les clients et toutes les connexions de base de données vers l’instanceNEW RR-EN en spécifiant le point de terminaison DNS de l’instance NEW RR-EN dans toutes les chaînes de connexion. Vous pouvez aussi renommer l'instance SOURCE-EU, puis modifier l'instance NEW RR-EN, pour employer le même nom que celui utilisé par l'instance SOURCE-EU.

18.    Vérifiez que les règles du groupe de sécurité associé à l'instance NEW-RR-EN autorisent le trafic entrant en provenance des applications et clients appropriés.

19.    Une fois que vous avez pointé les applications et les clients vers l'instance NEW RR-EN et testé l'environnement, supprimez l'instance SOURCE-EU.

Astuce : une bonne pratique consiste à tester cette opération sur une instance de test avant de l'appliquer dans un environnement de production.