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

Dernière mise à jour: 25/01/2021

J' ai essayé de créer un réplica en lecture chiffré de mon instance Amazon Relational Database Service (Amazon RDS) non chiffrée pour MySQL ou MariaDB.

Cependant, j’ai reçu l'erreur suivante :

« Vous ne pouvez pas créer de réplica en lecture chiffré depuis une instance de base de données non chiffrée. (Service : AmazonRDS ; Code d'état : 400 ; Code d'erreur : InvalidParameterCombination ; ID de requête :) »

Comment chiffrer une instance de base de données non chiffrée avec un temps d'arrêt minimal ?

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.

Pour contourner ces limitations, voir Comment chiffrer une instance de base de données Amazon RDS non chiffrée pour MySQL ou MariaDB 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 en direction de la nouvelle instance de base de données.

Remarque : Ce processus entraîne des temps d'arrêt minimal.

Résolution

1.    Créez un réplica en lecture temporaire pour l'instance Amazon RDS source non chiffrée . Dans cet exemple, l'instance de base de données non chiffrée source s'appelle SOURCE-UE 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. Vous pouvez, si vous le souhaitez, supprimer le réplica TEMP-RR après avoir pris 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 DB, vous pouvez utiliser la même référence d'ID de groupe de sécurité que SOURCE-EU.

  a. Dans la console Amazon RDS, sélectionnez Bases de données.

  b. Sélectionnez l'instance de base de données, puis l'onglet Connectivité et sécurité.

  c. Sélectionnez le groupe de sécurité, puis l'onglet Entrant.

  d. Sélectionnez Modifier, saisissez l'ID du groupe de sécurité, puis sélectionnez Enregistrer.

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 password123 par votre mot de passe.

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

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

Remarque : le point de terminaison rds-endpoint est le point de terminaison de l'instance SOURCE-EU. Si l'instance de base de données source non chiffrée (SOURCE-UE) est accessible publiquement (la propriété Accessible publiquement de l'instance de base de données est définie Oui), vous devez fournir une adresse IP privée au lieu du point de terminaison rds-endpoint.

Le nom d'utilisateur (repl_user) et le mot de passe (password123) 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.

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

mysql > CALL mysql.rds_start_replication;

13.    À partir de l'instance NEW-RR-EN, vérifiez que la réplication se synchronise entre l'instance SOURCE-EU et l'instance NEW-RR-EN.

mysql> SHOW SLAVE STATUS \G
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 l'exécution de cette commande, l'instance NEW RR-EN ne réplique pas les données de l'instance 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, supprimer l'instance SOURCE-EU.

Conseil : il est recommandé de tester cette opération sur une instance restaurée avant de l'effectuer dans un environnement de production.