Ir para o conteúdo

Como posso criptografar uma instância de banco de dados não criptografada do Amazon RDS para MySQL ou MariaDB com o mínimo de tempo de inatividade?

7 minuto de leitura
0

Tentei criar uma réplica de leitura criptografada da minha instância de banco de dados não criptografada do Amazon Relational Database Service (Amazon RDS) para MySQL ou MariaDB. No entanto, recebi uma mensagem de erro.

Breve descrição

O Amazon RDS tem as seguintes limitações para instâncias de banco de dados criptografadas:

  • Não é possível modificar uma instância de banco de dados não criptografada existente do Amazon RDS para criptografar a instância.
  • Não é possível criar uma réplica de leitura criptografada a partir de uma instância não criptografada.

Como não é possível criptografar uma instância de banco de dados existente do Amazon RDS, você deve criar uma nova instância criptografada. Caso contrário, ao criar uma réplica de leitura criptografada de uma instância não criptografada do Amazon RDS para MySQL, você receberá a seguinte mensagem de erro:

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

Para criptografar uma instância de banco de dados não criptografada com tempo de inatividade mínimo, conclua as seguintes etapas:

  1. Criptografe um snapshot não criptografado obtido de uma réplica de leitura não criptografada da instância de banco de dados.
  2. Restaure uma nova instância de banco de dados a partir do snapshot criptografado para implantar uma nova instância de banco de dados criptografada.
  3. Use a replicação do MySQL para sincronizar as alterações da origem para a nova instância de banco de dados criptografada.
  4. Verifique se a nova instância de banco de dados criptografada está sincronizada com a instância de banco de dados de origem.
  5. Troque suas conexões e redirecione seu tráfego para a nova instância de banco de dados.

Resolução

Criptografe um snapshot não criptografado

Para criptografar um snapshot não criptografado obtido de uma réplica de leitura não criptografada, conclua as etapas a seguir:

  1. Crie uma réplica de leitura temporária da instância de banco de dados não criptografada de origem do Amazon RDS. Neste exemplo, a instância de banco de dados não criptografada de origem é SOURCE-EU e a réplica de leitura temporária é TEMP-RR.

  2. Conecte-se ao TEMP-RR. Em seguida, execute o seguinte comando para monitorar o atraso da réplica até que Seconds_Behind_Master fique estável no valor 0:

    mysql> SHOW SLAVE STATUS \G
    Seconds_Behind_Master: 0

    Observação: um valor estável mostra que TEMP-RR está sincronizado com SOURCE-EU.

  3. Execute o comando a seguir para interromper o processo de replicação em TEMP-RR:

    MySQL > call mysql.rds_stop_replication;
    +---------------------------+
    | Message                   |
    +---------------------------+
    | Slave is down or disabled |
    +---------------------------+
    
  4. Observe os valores de Relay_Master_Log_File e Exec_Master_Log_Pos de TEMP-RR, conforme mostrado no exemplo a seguir:

    mysql> SHOW SLAVE STATUS \G
    Relay_Master_Log_File: mysql-bin-changelog.000012
    Exec_Master_Log_Pos: 123
  5. Em SOURCE-EU, defina o parâmetro binlog retention hours para preservar os logs binários pelo tempo necessário para concluir a operação. No exemplo a seguir, binlog retention hours está definido como 24 horas:

    mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
  6. Capture um snapshot de TEMP-RR. Opcionalmente, exclua TEMP-RR depois de obter o snapshot.

  7. Copie o snapshot de TEMP-RR e defina Habilitar criptografia como Sim.

Restaure uma nova instância de banco de dados do snapshot criptografado

Restaure uma nova instância de banco de dados a partir do snapshot copiado e ative a criptografia. Neste exemplo, a nova instância de banco de dados criptografada é NEW-RR-EN.

Modifique as regras de entrada no grupo de segurança SOURCE-EU para permitir o tráfego a partir de NEW-RR-EN. Se você usar o mesmo grupo de segurança nas duas instâncias de banco de dados, é possível usar a mesma referência de ID do grupo de segurança que SOURCE-EU.

Observação: permita o tráfego de saída para SOURCE-EU a partir de NEW-RR-EN.

Sincronize as alterações da instância de origem para a nova instância criptografada

Para usar a replicação MySQL para sincronizar alterações da origem para a nova instância de banco de dados criptografada, conclua as seguintes etapas:

  1. Faça login em SOURCE-EU.
  2. Execute os comandos a seguir para configurar um usuário de replicação e conceder as permissões necessárias ao usuário:
    mysql> create user 'repl_user'@'%' identified by 'password123';
    mysql> grant replication slave, replication client on *.* to 'repl_user'@'%';
    mysql> show grants for 'repl_user'@'%';
    Observação: substitua repl_user pelo seu nome de usuário de replicação e password123 pela sua senha.
  3. Execute o comando a seguir para conectar-se a NEW-RR-EN e estabelecer uma conexão de replicação com SOURCE-EU:
    mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );
    Observação: substitua rds-endpoint pelo endpoint da instância de banco de dados de SOURCE-EU. Substitua repl_user e password123 pelo nome de usuário e senha que você criou. Use os valores Relay_Master_Log_File and Exec_Master_Log_Pos para configurar a replicação com o procedimento mysql.rds_set_external_master. Se SOURCE-EU estiver acessível publicamente e NEW-RR-EN estiver definido como privado, use o endereço IP privado de SOURCE-EU em vez de rds-endpoint.
  4. Em NEW-RR-EN, execute o seguinte comando para iniciar a replicação:
    mysql > CALL mysql.rds_start_replication;

Verificar se a instância criptografada está sincronizada com a instância de origem

Para verificar se a nova instância de banco de dados criptografada está sincronizada com a instância de banco de dados de origem, conclua as seguintes etapas:

  1. Em NEW-RR-EN, execute o seguinte comando para confirmar se a replicação foi bem-sucedida e está sincronizada entre SOURCE-EU e NEW-RR-EN:

    mysql> SHOW SLAVE STATUS \G

    Se a conexão entre a instância de banco de dados de origem e a réplica de leitura for bem-sucedida, a saída será semelhante a esta:

    Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0
  2. Depois que Seconds_Behind_Master estiver estável no valor 0, interrompa o tráfego e feche as conexões em SOURCE-EU.
    Observação: interrompa todos os servidores e clientes de aplicação que se conectam a SOURCE-EU para garantir que nenhuma nova alteração seja feita em SOURCE-EU. Opcionalmente, é possível bloquear de forma temporária o grupo de segurança usado por SOURCE-EU. Você deve impedir o tráfego de entrada de qualquer aplicação ou cliente, exceto de NEW-RR-EN e o host a partir do qual o usuário realiza essas ações.

Troque suas conexões e redirecione seu tráfego para a nova instância de banco de dados

Para trocar suas conexões e redirecionar seu tráfego à nova instância de banco de dados, conclua as seguintes etapas:

  1. Como usuário líder do banco de dados, conecte-se a NEW-RR-EN e execute o seguinte comando para interromper a replicação:

    MySQL > call mysql.rds_stop_replication;

    Observação: depois de executar esse comando, NEW-RR-EN não replicará mais os dados de SOURCE-EU.

  2. Para promover NEW-RR-EN para um servidor independente, execute o seguinte comando para interromper o relacionamento de replicação entre SOURCE-EU e NEW-RR-EN:

    MySQL > call mysql.rds_reset_external_master;
  3. Para apontar todas as aplicações, clientes e conexões de banco de dados para NEW-RR-EN, especifique o endpoint de DNS NEW-RR-EN em todas as strings de conexão. Ou renomeie SOURCE-EU e modifique NEW-RR-EN para usar o mesmo nome usado por SOURCE-EU.

  4. Confirme se as regras do grupo de segurança em NEW-RR-EN permitem tráfego de entrada das aplicações e clientes apropriados.

  5. Exclua SOURCE-EU.
    Observação: antes de aplicar essa operação em um ambiente de produção, é uma prática recomendada testar esta operação em uma instância de teste.

Informações relacionadas

Trabalhar com réplicas de leitura de instância de banco de dados

Como extrair um snapshot criptografado de uma instância de banco de dados do Amazon RDS não criptografada?

Troubleshooting replication (Solução de problemas de replicação) no site do MySQL

Configurar a replicação da posição do arquivo de log binário com uma instância de origem externa

AWS OFICIALAtualizada há 10 meses