Salta al contenuto

Come posso impedire operazioni DDL nelle mie istanze Amazon RDS per PostgreSQL o Aurora compatibile con PostgreSQL durante le implementazioni blu/verdi?

4 minuti di lettura
0

Desidero impedire operazioni DDL (Data Definition Language) nelle mie istanze Amazon Relational Database Service (Amazon RDS) per PostgreSQL o Amazon Aurora (Aurora) compatibile con PostgreSQL. Le operazioni DDL causano errori durante un'implementazione blu/verde con replica logica.

Breve descrizione

Quando un'operazione DDL viene eseguita sull'istanza Amazon RDS per PostgreSQL durante un'implementazione blu/verde con replica logica, ricevi il seguente messaggio di errore:

"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..."

Quando tenti di effettuare uno switchover, Amazon RDS lo blocca e ricevi il seguente messaggio di errore:

"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."

Le operazioni DDL in RDS per le implementazioni blu/verdi basate su PostgreSQL possono degradare la replica logica tra ambienti e richiedere una ridistribuzione completa. Per evitare il problema, devi configurare i trigger di eventi e le funzioni di attivazione di PostgreSQL sul database blu durante le implementazioni blu/verdi.

Tuttavia, non puoi impedire le seguenti operazioni DDL:

Nota: il problema riguarda RDS per PostgreSQL solo durante gli aggiornamenti, delle versioni principali, quando Amazon RDS utilizza la replica logica anziché la replica fisica. Le restrizioni con la replica logica nativa di PostgreSQL limitano le implementazioni blu/verdi di PostgreSQL durante la replica logica. Per ulteriori informazioni, consulta Restrictions (Restrizioni) sul sito web PostgreSQL.

Risoluzione

Configura trigger di eventi e funzioni di attivazione in PostgreSQL

Crea trigger di eventi e funzioni di attivazione prima di configurare un'implementazione blu/verde. Inoltre, devi creare ogni trigger di eventi e ogni funzione di attivazione separatamente in ogni database che richiede la protezione DDL poiché i trigger di eventi funzionano a livello di database. L'ambiente verde eredita i trigger di eventi e il trigger funziona per impostazione predefinita. Per eseguire operazioni DDL nell'ambiente verde, rilascia prima i trigger e le funzioni che hai creato nell'ambiente blu.

Per configurare i trigger di eventi e le funzioni di attivazione, completa i seguenti passaggi:

  1. Esegui questo comando per accedere al database come superutente:

    psql -U admin -h your_rds_endpoint -d your_database
  2. Esegui questo comando per creare la funzione di blocco 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;

    Nota: nel comando precedente, sostituisci schema_name con il tuo schema.

  3. Esegui questo comando per creare il trigger di eventi:

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

    Nota: nel comando precedente, sostituisci schema_name con il tuo schema.

  4. Esegui questo comando per verificare l'implementazione del trigger:

    -- 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. Esegui questo comando per testare i trigger:

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

Rimuovi il trigger di eventi e la funzione di attivazione

Dopo aver completato il passaggio all'implementazione blu/verde o averla disattivata, esegui questo comando.

Rimuovi il trigger di eventi:

-- Remove event trigger  
DROP EVENT TRIGGER block_ddl_trigger;

Rimuovi la funzione di attivazione:

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

Nota: nel comando precedente, sostituisci schema_name con il tuo schema.

Informazioni correlate

Event triggers (Trigger di eventi) sul sito web PostgreSQL

Event trigger firing matrix (Matrice di attivazione dei trigger di eventi) sul sito web PostgreSQL

Limitazioni di Aurora MySQL per MySQL per implementazioni blu/verdi

Limitazioni di RDS per PostgreSQL per implementazioni blu/green con replica logica

AWS UFFICIALEAggiornata 5 mesi fa