Configura entornos con Secret Manager

En esta página, se muestra cómo usar el Administrador de secretos para almacenar de forma segura las conexiones y los secretos de Airflow.

Antes de comenzar

Para usar Secret Manager, tu entorno de Cloud Composer debe usar Airflow 1.10.10 o una versión posterior, y Python 3.6 o posterior. Python 2 no es compatible.

Configura tu entorno con Secret Manager

  1. Habilita la API de Secret Manager

    API del Administrador de secretos

  2. Agrega conexiones y variables en el Administrador de secretos (consulta Crea secretos y versiones para obtener más detalles).

    Los secretos deben seguir este formato:

    • Variables: [variable_prefix][sep][variable_name]

      • El valor predeterminado para [variable_prefix] es airflow-variables.
      • El separador predeterminado [sep] es -.
      • Por ejemplo, si el nombre de la variable es example-var, entonces el nombre del secreto es airflow-variables-example-var.
    • Conexiones: [connection_prefix][sep][connection_name]

      • El valor predeterminado para [connection_prefix] es airflow-connections.
      • El separador predeterminado [sep] es -.
      • Por ejemplo, si el nombre de la conexión es exampleConnection, entonces el nombre del secreto es airflow-connections-exampleConnection.
      • Los valores de conexión deben usar la representación de URI. Por ejemplo, mysql://login:password@examplehost:9000.

        El URI debe estar codificado para URL (codificado como porcentaje). Por ejemplo, una contraseña que tiene un símbolo de espacio en ella debe estar codificada como URL de la siguiente manera: mysql://login:secret%20password@examplehost:9000.

        Airflow tiene un método de conveniencia para generar URI de conexión. Puedes encontrar un ejemplo de cómo codificar una URL compleja con extras JSON en la documentación de Airflow.

    Si quieres usar valores diferentes para [variable_prefix], [connection_prefix] o [sep], usa la configuración opcional en la sección: Habilita y configura el backend del administrador de secretos.

  3. Configurar el control de acceso

    Debes otorgar a Airflow acceso a los secretos almacenados en el administrador de secretos. Para hacerlo, otorga una función que incluya el permiso secretmanager.versions.access (como Administrador de accesos secretos del administrador de secretos) a la cuenta de servicio a la que accede tu entorno de Cloud Composer{101. }Administrador de secretos.

    De forma predeterminada, esta cuenta es la cuenta de servicio predeterminada de Compute Engine, pero puedes especificar una cuenta de servicio personalizada durante la creación del entorno.

    Puedes otorgar esta función en el nivel secreto, proyecto, carpeta o de la organización.

    Control de acceso

  4. Habilita la serialización del DAG

    En general, solo debes usar el backend secreto desde los métodos execute() de tus operadores o con las plantillas de Jinja de Airflow. macros. Por ejemplo, puedes recuperar variables con var.value.example_var.

    El servidor web de Airflow se ejecuta en una cuenta de servicio diferente con permisos limitados, por lo que no puede acceder a los secretos en Secret Manager. Si tu código DAG accede a los secretos durante el procesamiento del DAG (no solo desde las tareas) y no es posible ajustarlo a los secretos desde los métodos execute(), entonces habilita el DAG. serialización. Después de hacerlo, el servidor web de Airflow toma los DAG procesados y no necesita acceso a los secretos.

  5. Habilita y configura el backend de Secret Manager

    1. Anula la siguiente opción de configuración de Airflow:

      Sección Clave Valor
      secrets backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
    2. Para agregar configuraciones opcionales, anula esta opción de configuración de Airflow:

      Sección Clave Valor
      secrets backend_kwargs Consulta la siguiente descripción.

      El valor backend_kwargs es la representación JSON del objeto backend_kwargs con los siguientes campos:

      • connections_prefix: especifica el prefijo del nombre del secreto que se leerá para obtener conexiones. El valor predeterminado es airflow-connections.
      • variables_prefix: especifica el prefijo del nombre del secreto que se leerá para obtener las variables. El valor predeterminado es airflow-variables.
      • gcp_key_path: Ruta de acceso al archivo JSON de credencial de Google Cloud (si no se proporciona, se usa la cuenta de servicio predeterminada).
      • gcp_keyfile_dict: El diccionario JSON de credenciales de Google Cloud. Exclusivo de manera mutua con gcp_key_path
      • sep: separador usado para concatenar connections_prefix y conn_id. Valor predeterminado: -
      • project_id: El ID del proyecto de Google Cloud en el que se almacenan los secretos.

      Por ejemplo, el valor de backend_kwargs puede ser {"connections_prefix":"example-connections","variables_prefix":"example-variables", "sep":"-"}

Usa el administrador de secretos con Cloud Composer

Cuando se recuperan variables y conexiones, Cloud Composer verifica primero el administrador de secretos. Si no se encuentra la variable o conexión solicitada, Cloud Composer verifica las variables de entorno y la base de datos de Airflow.

Lee variables

Plantillas de Jinja

Puedes usar el Administrador de secretos para leer las variables con plantillas de Jinja para los campos de operadores con plantilla (se resuelven al momento de la ejecución).

Para la variable airflow-variables-secret_filename, usa lo siguiente:

file_name = 'var.value.secret_filename'

Operadores personalizados y devoluciones de llamadas

También puedes usar el administrador de secretos para leer las variables en operadores personalizados o métodos de devolución de llamada de los operadores. La lectura de variables desde el DAG puede tener un impacto negativo en el rendimiento, por lo que debes usar plantillas de Jinja si deseas usar variables en tus DAG.

Para la variable airflow-variables-secret_filename, usa lo siguiente:

from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')

Lee conexiones

A menos que escribas un operador personalizado, rara vez necesitas acceder directamente a las conexiones. La mayoría de los hooks reciben el nombre de conexión como su parámetro de creación de instancias, y deben recuperar las conexiones del backend del secreto automáticamente cuando se ejecutan las tareas.

Leer las conexiones directamente puede ser útil cuando escribes tu propio hook.

Para la conexión airflow-connections-exampleConnection, usa lo siguiente:

from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')

BaseHook.get_connection muestra un objeto Connection. Es posible obtener la representación de string de URI de una conexión como esta:

exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()