En DoiT International trabajamos con todo tipo de empresas de software en distintas partes del mundo. Es habitual que varios clientes nos pidan resolver el mismo tipo de problema. Hace poco me encontré con varios casos en los que las organizaciones querían enviar los logs de varios proyectos de Google Cloud Platform (GCP) a un único proyecto, para tener acceso y observabilidad centralizados.
Muchas empresas envían sus logs a proveedores externos como Datadog, Splunk y otros; pero en este post te voy a mostrar cómo unificar los archivos de log con control de acceso usando solo el servicio Cloud Logging de GCP (antes Stackdriver). El resultado es una solución simple y elegante para una necesidad cada vez más común.
Arquitectura

Vista general de la arquitectura de la demo
TL;DR
Para este ejemplo voy a crear dos proyectos de prueba y configuraré sus logs para que se envíen a un proyecto central. Como extra, te muestro también cómo centralizar el monitoreo y las métricas (otro caso de uso muy frecuente).
- Crea tres proyectos de prueba en GCP: mike-test-log-view, mike-test-log-a y mike-test-log-b
- Crea un logs bucket en el proyecto mike-test-log-view y copia la ruta del bucket
- Crea un log sink de tipo Cloud Logging bucket que apunte a la ruta copiada en el paso 2, tanto en el proyecto mike-test-log-a como en el mike-test-log-b
- Abre los detalles de cada log sink y copia el correo de la Service Account del writer entity (se crea de forma dinámica para cada uno)
- Edita los roles de IAM en el proyecto mike-test-log-view y añade cada Service Account copiada de los log sinks, otorgándole el rol Logs Bucket Writer
- Edita los roles de IAM en el proyecto mike-test-log-view y añade el rol Logs View Accessor con una condición que apunte a la ruta de tu logs bucket (para restringir el acceso por usuario)
- Abre la página Logs Explorer, haz clic en "Refine Scope" arriba, selecciona "Scope by storage" y elige tu logs bucket
Paso a paso
Estos pasos muestran cómo enviar logs desde varios proyectos de Google Cloud Platform a un único proyecto centralizado.
Paso 1: Crea los proyectos de prueba
Este paso se explica solo. Creé tres proyectos como se describió antes con fines de demostración.
Paso 2: Crea un logs bucket en el proyecto de visualización

Entra a Logs Storage y haz clic en "Create Logs Bucket"; luego copia la ruta del bucket
Paso 3: Crea los log sinks en los proyectos de prueba
Crea los log sinks en los proyectos de prueba a y b respectivamente.

Configura el destino del sink como "Cloud Logging Bucket"

Selecciona la opción "Use a logs bucket in another project"

Log sink para el proyecto de prueba "a", añadiendo al destino la ruta del logs bucket (después del dominio)

Log sink para el proyecto de prueba "b", añadiendo al destino la ruta del logs bucket (después del dominio)
Paso 4: Abre los detalles de los log sinks y anota el writer identity de IAM
En cada proyecto de prueba, en la vista de lista de la página "Log Router Sinks", haz clic en los "…" (3 puntos) al extremo derecho de la fila correspondiente a tu nuevo log sink y selecciona "View Details".

Copia el "Writer identity", que es la service account que se crea de forma dinámica junto con el log sink. La vas a añadir al proyecto de visualización para que pueda escribir entradas de log en tu logs bucket central.
Paso 5: Edita los roles de IAM en el proyecto de visualización para los writers de los log sinks
Para cada log sink, en tu proyecto central de visualización, entra a la página de administración de IAM y añade un miembro con el rol Logs Bucket Writer, usando la service account del "Writer identity" que copiaste en el paso 4, como se muestra.

Añadir roles de IAM para que los log sinks puedan escribir entradas de log en el proyecto de visualización
Paso 6: Edita los roles de IAM en el proyecto de visualización para los lectores de logs (usuarios)
Para que los usuarios puedan consultar los logs en el Logs Explorer, tienes que darles la capacidad de editar la vista (o scope) otorgándoles el rol Logs View Accessor.

Otorgar a los usuarios la capacidad de editar la vista (scope) del Logs Explorer
Puedes (y deberías) afinar todavía más el rol de IAM del usuario añadiendo una condición que restrinja el acceso solo a los recursos deseados. En este caso, la ruta del logs bucket que creaste. Así puedes limitar la vista de los usuarios únicamente a los logs y buckets que tú decidas, algo muy útil para los controles de cumplimiento.

Paso 7: Consulta los logs
Con los permisos ya configurados, en cuestión de minutos (o menos) deberías empezar a ver entradas de log en tu proyecto de visualización. Primero tienes que hacer clic en "Refine Scope" y seleccionar la fuente de logs deseada, como se muestra.

Ajustar el scope de la vista del Logs Explorer para explorar los logs que llegan al Logs Bucket desde los sinks
¡Listo! Desde tu proyecto de visualización ya puedes ver los logs de los demás proyectos, como se muestra.

Los logs del proyecto de prueba "a" se ven en el proyecto "view"
Extra \#1: Reduce costos con filtros de exclusión
Puedes desactivar el log sink "_Default" en tus proyectos para no pagar por logging en varios lugares a la vez.
También puedes añadir filtros de exclusión (o de inclusión) en tus log sinks para controlar qué servicios se envían y cuáles se descartan.
- Gestionar exclusiones de logs
- Tip: El campo "rate" es una tasa de muestreo, así que cámbialo a 100(%)
Extra \#2: Centraliza tu Cloud Monitoring
Google Cloud Operations (antes Stackdriver) es una plataforma de observabilidad completa que, además del logging, incluye otra herramienta llamada Cloud Monitoring.
Con unos pocos clics puedes crear un "Workspace" en tu proyecto de visualización y luego seleccionar los demás proyectos para centralizar el monitoreo y los dashboards si así lo prefieres.

Espero que este artículo te ayude a organizar y gestionar mejor el logging y la observabilidad en toda tu organización. Sígueme o visita el DoiT Blog para leer más artículos con tips y técnicas, novedades, buenas prácticas y mucho más sobre la nube pública.