Los DAG no se pueden hacer clic en el servidor web de Google Cloud Composer, pero funcionan bien en un flujo de air local

Estoy usando Google Cloud Composer (flujo de air administrado en Google Cloud Platform) con la versión de imagen composer-0.5.3-airflow-1.9.0 y Python 2.7, y me enfrento a un problema extraño: después de importar mis DAG, no son se puede hacer clic desde la interfaz de usuario web (y no hay botones “Activar DAG”, “Vista de gráfico”, …), mientras que todo funciona perfectamente cuando se ejecuta un flujo de air local.

Incluso si no se puede utilizar desde el servidor web en Composer, mis DAG todavía existen. Puedo enumerarlos utilizando CLI ( list_dags ), describirlos ( list_tasks ) e incluso activarlos ( trigger_dag ).

Minimal ejemplo reproduciendo el tema.

Un ejemplo mínimo que utilicé para reproducir el problema se muestra a continuación. El uso de un gancho (aquí, GoogleCloudStorageHook ) es muy importante, ya que el error en Composer ocurre cuando se usa un gancho. Inicialmente, estaba usando un gancho personalizado (en un complemento personalizado), y estaba enfrentando el mismo problema.

Básicamente aquí, el ejemplo enumera todas las entradas en un grupo GCS ( my-bucket ) y genera un DAG para cada entrada que comienza con my_dag .

 import datetime from airflow import DAG from airflow.contrib.hooks.gcs_hook import GoogleCloudStorageHook from airflow.operators.bash_operator import BashOperator google_conn_id = 'google_cloud_default' gcs_conn = GoogleCloudStorageHook(google_conn_id) bucket = 'my-bucket' prefix = 'my_dag' entries = gcs_conn.list(bucket, prefix=prefix) for entry in entries: dag_id = str(entry) dag = DAG( dag_id=dag_id, start_date=datetime.datetime.today(), schedule_interval='0 0 1 * *' ) op = BashOperator( task_id='test', bash_command='exit 0', dag=dag ) globals()[dag_id] = dag 

Resultados en Cloud Composer

Después de importar este archivo a Composer, aquí está el resultado (tengo 4 archivos que comienzan con my_dag en my-bucket ):

DAGs en Google Cloud Composer

Como expliqué, los DAG no se pueden hacer clic y las columnas “Tareas recientes” y “Ejecuciones DAG” se están cargando para siempre. La marca de “información” al lado de cada nombre de DAG dice: This DAG isn't available in the webserver DagBag object. It shows up in this list because the scheduler marked it as active in the metadata database This DAG isn't available in the webserver DagBag object. It shows up in this list because the scheduler marked it as active in the metadata database .

Por supuesto, la actualización no es útil, y al acceder a la Vista de gráfico de DAG mediante la URL directa ( https://****.appspot.com/admin/airflow/graph?dag_id=my_dag_1 ), muestra un error: DAG "my_dag_1" seems to be missing.

Resultados en el flujo de air local

Al importar el script en un flujo de air local, el servidor web funciona bien:

DAG en el flujo de aire local

Algunas pruebas

Si sustituyo las entries = gcs_conn.list(bucket, prefix=prefix) línea entries = gcs_conn.list(bucket, prefix=prefix) con valores codificados como las entries = [u'my_dag_1', u'my_dag_2', u'my_dag_3', u'my_dag_4'] , entonces DAGS se puede hacer clic en Composer Web UI (y aparecen todos los botones en las columnas de “enlaces”). Parece que, a partir de otras pruebas que hice en mi problema inicial, llamar a un método desde un enlace (no solo inicializar el enlace) causa el problema. Por supuesto, los DAG en Composer funcionan normalmente en ejemplos simples (no se requieren llamadas a métodos de enganches).

No tengo idea de por qué sucedió esto, también he inspeccionado los registros (configurando logging_level = DEBUG en airflow.cfg ) pero no pude ver algo incorrecto. Estoy sospechando un error en el servidor web, pero no puedo obtener un seguimiento significativo de la stack. Los registros del servidor web de Composer (alojados en App Engine) no están disponibles, o al menos no encontré la forma de acceder a ellos.

¿Alguien experimentó el mismo problema o problemas similares con Composer Web UI? Creo que el problema proviene del uso de ganchos, pero puedo estar equivocado. Sólo puede ser un efecto secundario. Para ser honesto, estoy perdido después de probar tantas cosas. Me alegraré si alguien me puede ayudar. ¡Gracias!

Actualizar

Al implementar un servidor web autogestionado en Kubernetes siguiendo esta guía: https://cloud.google.com/composer/docs/how-to/managing/deploy-webserver , se puede hacer clic en mis DAG desde este servidor web autogestionado.

El servidor web Composer se ejecuta con una cuenta de servicio diferente a la de los nodos en el cluster Composer GKE. Debe asegurarse de que ha asignado los roles / permisos apropiados a la cuenta de servicio de su servidor web.

Por ejemplo, si la url de su servidor web es:

 foo-tp.appspot.com 

entonces la cuenta de servicio es:

 foo-tp@appspot.gserviceaccount.com