Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

gSlack: Google Cloud Platform mit Slack verbinden

By Vadim SoloveyJun 28, 20175 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

1 lsjusrn4 z43muefsxgiwg

Was mir an meiner Arbeit als CTO bei DoiT International besonders gefällt, sind die täglichen Gespräche mit unseren Kunden. Sie sind oft aufschlussreich, und ich nehme jedes Mal etwas Neues mit.

Letzte Woche ist mir ein Ticket eines Kunden aufgefallen, der wissen wollte, wie sich Google Cloud Platform am besten mit Slack verbinden lässt.

Konkret wollte er Benachrichtigungen in seinem Slack-Channel erhalten, sobald in einem seiner Google-Cloud-Projekte etwas passiert – etwa wenn eine Instanz gestartet oder beendet, ein neuer Bucket angelegt oder gelöscht wird und so weiter. Klingt praktisch, oder? Eine kurze Recherche bei google.com brachte keine direkten Treffer, also musste ich selbst herausfinden, wie sich Slack und Google Cloud Platform am schnellsten und einfachsten verbinden lassen.

Glücklicherweise gibt es dafür eine elegante, vollständig serverlose Lösung, die ich in diesem Beitrag vorstellen möchte. Und noch besser: Wir veröffentlichen heute gSlack als Open Source. Sie können das Tool in wenigen Minuten in Ihrem eigenen GCP-Projekt deployen und sofort flexible Benachrichtigungen in Ihrem Slack-Channel empfangen.

slack gcp integration

gSlack nutzt Stackdriver Logging – Googles zentrale Logging-Plattform, mit der sich Logdaten und Events von Google Cloud Platform (und Amazon Web Services) speichern, durchsuchen, analysieren, überwachen und mit Alerts versehen lassen. Die meisten Cloud-Dienste von Google senden ihre Logs an Stackdriver Logging. Mein Interesse galt vor allem den "Activity Logs", die Änderungen in der Google-Cloud-Platform-Umgebung erfassen.

So sieht das in der Google Cloud Console aus:

google cloud platform slack

Google Stackdriver Logging UI

Eines der schönsten Features von Stackdriver Logging: Neue Log-Einträge lassen sich automatisch nach Google Cloud Storage, Google BigQuery und Google Pub/Sub exportieren. Sie richten einfach einen "Export" ein – um den Rest kümmert sich die Plattform.

Ich brauchte einen Transportweg, um Log-Einträge von Stackdriver Logging an Slack weiterzureichen – Pub/Sub erschien für diesen Use Case ideal. Falls Sie Pub/Sub noch nicht kennen: Es ist Googles vollständig verwalteter Echtzeit-Messaging-Dienst, mit dem unabhängige Anwendungen Nachrichten austauschen können.

Den Pub/Sub-Export einzurichten ist denkbar einfach: Sie konfigurieren einen Log-Filter (ich brauche nur "activity"-basierte Logs, daher logName="projects/doit-playground/logs/cloudaudit.googleapis.com%2Factivity") und das Pub/Sub-Topic, an das die Nachrichten geschickt werden sollen:

google cloud slack integration

Pub/Sub Sink Configuration

Ab sofort wird also jeder neue Eintrag in Stackdriver Logging automatisch an mein Pub/Sub-Topic weitergegeben. Ziemlich praktisch, oder?

Als Nächstes brauchte ich einen "Klebstoff" zwischen Pub/Sub und Slack, damit neue Pub/Sub-Nachrichten als Slack-Benachrichtigungen erscheinen. Glücklicherweise bietet Google inzwischen (in der Beta) Cloud Functions – eine serverlose Umgebung, um Cloud-Dienste zu bauen und zu verbinden. Im Prinzip schreiben Sie eine "Function" in NodeJS, die durch einen der unterstützten Trigger ausgelöst wird: eine neue Datei im Bucket, ein HTTP-Request oder (Sie haben es sicher schon erraten!) – eine neue Nachricht in einem Pub/Sub-Topic!

Der komplette Ablauf sieht so aus: Stackdriver Logging protokolliert eine bestimmte Aktivität in unserem Projekt, schickt sie automatisch an ein Pub/Sub-Topic, das wiederum eine Cloud Function auslöst, die über das offizielle NodeJS-SDK von Slack eine Nachricht in den Slack-Channel postet.

gcp slack integration

gSlack Architektur-Diagramm

Um Cloud Functions einzurichten, laden Sie eine ZIP-Datei mit dem Code und Ihrer package.json hoch:

google cloud slack

Google Cloud Functions Setup

Damit nicht jeder Activity-Log-Eintrag im Slack-Channel landet (manche sind schlicht nicht relevant) und damit die Nachrichten in Slack besser formatiert ankommen, habe ich noch einen weiteren Managed Service von Google eingebunden – Google Cloud Datastore.

Google Cloud Datastore ist eine verwaltete NoSQL-Dokumentendatenbank, die auf automatische Skalierung, hohe Performance und einfache Anwendungsentwicklung ausgelegt ist. Sie bringt eine eingebaute Integration mit Cloud Functions mit und bietet eine übersichtliche UI, in der sich Einträge ("kinds" und "properties" in der Datastore-Terminologie) schnell bearbeiten lassen.

Wir brauchen etwas wie Google Cloud Datastore, um die Laufzeit-Konfiguration von gSlack dauerhaft zu speichern – konkret die Definition, welche Nachrichten veröffentlicht werden sollen und wie sie in Slack aussehen.

gcp slack

Bearbeiten der Datastore-Daten über die eingebaute UI

Für jeden Satz von Log-Einträgen konfigurieren Sie test, message und den slackChannel, in dem die Benachrichtigung erscheinen soll.

Der test muss ein gültiger JS-Ausdruck sein, der einen Boolean zurückgibt. Liefert er true, gilt der Test als bestanden und die Nachricht geht an Slack. Wenn wir zum Beispiel nur Nachrichten der Google Compute Engine berücksichtigen und "start"- und "stop"-Events von Instanzen verfolgen wollen, eignet sich folgender Test:

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

Analog dazu muss message ein gültiges JS-String-Template sein. Es wird ausgewertet, um die Nachricht zu erzeugen, z. B.:

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

Das Ergebnis: Die folgende Benachrichtigung erscheint in Slack. In meinen Tests vergehen zwischen dem eigentlichen Event und dem Eintreffen der Nachricht im Slack-Channel nur rund 5 Sekunden.

slack gcp

Tatsächliche Slack-Benachrichtigung

Sie können beliebig viele tests und messages hinzufügen und damit verschiedene Google-Cloud-Platform-Dienste wie Compute Engine, App Engine, Cloud Storage, BigQuery und sogar Billing auswerten. Einige dieser Beispiele liegen dem gSlack-Repository bereits bei.

Den vollständigen Code sowie eine Deployment-Anleitung finden Sie im gSlack-Repository auf GitHub. Über einen Stern oder einen Pull Request zur Weiterentwicklung von gSlack freuen wir uns ;-)

Wie immer erreichen Sie mich mit Vorschlägen und Ideen unter [email protected].

P.S. Ein großes Dankeschön an Shahar Frank, Cloud Architect bei DoiT International, der das gesamte Beispiel in wenigen Stunden umgesetzt und mir bei diesem Beitrag geholfen hat.