Airflow gestito (3ª gen.) | Airflow gestito (2ª gen.) | Airflow gestito (1ª gen. precedente)
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 Managed Airflow deve utilizzare Airflow 1.10.10 o versioni successive e Python 3.6 o versioni successive.
- Python 2 non è supportato.
Configurare Secret Manager per il tuo ambiente
Questa sezione spiega come configurare Secret Manager in modo da poter utilizzare i secret con l'ambiente Managed Airflow.
Abilita l'API Secret Manager
Console
Abilita l'API Secret Manager.
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente disponi già di questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.
gcloud
Abilita l'API Secret Manager:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente disponi già di questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.
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.
A questo scopo, il account di servizio che accede ai secret deve disporre di un ruolo con l'autorizzazione secretmanager.versions.access. Ad esempio, il ruolo Secret Manager Secret Accessor 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.
- Concedi questo ruolo a un account di servizio.
- Imposta il parametro
gcp_key_pathdell'opzione di configurazione di Airflowbackend_kwargsin modo che punti a un file JSON con le credenziali dell'account di servizio.
Abilita la serializzazione DAG
In generale, devi utilizzare il backend di Secret Manager solo
all'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, pertanto non può accedere ai secret in Secret Manager. Se il codice DAG accede ai secret durante l'elaborazione DAG (non solo dalle attività) e non è possibile modificarlo per accedere ai secret dall'interno dei metodi execute(), attiva la serializzazione DAG. Una volta fatto, il server web di Airflow prende i DAG elaborati e non ha bisogno di accedere ai secret.
Attiva e configura il backend Secret Manager
Esegui l'override della seguente opzione di configurazione di Airflow:
Sezione Chiave Valore secretsbackendairflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackendAggiungi impostazioni facoltative eseguendo l'override della seguente opzione di configurazione di Airflow:
Sezione Chiave Valore secretsbackend_kwargsVedi la descrizione che segue. Il valore
backend_kwargsè la rappresentazione JSON dell'oggettobackend_kwargscon i seguenti campi:connections_prefix: il prefisso del nome del secret da leggere per ottenere le connessioni. Il valore predefinito èairflow-connections.variables_prefix: il 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 Google Cloud (se non fornito, viene utilizzato l'account di servizio predefinito).gcp_keyfile_dict: Google Cloud dizionario JSON delle credenziali. Esclusivo congcp_key_path.sep: separatore utilizzato per concatenareconnections_prefixeconn_id. Il valore predefinito è-.project_id: Google Cloud ID progetto in cui sono archiviati i secret.
Ad esempio, il valore di
backend_kwargspuò 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 utilizzare il formato
[variables_prefix][sep][variable_name]. - Il valore predefinito di
[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 di
[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 nell'URL nel seguente modo:
postgresql://login:secret%20password@examplehost:9000.
Airflow dispone di un metodo pratico per generare URI di connessione. Un esempio di come codificare un URL complesso con extra JSON è disponibile nella documentazione di Airflow.
Utilizzare Secret Manager con Managed Airflow
Quando recupera variabili e connessioni, Managed Airflow controlla prima Secret Manager. Se la variabile o la connessione richiesta non viene trovata, Managed Airflow 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 modelli Jinja per i campi dell'operatore 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 negli operatori personalizzati o nei 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 utilizzare le variabili nei DAG.
Ad esempio, per il segreto 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 creazione di istanze 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 nel seguente modo:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()