Configura Secret Manager per il tuo ambiente

Cloud Composer 1 | Cloud Composer 2

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 utilizzare Airflow 1.10.10 o versioni successive e Python 3.6 o versioni successive.
  • Python 2 non è supportato.

Configura Secret Manager per il tuo ambiente

Questa sezione spiega come configurare Secret Manager in modo da poter 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 controllo dell'accesso'accesso in modo che Airflow possa accedere ai secret archiviati in 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 Accessore 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 la serializzazione DAG

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

Il server web Airflow viene eseguito con un account di servizio diverso con autorizzazioni limitate, quindi non può accedere ai secret in Secret Manager. Se 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 dei metodi execute(), attiva la serializzazione DAG. Una volta eseguita questa operazione, il server web Airflow accetta i DAG elaborati e non ha bisogno di accedere 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 della seguente opzione di configurazione di Airflow:

    Sezione Chiave Valore
    secrets backend_kwargs Vedi la descrizione che segue.

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

    • connections_prefix: specifica il prefisso del nome del secret da leggere per ottenere le connessioni. Il valore predefinito è airflow-connections.
    • variables_prefix: specifica il prefisso del nome del secret da leggere per ricevere le variabili. Il valore predefinito è airflow-variables.
    • gcp_key_path: percorso del file JSON delle credenziali Google Cloud (se non fornito, viene utilizzato l'account di servizio predefinito).
    • gcp_keyfile_dict: il dizionario JSON delle credenziali Google Cloud. In esclusiva con gcp_key_path.
    • sep: separatore utilizzato per concatenare connections_prefix e conn_id. Valore predefinito: -.
    • project_id: l'ID del 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 utilizzare 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, il nome del secret è airflow-variables-example-var.

Nomi di connessione

  • 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 una rappresentazione URI. Ad esempio, mysql://login:password@examplehost:9000.

  • L'URI deve essere con codifica URL (percentuale di codifica). Ad esempio, una password che contiene uno spazio deve essere codificata nell'URL come segue: mysql://login:secret%20password@examplehost:9000.

Airflow ha un metodo di convenienza per la generazione degli URI di connessione. Un esempio di come codificare un URL complesso con elementi extra JSON è disponibile nella documentazione di Airflow.

Utilizza Secret Manager con Cloud Composer

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

Lettura variabili utilizzando i modelli Jinja

Puoi utilizzare Secret Manager per leggere le variabili con il modello Jinja per i campi operatore basati su modelli (risolti 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 negli operatori personalizzati o i metodi di callback degli operatori. La lettura delle variabili all'interno dei DAG può influire negativamente sulle prestazioni, quindi utilizza i modelli Jinja se vuoi impiegare 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')

Lettura 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 informazione e dovrebbe recuperare automaticamente le connessioni dal backend del secret quando vengono eseguite le attività.

Leggere direttamente i legami può essere utile per scrivere il vostro 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 questa:

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

Passaggi successivi