Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

gSlack: integrando o Google Cloud Platform ao Slack

By Vadim SoloveyJun 28, 20175 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

1 lsjusrn4 z43muefsxgiwg

Uma das coisas que mais curto no meu trabalho como CTO na DoiT International são as conversas do dia a dia com nossos clientes. Em muitos casos, elas são reveladoras e sempre acabo aprendendo algo novo.

Semana passada, vi um chamado de um dos nossos clientes perguntando qual seria a melhor forma de integrar o Google Cloud Platform ao Slack.

Mais especificamente, eles queriam ser notificados no canal do Slack sempre que alguma atividade rolasse em um dos seus projetos no Google Cloud — por exemplo, uma instância sendo iniciada ou encerrada, um novo bucket sendo criado ou removido, e por aí vai. Boa ideia, né? Uma busca rápida no google.com não trouxe nenhum resultado pronto, então tive que descobrir qual seria o jeito mais rápido e simples de integrar o Slack ao Google Cloud Platform.

Felizmente, existe uma solução elegante e totalmente serverless para isso, que vou tentar explicar neste post. Melhor ainda: hoje estamos abrindo o código do gSlack, que você pode implantar no seu próprio projeto GCP em poucos minutos e receber notificações instantâneas e flexíveis no seu canal do Slack.

slack gcp integration

O gSlack usa o Stackdriver Logging — a plataforma centralizada de logs do Google, que permite armazenar, pesquisar, analisar, monitorar e gerar alertas a partir de dados e eventos de log do Google Cloud Platform (e do Amazon Web Services). A maioria dos serviços de nuvem do Google envia seus logs para o Stackdriver Logging. Eu estava interessado especificamente nos "Activity Logs", que registram as mudanças no ambiente do Google Cloud Platform.

Veja como isso aparece no Google Cloud Console:

google cloud platform slack

Interface do Google Stackdriver Logging

Um dos recursos mais bacanas do Stackdriver Logging é a capacidade de exportar automaticamente novas entradas de log para o Google Cloud Storage, o Google BigQuery e o Google Pub/Sub. Basta configurar uma 'export' e o resto acontece como num passe de mágica.

Eu precisava de um meio de transporte capaz de levar as entradas de log do Stackdriver Logging até o Slack, e o Pub/Sub pareceu a melhor alternativa para esse caso. Se você ainda não conhece o Pub/Sub, é o serviço de mensageria em tempo real totalmente gerenciado do Google, que permite enviar e receber mensagens entre aplicações independentes.

Configurar a exportação para o Pub/Sub é tão simples quanto definir um filtro de log (eu só queria os logs do tipo 'activity', daí o logName="projects/doit-playground/logs/cloudaudit.googleapis.com%2Factivity") e o nome do tópico do Pub/Sub para onde as mensagens serão enviadas:

google cloud slack integration

Configuração do Sink do Pub/Sub

Pronto: agora, sempre que aparecer uma nova entrada no Stackdriver Logging, ela será encaminhada automaticamente para o meu tópico do Pub/Sub. Bem legal, né?

Em seguida, eu precisava de uma 'cola' entre o Pub/Sub e o Slack, para que as novas mensagens publicadas no Pub/Sub virassem notificações no Slack. Por sorte, o Google agora tem (em beta) o Cloud Functions — um ambiente serverless para criar e conectar serviços em nuvem. Em resumo, dá para escrever uma 'função' em NodeJS, disparada por um dos gatilhos suportados, como um novo arquivo no bucket, uma requisição http ou (aposto que você já adivinhou!) — uma nova mensagem em um tópico do Pub/Sub!

Nosso fluxo completo ficaria assim — o Stackdriver Logging registra determinada atividade no nosso projeto, envia automaticamente para o tópico do Pub/Sub, que por sua vez aciona uma Cloud Function, que manda uma mensagem para o canal do Slack usando o SDK oficial do Slack para NodeJS.

gcp slack integration

Diagrama de arquitetura do gSlack

Para configurar o Cloud Functions, você precisa subir um arquivo zip com o código e o seu package.json:

google cloud slack

Configuração do Google Cloud Functions

Para evitar mandar toda entrada de log de atividade para o canal do Slack (algumas podem não ter tanta graça) e formatar melhor as mensagens publicadas no Slack, resolvi usar mais um serviço gerenciado do Google — o Google Cloud Datastore.

O Google Cloud Datastore é um banco de dados NoSQL de documentos, gerenciado, criado para escalonamento automático, alto desempenho e facilidade no desenvolvimento de aplicações. Ele já vem integrado ao Cloud Functions e tem uma interface bem prática, que permite editar rapidamente as entradas ('kinds' e 'properties', na terminologia do Datastore).

Precisamos de algo como o Google Cloud Datastore para guardar de forma persistente a configuração de runtime do gSlack — mais especificamente, a definição de quais mensagens queremos publicar e como elas vão aparecer no Slack.

gcp slack

Editando os dados do Datastore pela interface integrada

Para cada conjunto de entradas de log, você precisa configurar test, message e o slackChannel em que quer publicar a notificação.

O test precisa ser uma expressão JS válida que retorne um booleano. Se retornar true, o teste passa e a mensagem vai para o Slack. Por exemplo, se quisermos incluir somente mensagens do Google Compute Engine e acompanhar eventos de 'start' e 'stop' de instâncias, dá para usar o seguinte teste:

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

Da mesma forma, o message precisa ser um template de string JS válido. Ele será avaliado para gerar a mensagem. Por exemplo:

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, a notificação a seguir é enviada ao Slack. Nos meus testes, leva cerca de 5 segundos entre o evento e a chegada da mensagem no canal do Slack.

slack gcp

Notificação real no Slack

Você pode adicionar quantos tests e messages quiser, fazendo o parsing de vários serviços do Google Cloud Platform, como Compute Engine, App Engine, Cloud Storage, BigQuery e até Billing. Inclusive, alguns desses exemplos já vêm no repositório do gSlack.

O código completo e as instruções de implantação estão no repositório do gSlack no GitHub. Fique à vontade para dar uma estrela, abrir um pull request e ajudar a melhorar o gSlack ;-)

Como sempre, é só me chamar em [email protected] com sugestões e ideias.

P.S. Quero agradecer ao Shahar Frank, Cloud Architect na DoiT International, que codou o exemplo inteiro em poucas horas e ainda me ajudou a preparar este post.