Configurer Secret Manager pour votre environnement

Cloud Composer 1 | Cloud Composer 2

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 doit utiliser Airflow 1.10.10 ou version ultérieure et Python 3.6 ou version ultérieure.
  • Python 2 n'est pas compatible.

Configurer Secret Manager pour votre environnement

Cette section explique comment configurer Secret Manager pour pouvoir utiliser des secrets avec votre environnement Cloud Composer.

activé l'API Secret Manager ;

Console

Activez l'API Secret Manager

Activer l'API

gcloud

Activez l'API Secret Manager

gcloud services enable secretmanager.googleapis.com

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 [variable_prefix][sep][variable_name].
  • La valeur par défaut de [variable_prefix] est airflow-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] est airflow-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

  • Vous devez utiliser la représentation URI. Par exemple, mysql://login:password@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 : mysql://login:secret%20password@examplehost:9000.

Airflow propose 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.

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 :

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. Le serveur Web Airflow prend ensuite des DAG traités et n'a pas besoin d'accéder aux secrets.

Activer et configurer le backend de Secret Manager

  1. Ignorez l'option de configuration Airflow suivante:

    Section Clé Valeur
    secrets backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
  2. Ajoutez des paramètres facultatifs en ignorant l'option de configuration Airflow suivante:

    Section Clé Valeur
    secrets backend_kwargs (voir la description ci-dessous).

    La valeur backend_kwargs correspond à la représentation JSON de l'objet backend_kwargs avec les champs suivants:

    • connections_prefix : spécifie le préfixe du nom du secret à lire pour obtenir les connexions. La valeur par défaut est airflow-connections.
    • variables_prefix : spécifie le préfixe du nom du secret à lire pour obtenir des variables. La valeur par défaut est airflow-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 d'identification Google Cloud. Mutuellement exclusif avec gcp_key_path.
    • sep : séparateur utilisé pour concaténer les éléments connections_prefix et conn_id. Valeur par défaut : -.
    • project_id : ID de 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":"-"}

Utiliser Secret Manager avec Cloud Composer

Lors de la récupération des variables et des connexions, Cloud Composer commence par vérifier Secret Manager. Si la variable ou la connexion demandée est introuvable, Cloud Composer vérifie les variables d'environnement et la base de données Airflow.

Lire les variables avec les modèles Jinja

Vous pouvez utiliser Secret Manager pour lire des variables avec le modèle Jinja pour les champs d'opérateur modélisés (résolu au moment de l'exécution).

Pour la variable 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 des variables dans des opérateurs personnalisés ou des méthodes de rappel à partir d'opérateurs. La lecture de variables à partir de DAG peut avoir un impact négatif sur les performances. Par conséquent, utilisez des modèles Jinja si vous souhaitez utiliser des variables dans vos DAG.

Par exemple, pour la variable 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()

Étapes suivantes