Passer au contenu

Comment empêcher les opérations DDL dans mes instances Amazon RDS pour PostgreSQL ou Aurora compatible avec PostgreSQL lors de déploiements bleu/vert ?

Lecture de 4 minute(s)
0

Je souhaite empêcher les opérations en langage de définition de données (DDL) dans mes instances Amazon Relational Database Service (Amazon RDS) pour PostgreSQL ou Amazon Aurora (Aurora) édition compatible avec PostgreSQL. Les opérations DDL provoquent des erreurs lors d'un déploiement bleu/vert avec réplication logique.

Brève description

Lorsqu'une opération DDL s'exécute sur l'instance Amazon RDS pour PostgreSQL lors d'un déploiement bleu/vert avec réplication logique, le message d'erreur suivant s'affiche :

« Data definition language (DDL) changes aren't supported... Your green databases now have a status of REPLICATION_DEGRADED. Delete and recreate your blue/green deployment and avoid future DDL changes... »

Lorsque vous essayez d’effectuer un basculement, Amazon RDS bloque ce dernier et le message d'erreur suivant s'affiche :

« Switchover from DB cluster to... was cancelled because there are DDL or Large Object changes on... that can't be replicated. Delete the blue/green deployment along with the target cluster, then re-create it. »

Les opérations DDL dans RDS pour les déploiements bleu/vert basés sur PostgreSQL peuvent dégrader la réplication logique entre les environnements et nécessiter un redéploiement complet. Pour éviter ce problème, vous devez configurer les déclencheurs d'événements et les fonctions de déclenchement PostgreSQL sur la base de données bleue lors des déploiements bleu/vert.

Cependant, vous ne pouvez pas empêcher les opérations DDL suivantes :

  • Commandes qui ciblent des objets partagés, tels que des bases de données, des rôles ou des tablespaces
  • Commandes ciblant les déclencheurs d'événements
  • Modifications d'objets volumineux dans pg_largeobject

Remarque : Ce problème concerne RDS pour PostgreSQL uniquement lors de mises à niveau de versions majeures, lorsqu'Amazon RDS utilise la réplication logique au lieu de la réplication physique. Les restrictions liées à la réplication logique native de PostgreSQL limitent les déploiements bleu/vert de PostgreSQL pendant la réplication logique. Pour en savoir plus, consultez la page Restrictions sur le site Web de PostgreSQL.

Résolution

Configurer les déclencheurs d'événements et les fonctions de déclenchement de PostgreSQL

Créez les déclencheurs d'événements et les fonctions de déclenchement avant de configurer un déploiement bleu/vert. Vous devez également créer chaque déclencheur d'événement et chaque fonction de déclenchement séparément dans chaque base de données nécessitant une protection DDL, car les déclencheurs d'événements fonctionnent au niveau de la base de données. L'environnement vert hérite des déclencheurs d'événements et des fonctions de déclenchement par défaut. Pour effectuer des opérations DDL dans l'environnement vert, supprimez d'abord les déclencheurs et les fonctions que vous avez créés dans l'environnement bleu.

Pour configurer les déclencheurs d'événements et les fonctions de déclenchement, procédez comme suit :

  1. Exécutez la commande suivante pour vous connecter à la base de données en tant que superutilisateur :

    psql -U admin -h your_rds_endpoint -d your_database
  2. Exécutez la commande suivante pour créer la fonction de blocage DDL :

    CREATE OR REPLACE FUNCTION schema_name.block_ddl_bg() RETURNS event_trigger   
    SECURITY DEFINER  
    AS $$  
    DECLARE  
        -- Define allowed users and roles here  
        allowed_users TEXT[] := ARRAY['rdsadmin', 'rdsrepladmin'];  
        allowed_roles TEXT[] := ARRAY['rdsrepladmin'];  
    BEGIN  
        -- Check if either the session user or current role is allowed  
        IF NOT (session_user = ANY(allowed_users) OR current_role = ANY(allowed_roles)) THEN  
            RAISE EXCEPTION 'DDL operations are blocked to prevent Blue Green Deployment replica degradation. User: %, Role: %, Status: BLOCKED',   
                session_user, current_role;  
        END IF;  
    END;  
    $$ LANGUAGE plpgsql;

    Remarque : Dans la commande précédente, remplacez schema_name par votre schéma.

  3. Exécutez la commande suivante pour créer le déclencheur d’événement :

    CREATE EVENT TRIGGER block_ddl_trigger   
        ON ddl_command_start  
        EXECUTE FUNCTION schema_name.block_ddl_bg();

    Remarque : Dans la commande précédente, remplacez schema_name par votre schéma.

  4. Exécutez la commande suivante pour vérifier l'implémentation du déclencheur :

    -- Check if the function exists  
    SELECT proname, pronamespace::regnamespace   
    FROM pg_proc   
    WHERE proname = 'block_ddl_bg';  
    
    -- Check if the event trigger exists  
    SELECT evtname, evtevent, evtowner::regrole   
    FROM pg_event_trigger   
    WHERE evtname = 'block_ddl_trigger';
  5. Exécutez la commande suivante pour tester les déclencheurs :

    -- Try to create a test table  
    CREATE TABLE test_table (id int);  
    -- Should receive blocking message

Supprimer le déclencheur d'événements et la fonction de déclenchement

Une fois que vous avez terminé le basculement bleu/vert ou que vous avez mis hors service le déploiement bleu/vert, exécutez la commande suivante.

Supprimer le déclencheur d'événement :

-- Remove event trigger  
DROP EVENT TRIGGER block_ddl_trigger;

Supprimez la fonction de déclenchement :

-- Remove trigger function  
DROP FUNCTION schema_name.block_ddl_bg();

Remarque : Dans la commande précédente, remplacez schema_name par votre schéma.

Informations connexes

Déclencheurs d'événements sur le site Web de PostgreSQL

Matrice de décision pour un déclencheur d'événements sur le site Web de PostgreSQL

Limitations d'Aurora PostgreSQL pour les déploiements bleu/vert

Limitations de RDS pour PostgreSQL pour les déploiements bleu/vert avec réplication logique

AWS OFFICIELA mis à jour il y a un an