Configura Secret Manager per il tuo ambiente

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

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

Prima di iniziare

  • Per utilizzare Secret Manager, il tuo ambiente Cloud Composer deve usare Airflow 1.10.10 o successivo e Python 3.6 o successivo.
  • Python 2 non è supportato.

Configura Secret Manager per il tuo ambiente

Questa sezione spiega come configurare Secret Manager in modo da può utilizzare i secret con il tuo ambiente Cloud Composer.

Abilita l'API Secret Manager

Console

Attiva l'API Secret Manager.

Abilita l'API

gcloud

Attiva l'API Secret Manager.

gcloud services enable secretmanager.googleapis.com

Configura il controllo dell'accesso

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

Per farlo, l'account di servizio che accede ai secret deve avere un ruolo con l'autorizzazione secretmanager.versions.access. Ad esempio: il ruolo Funzione di accesso ai secret di Secret Manager include questa autorizzazione.

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

Utilizza una delle seguenti opzioni:

Abilita serializzazione DAG

In generale, dovresti usare solo il backend di Secret Manager all'interno dei metodi execute() dei tuoi operatori o con Modelli Jinja. Ad esempio, puoi recuperare le variabili utilizzando var.value.example_var.

Il server web di Airflow viene eseguito in un account di servizio diverso con autorizzazioni, in modo che non possa accedere ai secret in Secret Manager. Se le tue Il codice DAG accede ai secret durante l'elaborazione dei DAG (non solo dalle attività) e non è possibile modificarlo per accedere ai secret dall'interno i metodi execute(), quindi abilitare la serializzazione DAG. Dopodiché, Airflow server web accetta i DAG elaborati e non ha bisogno dell'accesso ai secret.

Abilita e configura 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. Aggiungi impostazioni facoltative eseguendo l'override di Airflow seguente di configurazione:

    Sezione Chiave Valore
    secrets backend_kwargs Vedi la descrizione che segue.

    Il valore backend_kwargs è la rappresentazione JSON del Oggetto backend_kwargs con i seguenti campi:

    • connections_prefix: prefisso del nome del secret da leggere per get Connections. Il valore predefinito è airflow-connections.
    • variables_prefix: prefisso del nome del secret da leggere per ottenere Variabili. Il valore predefinito è airflow-variables.
    • gcp_key_path: percorso del file JSON delle credenziali Google Cloud (se non viene specificato, viene utilizzato l'account di servizio predefinito).
    • gcp_keyfile_dict: dizionario JSON delle credenziali di Google Cloud. A vicenda in esclusiva con gcp_key_path.
    • sep: separatore utilizzato per concatenare connections_prefix e conn_id. Il valore predefinito è -.
    • project_id: ID progetto Google Cloud 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":"-"}.

Aggiungi connessioni e variabili in Secret Manager

Crea i secret seguendo i passaggi descritti in Creazione di secret e versioni.

Variabili

  • Deve essere utilizzato il formato [variable_prefix][sep][variable_name].
  • Il valore predefinito per [variable_prefix] è airflow-variables.
  • Il separatore predefinito [sep] è -.

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

Nomi delle connessioni

  • Deve essere utilizzato 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 secret nome è airflow-connections-exampleConnection.

Valori di connessione

  • Da utilizzare Rappresentazione URI. Ad esempio: postgresql://login:secret@examplehost:9000.

  • L'URI deve essere codificato in formato URL (codifica percentuale). Ad esempio, una password con uno spazio. deve avere la codifica URL come segue: postgresql://login:secret%20password@examplehost:9000.

Airflow ha un metodo pratico per generare una connessione per gli URI. È disponibile un esempio di come codificare un URL complesso con extra JSON nella documentazione di Airflow.

Usa Secret Manager con Cloud Composer

Durante il recupero di variabili e connessioni, Cloud Composer controlla Secret Manager. Se la variabile o la connessione richiesta non è trovato, Cloud Composer controlla le variabili di ambiente il database Airflow.

Leggi le variabili utilizzando i modelli Jinja

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

Per il secret airflow-variables-secret_filename:

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

Leggi le variabili utilizzando operatori e callback personalizzati

Puoi anche utilizzare Secret Manager per leggere le variabili in o i metodi di callback dagli operatori. Lettura variabili da all'interno dei DAG possono influire negativamente sulle prestazioni, quindi usa i modelli Jinja se vuoi usare le variabili nei DAG.

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

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

Leggi connessioni

A meno che tu non stia scrivendo un operatore personalizzato, raramente dovresti avere bisogno di accedere direttamente alle connessioni. La maggior parte degli hook utilizza il nome della connessione di creazione di un'istanza e deve recuperare le connessioni dal secret backend automaticamente quando vengono eseguite le attività.

Leggere direttamente le 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. È ottenere la rappresentazione stringa URI di una connessione come questa:

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

Passaggi successivi