Comment puis-je chiffrer une instance de base de données Amazon RDS pour MySQL ou MariaDB en limitant le temps d'interruption au maximum ?

Date de la dernière mise à jour : 19/08/2020

Je souhaite créer un réplica en lecture chiffré de mon instance Amazon Relational Database Service (Amazon RDS) pour MySQL ou MariaDB. Cependant, j'ai reçu l'erreur suivante :

« You cannot create an encrypted Read Replica from an unencrypted DB instance. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: » (Vous ne pouvez pas créer un réplica en lecture chiffré à partir d'une instance de base de données non chiffrée. (Service : AmazonRDS, Status Code : 400, Code d'erreur : InvalidParameterCombination, ID de demande :)

Comment chiffrer une instance de base de données non chiffrée avec une interruption minimale ?

Brève description

Les limitations suivantes relatives aux instances de base de données chiffrées s'appliquent à Amazon RDS :

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

Procédez comme suit :

1.    Chiffrez un instantané pris à partir d'un réplica en lecture non chiffré de l'instance.

2.    Restaurez une nouvelle instance de base de données RDS à 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.

Ce processus implique un temps d'interruption minimal.

Solution

1.    Créez un réplica en lecture temporaire pour l'instance de base de données Amazon RDS non chiffrée source. 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 le même groupe de sécurité est utilisé sur les deux instances de base de données, vous pouvez employer le même ID de groupe de sécurité que celui correspondant à l'instance SOURCE-EU. Dans la console Amazon RDS, sélectionnez Bases de données. Sélectionnez l'instance de base de données, puis l'onglet Connectivité et sécurité. Sélectionnez le groupe de sécurité, puis l'onglet Entrant. Sélectionnez Modifier, saisissez l'ID de votre groupe de sécurité, puis choisissez Enregistrer.
Remarque : vérifiez que le trafic sortant à destination de l'instance SOURCE-EU est autorisé en provenance de l'instance NEW RR-EN.

10.    Connectez-vous à l'instance SOURCE-EU, configurez un utilisateur et accordez les privilèges nécessaires à ce dernier :

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, 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 non chiffrée source (SOURCE-UE) est accessible publiquement (la propriété Accessible publiquement de l'instance de base de données est définie sur 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. L'interruption commence alors.

Remarque : arrêtez tous les serveurs d'application et clients qui se connectent à l'instance 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 NEW RR-EN en spécifiant le point de terminaison DNS de 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 en direction de l'instance NEW RR-EN et testé l'environnement, vous pouvez supprimer l'instance SOURCE-EU.

Conseil : il est recommandé de tester cette procédure sur une instance restaurée avant de l'exécuter dans un environnement de production.