Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
En esta página se muestra cómo usar Secret Manager para almacenar de forma segura conexiones y secretos de Airflow.
Antes de empezar
- 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 una versión posterior.
- Python 2 no es compatible.
Configurar 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 Cloud Composer.
Habilitar la API Secret Manager
Consola
Enable the Secret Manager API.
gcloud
Enable the Secret Manager API:
gcloud services enable secretmanager.googleapis.com
Configurar el control de acceso
Debe configurar el control de acceso para que Airflow pueda acceder a los secretos almacenados en Secret Manager.
Para ello, la cuenta de servicio que acceda a los secretos debe tener un rol con el permiso secretmanager.versions.access
. Por ejemplo, el rol Permiso para acceder a los recursos de Secret Manager incluye este permiso.
Puedes asignar este rol a nivel de secreto, proyecto, carpeta u organización.
Usa una de las siguientes opciones:
(Recomendado) Asigna este rol a la cuenta de servicio de tu entorno.
Anula la cuenta de servicio con la que Airflow accede a Secret Manager.
- Asigna este rol a una cuenta de servicio.
- Define el parámetro
gcp_key_path
de labackend_kwargs
opción de configuración de Airflow para que apunte a un archivo JSON con las credenciales de la cuenta de servicio.
Habilitar la serialización de DAG
Por lo general, solo debes usar el backend de Secret Manager desde los métodos execute()
de tus operadores o con las plantillas Jinja.
Por ejemplo, puedes recuperar variables con var.value.example_var
.
El servidor web de Airflow se ejecuta con una cuenta de servicio diferente con permisos limitados, por lo que no puede acceder a los secretos de Secret Manager. Si tu código DAG accede a secretos durante el procesamiento del DAG (no solo desde las tareas) y no es posible ajustarlo para que acceda a los secretos desde los métodos execute()
, habilita la serialización de DAG. Después de hacerlo, el servidor web de Airflow toma los DAGs procesados y no necesita acceder a los secretos.
Habilitar y configurar el backend de Secret Manager
Anula la siguiente opción de configuración de Airflow:
Sección Clave Valor secrets
backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
Añade ajustes 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 objetobackend_kwargs
con los siguientes campos:connections_prefix
: prefijo del nombre del secreto que se debe leer para obtener las conexiones. El valor predeterminado esairflow-connections
.variables_prefix
: prefijo del nombre del secreto que se debe leer para obtener las variables. El valor predeterminado esairflow-variables
.gcp_key_path
: ruta al archivo JSON de las Google Cloud credenciales (si no se proporciona, se usa la cuenta de servicio predeterminada).gcp_keyfile_dict
: Google Cloud diccionario JSON de credenciales. Es mutuamente exclusivo congcp_key_path
.sep
: separador que se usa para concatenarconnections_prefix
yconn_id
. El valor predeterminado es-
.project_id
: Google Cloud 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":"-"}
.
Añadir conexiones y variables en Secret Manager
Crea secretos siguiendo los pasos que se indican en Crear secretos y versiones.
Variables
- Debe usar el formato
[variables_prefix][sep][variable_name]
. - El valor predeterminado de
[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 las conexiones
- Debe usar el formato
[connection_prefix][sep][connection_name]
. - El valor predeterminado de
[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
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 contenga un espacio debe codificarse 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. Puedes consultar un ejemplo de cómo codificar una URL compleja con extras JSON en la documentación de Airflow.
Usar Secret Manager con Cloud Composer
Al obtener variables y conexiones, Cloud Composer comprueba primero Secret Manager. Si no se encuentra la variable o la conexión solicitada, Cloud Composer comprueba las variables de entorno y la base de datos de Airflow.
Leer variables con plantillas Jinja
Puedes usar Secret Manager para leer variables con plantillas Jinja en campos de operadores con plantillas (se resuelven en el tiempo de ejecución).
Para el secreto de airflow-variables-secret_filename
:
file_name = '{{var.value.secret_filename}}'
Leer variables usando operadores y retrollamadas personalizados
También puedes usar Secret Manager para leer variables en operadores personalizados o métodos de retrollamada de operadores. Leer variables desde dentro de los DAGs puede afectar negativamente al rendimiento, por lo que te recomendamos que uses plantillas Jinja si quieres usar variables en tus DAGs.
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 estés escribiendo un operador personalizado, rara vez tendrás que acceder a las conexiones directamente. La mayoría de los hooks obtienen el nombre de la conexión como parámetro de instanciación y deben recuperar las conexiones del backend secreto automáticamente cuando se ejecutan las tareas.
Leer las conexiones directamente puede ser útil al escribir tu propio hook.
Por ejemplo, en el caso de la conexión airflow-connections-exampleConnection
:
from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')
BaseHook.get_connection
devuelve un objeto Connection
. Puedes obtener la representación de cadena URI de una conexión de la siguiente manera:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()