Managed Airflow (3ª gen.) | Managed Airflow (2ª gen.) | Managed Airflow (1ª gen. heredada)
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
Habilitar la API de Secret Manager.
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin), que contiene el permiso serviceusage.services.enable. Obtén más información para otorgar roles.
gcloud
Habilita la API de Secret Manager:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin), que contiene el
serviceusage.services.enable permiso. 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 Secret Manager Secret Accessor incluye este permiso.
Puedes otorgar este rol a nivel de Secret, proyecto, carpeta u organización.
Usa una de las siguientes opciones:
(Recomendado) Otorga este rol a la cuenta de servicio de tu entorno.
Anula la cuenta de servicio en la que Airflow accede a Secret Manager.
- Otorga este rol a una cuenta de servicio.
- Configura el parámetro
gcp_key_pathde labackend_kwargsopción de configuración de Airflow para que apunte a un archivo JSON con las credenciales de la cuenta de servicio.
Habilita y configura el backend de Secret Manager
Anula la siguiente opción de configuración de Airflow:
Sección Clave Valor secretsbackendairflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend(Airflow 2.10.2 y versiones posteriores) Asegúrate de que la opción de configuración de Airflow
[secrets]backends_orderespecifique un orden de búsqueda de secretos que tenga un backend de secretoscustomen él. El valor predeterminado de esta opción ya contiene este valor.Sección Clave Valor secretsbackends_order(predeterminado) custom,environment_variable,metastorePara agregar parámetros de configuración opcionales, anula la siguiente opción de configuración de Airflow:
Sección Clave Valor secretsbackend_kwargsConsulta la siguiente descripción. El valor
backend_kwargses la representación JSON delbackend_kwargsobjeto con los siguientes campos:connections_prefix: prefijo del nombre del secreto que se leerá para obtener conexiones. El valor predeterminado esairflow-connections.variables_prefix: prefijo del nombre del secreto que se leerá para obtener variables. El valor predeterminado esairflow-variables.gcp_key_path: ruta de acceso al archivo JSON de credenciales (si no se proporciona, se usa la cuenta de servicio predeterminada). Google Cloudgcp_keyfile_dict: Google Cloud diccionario JSON de credenciales. Este campo ygcp_key_pathson mutuamente excluyentes.sep: separador que se usa para concatenarconnections_prefixyconn_id. El valor predeterminado es-.project_id: Google Cloud `project_id`: ID del proyecto en el que se almacenan los secretos.
Por ejemplo, el valor de
backend_kwargspuede ser:{"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}.
Agrega conexiones y variables en Secret Manager
Para crear secretos, sigue los pasos que se describen en Crea secretos y versiones.
Variables
- Debes usar el formato
[variables_prefix][sep][variable_name]. - El valor predeterminado para
[variables_prefix]esairflow-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
- Debes usar el formato
[connection_prefix][sep][connection_name]. - El valor predeterminado para
[connection_prefix]esairflow-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
Debes usar la representación de URI. por ejemplo:
postgresql://login:secret@examplehost:9000.El URI debe estar codificado como URL (codificado en porcentaje). 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 útil para generar el URI de conexión. Puedes encontrar un ejemplo de cómo codificar un URL complejo con elementos JSON adicionales disponible en la documentación de Airflow.
Usa Secret Manager con Managed Airflow
Cuando se recuperan variables y conexiones, Managed Airflow verifica primero 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.
Lee variables con plantillas Jinja
Puedes usar Secret Manager a fin de leer variables con las plantillas Jinja para los campos del operador con plantillas (que se resuelven en el momento de la ejecución).
Para el secreto airflow-variables-secret_filename, haz lo siguiente:
file_name = '{{var.value.secret_filename}}'
Lee variables con operadores personalizados y devoluciones de llamadas
También puedes usar Secret Manager para leer variables en operadores personalizados o métodos de devolución de llamada de los operadores. La lectura de variables desde DAG puede afectar de forma negativa el rendimiento, por lo que se recomienda el uso de plantillas de Jinja si deseas usar variables en tus DAG.
Por ejemplo, para el secreto airflow-variables-secret_filename, haz 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.
Por ejemplo, para la conexión airflow-connections-exampleConnection, haz 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()