Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3
Cette page explique comment utiliser Secret Manager pour stocker en toute sécurité des connexions et des secrets Airflow.
Avant de commencer
- Pour utiliser Secret Manager, votre environnement Cloud Composer vous devez utiliser Airflow 1.10.10 ou une version ultérieure et Python 3.6 ou une version ultérieure ;
- Python 2 n'est pas compatible.
Configurer Secret Manager pour votre environnement
Cette section explique comment configurer Secret Manager afin de pouvoir l'utiliser avec votre environnement Cloud Composer.
Activer l'API Secret Manager
Console
Enable the Secret Manager API.
gcloud
Enable the Secret Manager API:
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é) Attribuer 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_path
de l'option de configuration Airflowbackend_kwargs
de sorte qu'il pointe vers un fichier JSON contenant les identifiants du compte de service.
Activer la sérialisation des DAG
En général, vous ne devez utiliser le backend de Secret Manager qu'à l'aide des méthodes execute()
de vos opérateurs ou avec les modèles Jinja.
Par exemple, vous pouvez récupérer des variables à l'aide de var.value.example_var
.
Le serveur Web Airflow s'exécute sous un autre compte de service doté d'autorisations limitées. Il ne peut donc pas accéder aux secrets dans Secret Manager. Si votre code DAG accède aux secrets lors du traitement des DAG (et pas seulement à partir des tâches) et qu'il n'est pas possible de l'ajuster pour accéder aux secrets à partir des méthodes execute()
, activez la sérialisation des DAG. Ensuite, la fonction Airflow
utilise les DAG traités et n'a pas besoin d'accéder aux secrets.
Activer et configurer le backend de Secret Manager
Remplacez l'option de configuration Airflow suivante:
Section Clé Valeur secrets
backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
Ajoutez des paramètres facultatifs en remplaçant les paramètres Airflow suivants : l'une des options suivantes:
Section Clé Valeur secrets
backend_kwargs
Consultez la description suivante. La valeur
backend_kwargs
est la représentation JSON du Objetbackend_kwargs
avec les champs suivants:connections_prefix
: préfixe du nom du secret à lire pour obtenir les connexions. La valeur par défaut estairflow-connections
.variables_prefix
: préfixe du nom du secret à lire pour obtenir Variables. La valeur par défaut estairflow-variables
.gcp_key_path
: chemin d'accès au fichier JSON des identifiants Google Cloud (s'il n'est pas fourni, le compte de service par défaut est utilisé).gcp_keyfile_dict
: dictionnaire JSON pour les identifiants Google Cloud Mutualement exclusif avecgcp_key_path
.sep
: séparateur utilisé pour concaténer les élémentsconnections_prefix
etconn_id
. La valeur par défaut est-
.project_id
: ID du projet Google Cloud dans lequel les secrets sont stockés.
Par exemple, la valeur de
backend_kwargs
peut ê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 les étapes décrites 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 des connexions
- 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 secret
son nom est airflow-connections-exampleConnection
.
Valeurs de connexion
Doit utiliser Représentation de l'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'un méthode pratique permettant de générer des connexions URI. Vous trouverez un exemple d'encodage d'une URL complexe avec des extras JSON. dans la documentation Airflow.
Utiliser Secret Manager avec Cloud Composer
Lors de la récupération de variables et de connexions, Cloud Composer vérifie d'abord Secret Manager. Si la variable ou la connexion demandée n'est pas Cloud Composer vérifie les variables d'environnement dans la base de données Airflow.
Lire des variables à l'aide de la modélisation Jinja
Vous pouvez utiliser Secret Manager pour lire les variables avec Modèles Jinja pour les champs d'opérateur modélisés (résolu 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 personnalisés et de rappels
Vous pouvez également utiliser Secret Manager pour lire les variables dans les opérateurs personnalisés ou les méthodes de rappel des opérateurs. La lecture de variables depuis des DAG peut nuire aux performances. Par conséquent, utilisez 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()