Managed Airflow (3e génération) | Managed Airflow (2e génération) | Managed Airflow (ancienne 1re génération)
Cette page explique comment utiliser Secret Manager pour stocker en toute sécurité des connexions et des secrets Airflow.
Configurer Secret Manager pour votre environnement
Cette section explique comment configurer Secret Manager pour pouvoir utiliser des secrets avec votre environnement Managed Airflow.
Activer l'API Secret Manager
Console
Activez l'API Secret Manager si ce n'est pas déjà fait.
Rôles requis pour activer les API
Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.
gcloud
Activez l'API Secret Manager si ce n'est pas déjà fait :
Rôles requis pour activer les API
Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.
gcloud services enable secretmanager.googleapis.com
Configurer le contrôle des accès
Vous devez configurer le contrôle des accès afin qu'Airflow puisse accéder aux secrets stockés dans Secret Manager.
Pour ce faire, le compte de service qui accède aux secrets doit disposer d'un rôle doté de l'autorisation secretmanager.versions.access. Par exemple, le rôle Accesseur de secrets de Secret Manager inclut cette autorisation.
Vous pouvez attribuer ce rôle au niveau Secret, Projet, Dossier ou Organisation.
Utilisez l'une des options suivantes :
(Recommandé) Attribuez ce rôle au compte de service de votre environnement.
Ignorez le compte de service sous lequel Airflow accède à Secret Manager.
- Attribuez ce rôle à un compte de service.
- Définissez le paramètre
gcp_key_pathde l'option de configurationbackend_kwargsd'Airflow pour qu'il pointe vers un fichier JSON contenant les identifiants du compte de service.
Activer et configurer le backend de Secret Manager
Remplacez l'option de configuration Airflow suivante :
Section Clé Valeur secretsbackendairflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend(Airflow 2.10.2 et versions ultérieures) Assurez-vous que l'option de configuration Airflow
[secrets]backends_orderspécifie un ordre de recherche des secrets qui contient un backend des secretscustom. La valeur par défaut de cette option contient déjà cette valeur.Section Clé Valeur secretsbackends_order(par défaut) custom,environment_variable,metastoreAjoutez des paramètres facultatifs en remplaçant l'option de configuration Airflow suivante :
Section Clé Valeur secretsbackend_kwargsConsultez la description suivante. La valeur
backend_kwargsest la représentation JSON de l'objetbackend_kwargsavec les champs suivants :connections_prefix: préfixe du nom secret à lire pour obtenir les connexions. La valeur par défaut estairflow-connections.variables_prefix: préfixe du nom secret à lire pour obtenir les variables. La valeur par défaut estairflow-variables.gcp_key_path: chemin d'accès au fichier JSON des identifiants Google Cloud (si aucun chemin n'est fourni, le compte de service par défaut est utilisé).gcp_keyfile_dict: Google Cloud dictionnaire JSON des identifiants. Mutuellement exclusif avecgcp_key_path.sep: séparateur utilisé pour concaténer les élémentsconnections_prefixetconn_id. La valeur par défaut est-.project_id: Google Cloud ID du projet dans lequel les secrets sont stockés.
Par exemple, la valeur de
backend_kwargspeut être{"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}
Ajouter des connexions et des variables dans Secret Manager
Créez des secrets en suivant la procédure décrite dans Créer des secrets et des versions.
Variables
- Elles doivent utiliser le format
[variables_prefix][sep][variable_name]. - La valeur par défaut de
[variables_prefix]estairflow-variables. - Le séparateur par défaut
[sep]est-.
Par exemple, si le nom de la variable est example-var, le nom du secret est airflow-variables-example-var.
Noms de connexion
- Ils doivent utiliser le format
[connection_prefix][sep][connection_name]. - La valeur par défaut de
[connection_prefix]estairflow-connections. - Le séparateur par défaut
[sep]est-.
Par exemple, si le nom de la connexion est exampleConnection, le nom du secret est airflow-connections-exampleConnection.
Valeurs de connexion
Doit utiliser la représentation URI. Exemple :
postgresql://login:secret@examplehost:9000.L'URI doit être encodé au format URL (encodé en pourcentage). Par exemple, un mot de passe contenant un symbole d'espace doit être encodé au format URL comme suit :
postgresql://login:secret%20password@examplehost:9000.
Airflow dispose d'une méthode pratique pour générer des URI de connexion. Un exemple d'encodage d'une URL complexe avec des extras JSON est disponible dans la documentation Airflow.
Utiliser Secret Manager avec Managed Airflow
Lors de la récupération des variables et des connexions, Managed Airflow vérifie d'abord Secret Manager. Si la variable ou la connexion demandée est introuvable, Managed Airflow vérifie ensuite les variables d'environnement et la base de données Airflow.
Lire des variables à l'aide de modèles Jinja
Vous pouvez utiliser Secret Manager pour lire des variables avec la conception de modèles Jinja pour les champs d'opérateur basés sur des modèles (résolus au moment de l'exécution).
Pour le secret airflow-variables-secret_filename :
file_name = '{{var.value.secret_filename}}'
Lire des variables à l'aide d'opérateurs et de rappels personnalisés
Vous pouvez également utiliser Secret Manager pour lire des variables dans des opérateurs personnalisés ou des méthodes de rappel à partir d'opérateurs. La lecture de variables à l'intérieur des DAG peut avoir un impact négatif sur les performances. Utilisez donc des modèles Jinja si vous souhaitez utiliser des variables dans vos DAG.
Par exemple, pour le secret airflow-variables-secret_filename :
from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')
Lire les connexions
À moins que vous n'écriviez un opérateur personnalisé, vous avez rarement besoin d'accéder directement aux connexions. La plupart des hooks obtiennent le nom de connexion en tant que paramètre d'instanciation et doivent récupérer automatiquement les connexions à partir du backend de Secret Manager lorsque les tâches sont exécutées.
Il peut être utile de lire directement les connexions lorsque vous écrivez votre propre hook.
Par exemple, pour la connexion airflow-connections-exampleConnection :
from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')
BaseHook.get_connection renvoie un objet Connection. Il est possible d'obtenir la représentation de la chaîne URI d'une connexion comme suit :
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()