Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

gSlack: integrare Google Cloud Platform con Slack

By Vadim SoloveyJun 28, 20175 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

1 lsjusrn4 z43muefsxgiwg

Tra gli aspetti che apprezzo di più del mio ruolo di CTO in DoiT International ci sono le conversazioni quotidiane con i nostri clienti. Spesso si rivelano illuminanti e mi permettono di imparare sempre qualcosa di nuovo.

La scorsa settimana mi è capitato sotto gli occhi il ticket di un cliente che chiedeva quale fosse il modo migliore per integrare Google Cloud Platform con Slack.

Nello specifico, voleva ricevere una notifica sul proprio canale Slack ogni volta che si verificava un'attività in uno dei suoi progetti Google Cloud: l'avvio o l'arresto di un'istanza, la creazione o l'eliminazione di un bucket e così via. Bella idea, no? Una rapida ricerca su google.com non ha dato risultati immediati, perciò ho dovuto trovare la strada più rapida e semplice per integrare Slack e Google Cloud Platform.

Per fortuna esiste una soluzione elegante e completamente serverless, che proverò a illustrare in questo post. Anzi, c'è di più: oggi rilasciamo come open source gSlack, che potete distribuire nel vostro progetto GCP in pochi minuti per ricevere notifiche immediate e personalizzabili sul vostro canale Slack.

slack gcp integration

gSlack si appoggia su Stackdriver Logging, la piattaforma di logging centralizzata di Google che permette di archiviare, cercare, analizzare e monitorare dati di log ed eventi provenienti da Google Cloud Platform (e da Amazon Web Services), oltre a generare alert. La maggior parte dei servizi cloud di Google invia i propri log a Stackdriver Logging. Mi interessavano in particolare gli "Activity Logs", che registrano le modifiche all'ambiente Google Cloud Platform.

Ecco come si presentano nella Google Cloud Console:

google cloud platform slack

Interfaccia di Google Stackdriver Logging

Una delle funzionalità più interessanti di Stackdriver Logging è la capacità di esportare automaticamente le nuove voci di log su Google Cloud Storage, Google BigQuery e Google Pub/Sub. Basta configurare un "export" e tutto il resto avviene come per magia.

Mi serviva un canale di trasporto in grado di portare le voci di log da Stackdriver Logging a Slack, e Pub/Sub si è rivelata l'opzione migliore per questo caso d'uso. Per chi non lo conoscesse, Pub/Sub è il servizio di messaggistica in tempo reale completamente gestito di Google, che permette di inviare e ricevere messaggi tra applicazioni indipendenti.

Configurare l'export verso Pub/Sub è semplicissimo: basta impostare un filtro sui log (a me servono solo quelli di tipo "activity", da cui logName="projects/doit-playground/logs/cloudaudit.googleapis.com%2Factivity") e indicare il nome del topic Pub/Sub a cui inviare i messaggi:

google cloud slack integration

Configurazione del Sink Pub/Sub

A questo punto, ogni volta che viene aggiunta una nuova voce in Stackdriver Logging, questa viene inoltrata automaticamente al mio topic Pub/Sub. Niente male, vero?

A questo punto serviva un "collante" tra Pub/Sub e Slack, in modo che i nuovi messaggi pubblicati su Pub/Sub venissero recapitati come notifiche Slack. Per fortuna Google offre ora (in beta) Cloud Functions, un ambiente serverless per creare e collegare servizi cloud. In pratica, si può scrivere una "funzione" in NodeJS che si attiva tramite uno dei trigger supportati: un nuovo file in un bucket, una richiesta HTTP o (l'avete già indovinato!) un nuovo messaggio in un topic Pub/Sub.

Il flusso completo è il seguente: Stackdriver Logging registra una determinata attività nel nostro progetto, la inoltra automaticamente a un topic Pub/Sub che a sua volta richiama una Cloud Function, la quale pubblica un messaggio sul canale Slack utilizzando l'SDK ufficiale di Slack per NodeJS.

gcp slack integration

Diagramma dell'architettura di gSlack

Per configurare Cloud Functions occorre caricare un file zip contenente il codice e il file package.json:

google cloud slack

Configurazione di Google Cloud Functions

Per evitare di inoltrare al canale Slack ogni singola voce dei log di attività (alcune potrebbero essere poco rilevanti) e per dare ai messaggi un formato più leggibile, ho deciso di utilizzare un altro servizio gestito di Google: Google Cloud Datastore.

Google Cloud Datastore è un database documentale NoSQL gestito, progettato per scalare automaticamente, garantire prestazioni elevate e semplificare lo sviluppo applicativo. Si integra nativamente con Cloud Functions e mette a disposizione un'interfaccia molto comoda per modificare rapidamente le voci (i "kinds" e le "properties", nella terminologia di Datastore).

Ci serviva qualcosa come Google Cloud Datastore per memorizzare in modo persistente la configurazione runtime di gSlack: in particolare, quali messaggi pubblicare e quale forma dovranno avere quelli inviati a Slack.

gcp slack

Modifica dei dati di Datastore tramite l'interfaccia integrata

Per ogni gruppo di voci di log occorre configurare test, message e slackChannel, ovvero il canale su cui pubblicare la notifica.

Il test deve essere un'espressione JS valida che restituisce un valore booleano. Se restituisce true, il test viene superato e il messaggio viene inviato a Slack. Ad esempio, per includere solo i messaggi di Google Compute Engine e tracciare gli eventi di "start" e "stop" delle istanze, possiamo usare il seguente test:

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

Allo stesso modo, message deve essere un template stringa JS valido. Verrà valutato per generare il messaggio, ad esempio:

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}'

Il risultato è la notifica che vedete qui sotto, recapitata su Slack. Nei miei test trascorrono appena 5 secondi tra l'evento effettivo e l'arrivo del messaggio sul canale Slack.

slack gcp

Esempio reale di notifica Slack

Potete aggiungere tutti i tests e i messages che volete, intercettando i diversi servizi di Google Cloud Platform: Compute Engine, App Engine, Cloud Storage, BigQuery e persino Billing. Nel repository di gSlack trovate alcuni di questi esempi già pronti.

Il codice completo e le istruzioni di deployment sono disponibili nel repository gSlack su GitHub. Lasciate pure una star o aprite una pull request per migliorare gSlack ;-)

Come sempre, potete scrivermi a [email protected] con suggerimenti e idee.

P.S. Un ringraziamento a Shahar Frank, Cloud Architect in DoiT International, che ha scritto l'intero esempio in poche ore e mi ha aiutato a preparare questo post.