Cette page a été traduite par l'API Cloud Translation.
Switch to English

Configurer des environnements avec Secret Manager

Cette page explique comment utiliser Secret Manager pour stocker en toute sécurité les connexions et les secrets Airflow.

Avant de commencer

Pour utiliser Secret Manager, votre environnement Cloud Composer doit utiliser Airflow 1.10.1 ou version ultérieure et Python 3.6 ou version ultérieure. Python 2 n'est pas compatible.

Configurer votre environnement avec Secret Manager

  1. Activez l'API Secret Manager.

    API Secret Manager

  2. Ajoutez des connexions et des variables dans Secret Manager (pour en savoir plus, consultez la section Créer des secrets et des versions).

    Les secrets doivent respecter le format suivant:

    • Variables: [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.
    • Connexions: [connection_prefix][sep][connection_name]

      • La valeur par défaut pour [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.
      • Les valeurs de connexion doivent utiliser une représentation URI. Exemple :mysql://login:password@examplehost:9000

        L'URI doit être encodée en URL (en pourcentage). Par exemple, un mot de passe contenant un symbole d'espace doit être codé en URL comme suit : mysql://login:secret%20password@examplehost:9000.

        Airflow propose une méthode de commodité pour générer des URI de connexion. Un exemple d'encodage d'une URL complexe avec des bonus JSON est disponible dans la documentation Airflow.

    Si vous souhaitez utiliser des valeurs différentes pour [variable_prefix], [connection_prefix] ou [sep], utilisez les paramètres facultatifs de la section Activer et configurer le backend Secret Manager.

  3. Configurez le contrôle des accès.

    Vous devez accorder à Airflow l'accès aux codes secrets stockés dans Secret Manager. Pour ce faire, attribuez un rôle qui inclut l'autorisation secretmanager.versions.access (par exemple, Accesseur de secrets à Secret Manager), au compte de service auquel votre environnement Cloud Composer accède{101. }Gestionnaire de secrets.

    Par défaut, ce compte est le compte de service par défaut Compute Engine, mais vous pouvez spécifier un compte de service personnalisé lors de la création de l'environnement.

    Vous pouvez attribuer ce rôle au niveau du secret, du projet, du dossier ou de l'organisation.

    Contrôle des accès

  4. Activer la sérialisation des DAG

    En règle générale, vous ne devez utiliser le backend secret que dans les méthodes execute() de vos opérateurs, ou avec les modèles Jinja d'Airflow . Par exemple, vous pouvez récupérer les variables en utilisant var.value.example_var.

    Le serveur Web Airflow s'exécute sous un autre compte de service disposant d'autorisations limitées. Il ne peut donc pas accéder aux codes secrets dans Secret Manager. Si votre code DAG accède aux codes secrets lors du traitement des DAG (pas seulement à partir des tâches) et qu'il est impossible d'ajuster ce code pour accéder aux codes secrets à partir duexecute() .activer la sérialisation des DAG s'affiche en haut de l'écran. Ensuite, le serveur Web Airflow prend en charge les DAG traités et n'a plus besoin d'accéder aux codes secrets.

  5. 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 remplacez cette option de configuration Airflow:

      Section Clé Valeur
      secrets backend_kwargs Reportez-vous à la description ci-dessous.

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

      • connections_prefix: spécifie le préfixe du nom de secret à lire pour obtenir des connexions. La valeur par défaut est airflow-connections.
      • variables_prefix: spécifie le préfixe du nom du secret à lire pour obtenir les variables. La valeur par défaut est airflow-variables.
      • gcp_key_path: chemin d'accès au fichier JSON de Google Cloud (si vous ne l'indiquez pas, le compte de service par défaut est utilisé).
      • gcp_keyfile_dict: dictionnaire du certificat JSON de Google Cloud. Exclusion mutuelle avec gcp_key_path.
      • sep: séparateur utilisé pour concaténer connections_prefix et conn_id. Valeur par défaut: -
      • project_id: ID du projet Google Cloud dans lequel les codes secrets sont stockés.

      Par exemple, la valeur de backend_kwargs peut être : {"connections_prefix":"example-connections","variables_prefix":"example-variables", "sep":"-"}

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 sont introuvables, Cloud Composer vérifie ensuite les variables d'environnement et la base de données Airflow.

Lire les variables

Modèles Jinja

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

Pour la variable airflow-variables-secret_filename, utilisez:

file_name = 'var.value.secret_filename'

Opérateurs personnalisés et rappels

Vous pouvez également utiliser Secret Manager pour lire les variables des opérateurs personnalisés ou des méthodes de rappel des opérateurs. La lecture de variables à partir de DAG peut avoir un impact négatif sur les performances. Par conséquent, utilisez les modèles Jinja si vous souhaitez utiliser des variables dans vos DAG.

Pour la variable airflow-variables-secret_filename, utilisez:

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.

Pour la connexion airflow-connections-exampleConnection, utilisez :

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()