Configura Secret Manager para tu entorno

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

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 usar secretos con tu entorno de Cloud Composer.

Habilita la API de Secret Manager

Console

Enable the Secret Manager API.

Enable the 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 ello, la cuenta de servicio que accede a los Secrets debe tener un rol con el permiso secretmanager.versions.access Por ejemplo, el rol de Administrador y descriptor de acceso a secretos incluye este permiso.

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

Usa una de las siguientes opciones:

Habilita la serialización del DAG

En general, solo deberías usar el backend de Secret Manager dentro de los métodos execute() de tus operadores, o con el 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 acceso permisos, por lo que no puede acceder a los Secrets en Secret Manager. Si el El código de DAG accede a los secretos durante el procesamiento del DAG (no solo desde las tareas) y no es posible ajustarlo para acceder a los Secrets desde los métodos execute() y, luego, habilitar la serialización de DAG. Después de hacerlo, el servidor web de Airflow toma los DAG procesados y no necesita acceso a los secretos.

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. Anula el siguiente Airflow de Airflow para agregar una configuración opcional de configuración de Terraform:

    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: 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 debe leer para obtener los datos. 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 usará la cuenta de servicio predeterminada).
    • gcp_keyfile_dict: Diccionario JSON de credenciales de Google Cloud. Mutuamente exclusivos con gcp_key_path.
    • sep: Separador que se usa para concatenar connections_prefix y conn_id. El valor predeterminado es -.
    • 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 que se describen en Crea 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 las conexiones

  • 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 Representación del URI. Por ejemplo, postgresql://login:secret@examplehost:9000

  • El URI debe estar codificado en formato URL (codificado con 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 dispone de un método conveniente para generar conexiones URIs. 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 recuperas variables y conexiones, Cloud Composer verifica Secret Manager primero. Si no se encuentra la variable o la conexión solicitada, Cloud Composer verifica 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 plantilla (se resuelve en el momento de la ejecución).

Para el secreto airflow-variables-secret_filename:

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

Cómo leer 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 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:

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:

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?