Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

gSlack: integra Google Cloud Platform con Slack

By Vadim SoloveyJun 28, 20175 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

1 lsjusrn4 z43muefsxgiwg

Una de las cosas que más disfruto de mi trabajo como CTO en DoiT International son las conversaciones diarias con nuestros clientes. Muchas veces son reveladoras y siempre aprendo algo nuevo.

La semana pasada me llamó la atención un ticket de uno de nuestros clientes que preguntaba cuál sería la mejor forma de integrar Google Cloud Platform con Slack.

Concretamente, querían recibir notificaciones en su canal de Slack cuando ocurriera alguna actividad en uno de sus proyectos de Google Cloud: por ejemplo, al iniciar o detener una instancia, al crear o eliminar un bucket, etc. ¿No suena interesante? Una búsqueda rápida en google.com no arrojó resultados inmediatos, así que tuve que descubrir por mi cuenta cuál era la forma más rápida y sencilla de integrar Slack con Google Cloud Platform.

Por suerte, existe una solución elegante y totalmente serverless que voy a tratar de explicar en este post. Y mejor todavía: hoy liberamos como código abierto gSlack, que puedes desplegar en tu propio proyecto de GCP en pocos minutos para recibir notificaciones flexibles e instantáneas en tu canal de Slack.

slack gcp integration

gSlack se apoya en Stackdriver Logging, la plataforma centralizada de logging de Google que te permite almacenar, buscar, analizar y monitorear logs y eventos de Google Cloud Platform (y Amazon Web Services), además de configurar alertas sobre ellos. La mayoría de los servicios cloud de Google envían sus logs a Stackdriver Logging. A mí me interesaban en particular los "Activity Logs", que recogen los cambios en el entorno de Google Cloud Platform.

Así se ve en la Google Cloud Console:

google cloud platform slack

Interfaz de Google Stackdriver Logging

Una de las funciones más prácticas de Stackdriver Logging es que puede exportar automáticamente las nuevas entradas de log a Google Cloud Storage, Google BigQuery y Google Pub/Sub. Solo configuras una "exportación" y el resto sucede de forma automática.

Necesitaba un canal de transporte que llevara las entradas de log de Stackdriver Logging hasta Slack, y Pub/Sub me pareció la mejor alternativa para este caso. Por si no lo conoces, Pub/Sub es el servicio de mensajería en tiempo real totalmente gestionado de Google, que permite enviar y recibir mensajes entre aplicaciones independientes.

Configurar la exportación a Pub/Sub es tan simple como definir un filtro de logs (yo solo necesito los logs de tipo "activity", de ahí el logName="projects/doit-playground/logs/cloudaudit.googleapis.com%2Factivity") e indicar el nombre del topic de Pub/Sub al que se enviarán los mensajes:

google cloud slack integration

Configuración del Sink de Pub/Sub

De este modo, cada vez que aparece una nueva entrada en Stackdriver Logging, se envía automáticamente a mi topic de Pub/Sub. Bastante práctico, ¿no?

El siguiente paso era poner una pieza de "pegamento" entre Pub/Sub y Slack para que los nuevos mensajes publicados en Pub/Sub se enviaran como notificaciones a Slack. Por suerte, Google ya cuenta (en beta) con Cloud Functions, un entorno serverless para crear y conectar servicios cloud. En esencia, puedes programar una "función" en NodeJS que se dispara con alguno de los triggers compatibles, como un nuevo archivo en un bucket, una solicitud HTTP o (¡seguro que ya lo adivinaste!) un nuevo mensaje en un topic de Pub/Sub.

El flujo completo quedaría así: StackDriver Logging registra cierta actividad en nuestro proyecto, la envía automáticamente al topic de Pub/Sub, este invoca a Cloud Function y, a su vez, la función publica un mensaje en el canal de Slack usando el SDK oficial de Slack para NodeJS.

gcp slack integration

Diagrama de arquitectura de gSlack

Para configurar Cloud Functions necesitas subir un archivo zip con el código y tu archivo package.json:

google cloud slack

Configuración de Google Cloud Functions

Para evitar que cada entrada del log de actividad llegue al canal de Slack (algunas no son tan relevantes) y dar un mejor formato a los mensajes, decidí sumar otro servicio gestionado de Google: Google Cloud Datastore.

Google Cloud Datastore es una base de datos NoSQL documental gestionada, pensada para escalar de forma automática, ofrecer alto rendimiento y facilitar el desarrollo de aplicaciones. Trae integración nativa con Cloud Functions y también una interfaz cómoda para editar entradas rápidamente ("kinds" y "properties", en la terminología de Datastore).

Necesitamos algo como Google Cloud Datastore para almacenar de forma persistente la configuración en tiempo de ejecución de gSlack: en concreto, qué mensajes queremos publicar y cómo se verán al llegar a Slack.

gcp slack

Edición de los datos de Datastore desde la interfaz integrada

Para cada conjunto de entradas de log necesitas configurar test, message y el slackChannel donde quieres publicar la notificación.

El test debe ser una expresión JS válida que devuelva un booleano. Si devuelve true, se considera superado y el mensaje se envía a Slack. Por ejemplo, si solo queremos incluir mensajes de Google Compute Engine y rastrear los eventos "start" y "stop" de instancias, podemos usar este test:

$.protoPayload.serviceName==='compute.googleapis.com' && ( $.protoPayload.methodName==='v1.compute.instances.start' || $.protoPayload.methodName==='v1.compute.instances.stop') && $.operation.last

De forma similar, el message debe ser una plantilla de string JS válida. Se evalúa para generar el mensaje final. Por ejemplo:

Instance '${$.protoPayload.resourceName.split('/').slice(-1)[0]}' was ${$.protoPayload.methodName==='v1.compute.instances.start'?'started':'stopped'} at zone '${$.resource.labels.zone}' by '${$.protoPayload.authenticationInfo.principalEmail}' in project '${$.resource.labels.project_id}'

Como resultado, en Slack se recibe la siguiente notificación. En mis pruebas, pasan apenas unos 5 segundos entre el evento real y el momento en que el mensaje aparece en el canal de Slack.

slack gcp

Notificación real en Slack

Puedes agregar tantos tests y messages como quieras, parseando distintos servicios de Google Cloud Platform como Compute Engine, App Engine, Cloud Storage, BigQuery e incluso Billing. De hecho, en el repositorio de gSlack incluimos varios ejemplos de este tipo.

El código completo y las instrucciones de despliegue están disponibles en el repositorio de gSlack en GitHub. Anímate a darle una estrella o a enviar un pull request para mejorar gSlack ;-)

Como siempre, puedes escribirme a [email protected] con tus sugerencias e ideas.

P.D. Quiero agradecer a Shahar Frank, Cloud Architect en DoiT International, que programó todo el ejemplo en apenas unas horas y me ayudó a preparar este post.