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 :
-
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
-
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.
-
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.
-
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';
-
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