Configura Secret Manager para tu entorno

Managed Airflow (Gen 3) | Managed Airflow (Gen 2) | Managed Airflow (Legacy Gen 1)

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

Configura Secret Manager para tu entorno

En esta sección, se explica cómo configurar Secret Manager para que puedas usar secretos con tu entorno de Managed Airflow.

Habilita la API de Secret Manager

Console

Habilita la API de Secret Manager si aún no lo hiciste.

Roles necesarios para habilitar las APIs

Para habilitar APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.

Habilitar la API

gcloud

Habilita la API de Secret Manager si aún no lo está:

Roles necesarios para habilitar las APIs

Para habilitar APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.

gcloud services enable secretmanager.googleapis.com

Configura el control de acceso

Debes configurar el control de acceso para que Airflow pueda acceder a los secretos almacenados en Secret Manager.

Para ello, la cuenta de servicio que accede a los secretos debe tener un rol con el permiso secretmanager.versions.access. Por ejemplo, el rol Usuario con acceso a los secretos de Secret Manager incluye este permiso.

Puedes otorgar este rol a nivel de secreto, proyecto, carpeta o organización.

Usa una de las siguientes opciones:

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. (Airflow 2.10.2 y versiones posteriores) Asegúrate de que la opción de configuración de Airflow [secrets]backends_order especifique un orden de búsqueda de secretos que tenga un backend de secretos custom. El valor predeterminado de esta opción ya contiene este valor.

    Sección Clave Valor
    secrets backends_order (predeterminado) custom,environment_variable,metastore
  3. Agrega parámetros de configuración opcionales anulando la siguiente opción de configuración de Airflow:

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

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

    • connections_prefix: Es el prefijo del nombre del secreto que se leerá para obtener conexiones. El valor predeterminado es airflow-connections.
    • variables_prefix: Es el prefijo del nombre del secreto que se leerá para obtener variables. El valor predeterminado es airflow-variables.
    • gcp_key_path: Es la ruta de acceso al archivo JSON de credenciales de Google Cloud (si no se proporciona, se usa la cuenta de servicio predeterminada).
    • gcp_keyfile_dict: Google Cloud Diccionario JSON de credenciales. Este campo y gcp_key_path son mutuamente excluyentes.
    • sep: Es el separador que se usa para concatenar connections_prefix y conn_id. El valor predeterminado es -.
    • project_id: Google Cloud Es el ID del proyecto en el que se almacenan los secretos.

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

Agrega conexiones y variables en Secret Manager

Crea secretos siguiendo los pasos que se describen en Cómo crear secretos y versiones.

Variables

  • Debe usar el formato [variables_prefix][sep][variable_name].
  • El valor predeterminado para [variables_prefix] es airflow-variables.
  • El separador predeterminado [sep] es -

Por ejemplo, si el nombre de la variable es example-var, el nombre del secreto es airflow-variables-example-var.

Nombres de conexión

  • Debe usar el formato [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, el nombre del secreto es airflow-connections-exampleConnection.

Valores de conexión

  • Debe usar la representación de URI. Por ejemplo, postgresql://login:secret@examplehost:9000.

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

Airflow tiene un método de conveniencia para generar URIs de conexión. En la documentación de Airflow, se incluye un ejemplo de cómo codificar una URL compleja con elementos adicionales en formato JSON.

Usa Secret Manager con Managed Airflow

Cuando recupera variables y conexiones, Managed Airflow primero verifica Secret Manager. Si no se encuentra la variable o la conexión solicitada, Managed Airflow verifica las variables de entorno y la base de datos de Airflow.

Cómo leer variables con plantillas Jinja

Puedes usar Secret Manager para leer variables con plantillas de Jinja para los campos de operadores con plantillas (se resuelven en el tiempo de ejecución).

Para el secreto airflow-variables-secret_filename:

file_name = '{{var.value.secret_filename}}'

Cómo leer variables con operadores y devoluciones de llamada personalizados

También puedes usar Secret Manager para leer variables en operadores personalizados o métodos de devolución de llamada de operadores. Leer variables desde el interior de los DAG puede afectar negativamente el rendimiento, por lo que debes usar plantillas Jinja si quieres usar variables en tus DAG.

Por ejemplo, para el secreto airflow-variables-secret_filename:

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

Leer 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.

Por ejemplo, para la conexión airflow-connections-exampleConnection:

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

¿Qué sigue?