Cloud Composer 1 | Cloud Composer 2
En esta página, se muestra cómo usar Secret Manager para almacenar las conexiones y secretos de Airflow de forma segura.
Antes de comenzar
- Para usar Secret Manager, tu entorno de Cloud Composer debe usar Airflow 1.10.10 o posterior y Python 3.6 o posterior.
- Python 2 no es compatible.
Configura Secret Manager para tu entorno
En esta sección, se explica cómo configurar Secret Manager para que puedas usarlos con tu entorno de Cloud Composer.
Habilita la API de Secret Manager
Console
Enable the Secret Manager API.
gcloud
Enable the Secret Manager API:
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 hacerlo, la cuenta de servicio que accede a los secretos debe tener una función con el permiso secretmanager.versions.access
. Por ejemplo, la función Descriptor de acceso a secretos de Secret Manager incluye este permiso.
Puedes otorgar este rol en el nivel de Secret, Proyecto, Organización o Carpeta.
Usa una de las siguientes opciones:
(Recomendado) Otorga esta función a la cuenta de servicio de tu entorno.
Anula la cuenta de servicio con la que Airflow accede a Secret Manager.
- Otorga este rol a una cuenta de servicio.
- Establece el parámetro
gcp_key_path
de la opción de configuraciónbackend_kwargs
de Airflow para que apunte a un archivo JSON con las credenciales de la cuenta de servicio.
Habilita la serialización del DAG
En general, solo debes usar el backend de Secret Manager desde los métodos execute()
de tus operadores o con las plantillas de 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 en Secret Manager. Si tu código DAG accede a los secretos durante su procesamiento (no solo desde las tareas) y no es posible ajustarlo para acceder 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 DAG procesados y no necesita acceder a los secretos.
Habilita y configura 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
Para agregar una configuración opcional, anula la siguiente 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 objetobackend_kwargs
con los siguientes campos:connections_prefix
: especifica el prefijo del nombre del secreto que se leerá para obtener conexiones. La cantidad predeterminada esairflow-connections
.variables_prefix
: especifica el prefijo del nombre del secreto que se leerá para obtener variables. La cantidad predeterminada esairflow-variables
.gcp_key_path
: Ruta al archivo JSON de la 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. Este campo ygcp_key_path
son mutuamente excluyentes.sep
: Separador que se usa para concatenarconnections_prefix
yconn_id
. Configuración predeterminada:-
.project_id
: Es el ID del proyecto de Google Cloud 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 descritos en Crea secretos y versiones.
Variables
- Se debe usar el formato
[variable_prefix][sep][variable_name]
. - El valor predeterminado para
[variable_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
- Se debe 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
Se debe usar la representación del URI. Por ejemplo,
mysql://login:password@examplehost:9000
El URI debe estar codificado como URL (codificado como porcentaje). Por ejemplo, una contraseña que tiene un símbolo de espacio debe estar codificada como URL de la siguiente manera:
mysql://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 en la documentación de Airflow.
Usa Secret Manager con Cloud Composer
Cuando se recuperan variables y conexiones, Cloud Composer primero verifica Secret Manager. Si no se encuentra la variable o conexión solicitada, Cloud Composer verificará las variables de entorno y la base de datos de Airflow.
Leer variables con plantillas de Jinja
Puedes usar Secret Manager para leer variables con plantillas de Jinja para campos de operador con plantillas (resueltos 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 llamada
También puedes usar Secret Manager para leer variables en operadores personalizados o métodos de devolución de llamada de operadores. La lectura de variables de los DAG puede tener un impacto negativo en el rendimiento, por lo que debes usar las plantillas de Jinja si deseas utilizar variables en tus DAG.
Por ejemplo, para el secreto airflow-variables-secret_filename
, ejecuta el siguiente comando:
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
, 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()