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 poter utilizzare i secret con l'ambiente Cloud Composer.
Abilita l'API Secret Manager
Console
Enable the Secret Manager API.
gcloud
Enable the Secret Manager API:
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.
A tale scopo, 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:
(Consigliato) Concedi questo ruolo all'account di servizio del tuo ambiente.
Sostituisci l'account di servizio con cui Airflow accede a Secret Manager.
- Concedi questo ruolo a un account di servizio.
- Imposta il parametro
gcp_key_path
dell'backend_kwargs
opzione di configurazione di Airflow in modo che indichi un file JSON con le credenziali dell'account di servizio.
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 Airflow viene eseguito in un account di servizio diverso con autorizzazioni limitate, pertanto non può accedere ai secret in Secret Manager. Se il codice DAG accede ai secret durante l'elaborazione del DAG (non solo dalle attività) e non è possibile modificarlo in modo da accedere ai secret all'interno dei metodi execute()
, abilita 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
Esegui l'override della seguente opzione di configurazione di Airflow:
Sezione Chiave Valore secrets
backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
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 dell'oggettobackend_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 specificato, viene utilizzato l'account di servizio predefinito).gcp_keyfile_dict
: dizionario JSON delle credenziali di Google Cloud. A vicenda in esclusiva congcp_key_path
.sep
: separatore utilizzato per concatenareconnections_prefix
econn_id
. Il 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":"-"}
.
Aggiungere 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
[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
, 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 come URL (codifica percentuale). Ad esempio, una password con uno spazio. deve avere la codifica URL come segue:
postgresql://login:secret%20password@examplehost:9000
.
Airflow dispone di un metodo di utilità per la generazione di URI di connessione. Un esempio di come codificare un URL complesso con elementi extra JSON è disponibile nella documentazione di Airflow.
Usa Secret Manager con Cloud Composer
Quando recupera le variabili e le connessioni, Cloud Composer controlla prima Secret Manager. Se la variabile o la connessione richiesta non è trovato, Cloud Composer controlla le variabili di ambiente il database Airflow.
Leggere 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 (risolti al momento dell'esecuzione).
Per il secret airflow-variables-secret_filename
:
file_name = '{{var.value.secret_filename}}'
Leggere 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')
Lettura delle 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
. È possibile ottenere la rappresentazione in stringa URI di una connessione come questa:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()