Configurare Secret Manager per il tuo ambiente

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

Questa pagina mostra come utilizzare Secret Manager per archiviare in modo sicuro le connessioni e i secret di Airflow.

Configurare Secret Manager per il tuo ambiente

In questa sezione viene spiegato come configurare Secret Manager in modo da poter utilizzare i secret con l'ambiente Cloud Composer.

Abilitare l'API Secret Manager

Console

Abilita l'API Secret Manager.

Ruoli richiesti per abilitare le API

Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin), che contiene l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

Abilitare l'API

gcloud

Abilita l'API Secret Manager:

Ruoli richiesti per abilitare le API

Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin), che contiene l' serviceusage.services.enable autorizzazione. Scopri come concedere i ruoli.

gcloud services enable secretmanager.googleapis.com

Configurare il controllo dell'accesso

Devi configurare il controllo dell'accesso in modo che Airflow possa accedere ai secret archiviati in Secret Manager.

A questo scopo, il account di servizio che accede ai secret deve avere un ruolo con l'autorizzazione secretmanager.versions.access. Ad esempio, il ruolo Accessore secret Secret Manager include questa autorizzazione.

Puoi concedere questo ruolo a livello di secret, progetto, cartella o organizzazione.

Utilizza una delle seguenti opzioni:

  • (Consigliato) Concedi questo ruolo al service account del tuo ambiente.

  • Esegui l'override del account di servizio con cui Airflow accede a Secret Manager.

    1. Concedi questo ruolo a un account di servizio.
    2. Imposta il parametro gcp_key_path dell'opzione di configurazione di Airflow backend_kwargs in modo che punti a un file JSON con le credenziali del account di servizio.

Abilitare e configurare il backend di Secret Manager

  1. Esegui l'override della seguente opzione di configurazione di Airflow:

    Sezione Chiave Valore
    secrets backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
  2. (Airflow 2.10.2 e versioni successive) Assicurati che l'opzione di configurazione di Airflow [secrets]backends_order specifichi un ordine di ricerca dei secret che contenga un backend dei secret custom in esso. Il valore predefinito di questa opzione contiene già questo valore.

    Sezione Chiave Valore
    secrets backends_order (predefinito) custom,environment_variable,metastore
  3. Aggiungi impostazioni facoltative eseguendo l'override della seguente opzione di configurazione di Airflow:

    Sezione Chiave Valore
    secrets backend_kwargs Consulta la seguente descrizione.

    Il valore backend_kwargs è la rappresentazione JSON dell'oggetto backend_kwargs con i seguenti campi:

    • connections_prefix: prefisso del nome del secret da leggere per ottenere le connessioni. Il valore predefinito è airflow-connections.
    • variables_prefix: prefisso del nome del secret da leggere per ottenere le variabili. Il valore predefinito è: airflow-variables.
    • gcp_key_path: percorso del file JSON delle credenziali (se non viene fornito, viene utilizzato il account di servizio predefinito). Google Cloud
    • gcp_keyfile_dict: Google Cloud dizionario JSON delle credenziali. Si esclude a vicenda con gcp_key_path.
    • sep: separatore utilizzato per concatenare connections_prefix e conn_id. Il valore predefinito è -.
    • project_id: Google Cloud ID progetto in cui sono archiviati i secret.

    Ad esempio, il valore di backend_kwargs può essere: {"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}.

Aggiungere connessioni e variabili in Secret Manager

Crea i secret seguendo i passaggi descritti in Creare secret e versioni.

Variabili

  • Deve utilizzare il formato [variables_prefix][sep][variable_name].
  • Il valore predefinito per [variables_prefix] è airflow-variables.
  • Il separatore predefinito [sep] è -.

Ad esempio, se il nome della variabile è example-var, il nome del secret è airflow-variables-example-var.

Nomi delle connessioni

  • Deve utilizzare il formato [connection_prefix][sep][connection_name].
  • Il valore predefinito per [connection_prefix] è airflow-connections.
  • Il separatore predefinito [sep] è -.

Ad esempio, se il nome della connessione è exampleConnection, il nome del secret è airflow-connections-exampleConnection.

Valori di connessione

  • Deve utilizzare la rappresentazione URI. Ad esempio, postgresql://login:secret@examplehost:9000.

  • L'URI deve essere codificato come URL (codificato con una percentuale). Ad esempio, una password che contiene un simbolo di spazio deve essere codificata come URL nel seguente modo: postgresql://login:secret%20password@examplehost:9000.

Airflow ha un metodo pratico per generare URI di connessione. Nella documentazione di Airflow è disponibile un esempio di come codificare un URL complesso con extra JSON.

Utilizzare Secret Manager con Cloud Composer

Quando recupera variabili e connessioni, Cloud Composer controlla prima Secret Manager. Se la variabile o la connessione richiesta non viene trovata, Cloud Composer controlla le variabili di ambiente e il database Airflow.

Leggere le variabili utilizzando i modelli Jinja

Puoi utilizzare Secret Manager per leggere le variabili con i modelli Jinja per i campi degli operatori con modelli (risolti al momento dell'esecuzione).

Per il secret airflow-variables-secret_filename:

file_name = '{{var.value.secret_filename}}'

Leggere le variabili utilizzando operatori personalizzati e callback

Puoi anche utilizzare Secret Manager per leggere le variabili negli operatori personalizzati o nei metodi di callback degli operatori. La lettura delle variabili dall'interno dei DAG può influire negativamente sulle prestazioni, quindi utilizza i modelli Jinja se vuoi utilizzare le variabili nei tuoi DAG.

Ad esempio, per il secret airflow-variables-secret_filename:

from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')

Leggere le connessioni

A meno che tu non stia scrivendo un operatore personalizzato, raramente dovrai accedere direttamente alle connessioni. La maggior parte degli hook riceve il nome della connessione come parametro di creazione e deve recuperare automaticamente le connessioni dal backend dei secret quando vengono eseguiti i task.

La lettura diretta delle connessioni può essere utile quando scrivi il tuo hook.

Ad esempio, per la connessione airflow-connections-exampleConnection:

from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')

BaseHook.get_connection restituisce un oggetto Connection. È possibile ottenere la rappresentazione della stringa URI di una connessione come segue:

exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()

Passaggi successivi