Como enviar notificações para eventos do Google Cloud

Este tutorial se destina a equipes de DevOps que querem receber notificações de eventos importantes do Google Cloud em suas plataformas de colaboração, como Hangouts Chat, Slack ou Microsoft Teams. Com as notificações, as equipes não precisam fazer login regularmente no Console do Google Cloud para verificar se há atualizações de eventos.

Como exemplo para este tutorial, as notificações são geradas após a captura de snapshots do disco. Criar um snapshot do disco faz backup dos dados dos discos permanentes zonais ou regionais. Você pode modificar este tutorial para enviar notificações automaticamente para seus sistemas de colaboração quando outros eventos importantes do Google Cloud ocorrerem, por exemplo, quando uma instância de máquina virtual (VM) for criada ou excluída.

O código deste tutorial está disponível em um repositório do GitHub.

Este tutorial se destina a engenheiros especializados em DevOps e tecnologia de nuvem. Ele pressupõe que você esteja familiarizado com o Cloud Logging, o Pub/Sub e o Cloud Functions.

Os relatórios State of DevOps identificaram recursos que impulsionam o desempenho da entrega de software. Este tutorial ajudará você com os seguintes recursos:

Arquitetura

O diagrama a seguir mostra os diferentes componentes usados neste tutorial.

Arquitetura de um sistema que envia notificações depois que os snapshots do disco
são capturados.

Primeiro, crie um disco permanente e capture um snapshot do disco. Em seguida, filtre os eventos de registro que correspondem aos snapshots de disco e exporte os eventos, publicando-os em um tópico do Pub/Sub. Uma Função do Cloud lê a mensagem do tópico e envia uma notificação push para um webhook. Neste tutorial, o webhook é representado por uma Função do Cloud.

Objetivos

  • Configure o Cloud Logging para exportar eventos selecionados para o Pub/Sub para que o Cloud Functions possa consumi-los.
  • Implante uma Função do Cloud que consuma eventos exportados pelo Cloud Logging e, em seguida, acione um webhook.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Antes de começar

  1. No Console do Cloud, na página do seletor de projetos, selecione ou crie um projeto do Cloud.

    Acessar a página do seletor de projetos

  2. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

  3. No Console do Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

    Use o Cloud Shell para executar todos os comandos neste tutorial.

  4. Ative as APIs Compute Engine, Cloud Logging, Cloud Functions e Pub/Sub:

    gcloud services enable \
        compute.googleapis.com \
        logging.googleapis.com \
        cloudfunctions.googleapis.com \
        pubsub.googleapis.com
    

Preparar o ambiente

  1. No Cloud Shell, defina o padrão gcloud para a região e a zona do Compute Engine que você quer usar neste tutorial:

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-a
    

    Neste tutorial, usamos a região us-central1 e a zona us-central1-a. Você pode alterar a região e a zona de acordo com suas necessidades. Para mais informações, consulte Geografia e regiões.

  2. Defina as variáveis de ambiente usadas neste tutorial:

    PROJECT=$(gcloud config get-value project)
    PUBSUB_TOPIC="gce-snapshots-events"
    DISK="my-disk-1"
    WEBHOOK_NAME="webhookEmulator"
    WEBHOOK_URL="https://$(gcloud config get-value compute/region)-$PROJECT.cloudfunctions.net/$WEBHOOK_NAME"
    

Como criar recursos

Nesta seção, você criará os seguintes recursos do Google Cloud para este tutorial:

  • Tópico do Pub/Sub
  • Coletor do Cloud Logging
  • Função do Cloud

Criar um tópico do Pub/Sub

  • No Cloud Shell, crie um tópico do Pub/Sub para publicar mensagens de evento em:

    gcloud pubsub topics create $PUBSUB_TOPIC
    

Criar um coletor do Cloud Logging para o Pub/Sub

O Cloud Logging permite armazenar, pesquisar e analisar eventos do Google Cloud. É possível filtrar e exportar estes registros para o Cloud Storage, o BigQuery e o Pub/Sub.

  1. No Cloud Shell, exporte os registros gerados pelos snapshots do disco para o Pub/Sub:

    gcloud logging sinks create gce-events-sink \
        pubsub.googleapis.com/projects/$PROJECT/topics/$PUBSUB_TOPIC \
        --log-filter='resource.type="gce_disk"
    jsonPayload.event_type="GCE_OPERATION_DONE"
    jsonPayload.event_subtype="compute.disks.createSnapshot"'
    

    A saída contém o endereço de e-mail da conta de serviço que o Cloud Logging usa ao publicar registros no tópico do Pub/Sub criado anteriormente. Este endereço de e-mail tem a forma de SERVICE_ACCOUNT_NAME@gcp-sa-logging.iam.gserviceaccount.com.

  2. Copie o endereço de e-mail da conta de serviço. Você precisará dele na próxima seção.

Configurar permissões

  • No Cloud Shell, conceda à conta de serviço o papel do IAM de editor do Pub/Sub (roles/pubsub.publisher) para que ela possa publicar mensagens no tópico do Pub/Sub:

    gcloud beta pubsub topics add-iam-policy-binding $PUBSUB_TOPIC \
        --member='serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS' \
        --role='roles/pubsub.publisher'
    

    Substitua SERVICE_ACCOUNT_EMAIL_ADDRESS pelo endereço de e-mail que você copiou na seção anterior.

Criar um webhook

Normalmente na produção você é notificado sobre eventos importantes do Google Cloud por meio de notificações push enviadas para suas plataformas de colaboração. A maioria destas plataformas oferece webhooks. Neste tutorial, você criará uma Função do Cloud para simular um webhook de uma destas plataformas. Esta Função do Cloud, que é acionada por HTTP, imprime o conteúdo das mensagens recebidas.

Por padrão, qualquer usuário ou serviço pode invocar uma Função HTTP do Cloud. Você pode configurar o gerenciamento de identidade e acesso (IAM) em funções HTTP para restringir esse comportamento. Assim, sua função HTTP só pode ser invocada com credenciais de autenticação na solicitação.

  1. No Cloud Shell, clone o repositório Git que contém o código do tutorial:

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. Alterne para o diretório de trabalho:

    cd gcf-notification-forwarding/
    
  3. Implante o webhook do Cloud Function webhookEmulator usando um acionador HTTP:

    gcloud functions deploy $WEBHOOK_NAME \
        --runtime=nodejs8 \
        --trigger-http \
        --allow-unauthenticated \
        --source=webhook/
    

    Este comando pode levar até dois minutos para ser concluído.

Criar uma Função do Cloud para enviar notificações

Crie uma Função do Cloud que se inscreva no tópico do Pub/Sub criado anteriormente no modo push. Em seguida, sempre que o Cloud Logging exporta (ou envia) um evento para o tópico do Pub/Sub, esta Função do Cloud é acionada. A função recebe o evento, o processa e o envia para o endpoint HTTP do webhook que você criou anteriormente.

  • No Cloud Shell, implante a Função do Cloud:

    gcloud functions deploy pushEventsToWebhook \
        --runtime=nodejs8 \
        --trigger-topic=$PUBSUB_TOPIC \
        --set-env-vars=WEBHOOK_URL=$WEBHOOK_URL \
        --allow-unauthenticated \
        --source=push_notification/
    

Como testar a configuração

Para testar esta configuração, capture um snapshot do disco e verifique se o webhook recebe o log de eventos gerado pelo snapshot do disco.

  1. No Cloud Shell, crie um disco permanente zonal. O padrão é uma unidade de disco rígido padrão de 500 GB.

    gcloud compute disks create $DISK \
        --zone=$(gcloud config get-value compute/zone)
    
  2. Acione a criação de um snapshot do disco criado anteriormente:

    gcloud compute disks snapshot $DISK \
        --zone=$(gcloud config get-value compute/zone) \
        --storage-location=$(gcloud config get-value compute/region)
    

    Este comando pode levar até dois minutos para ser concluído. Depois que o snapshot é capturado, é gerada uma entrada de registro de atividade do administrador. O log de eventos é filtrado e enviado ao tópico do Pub/Sub. A Função do Cloud inscrita escolhe, formata e envia para o endpoint HTTP do webhook.

  3. Após alguns minutos, verifique se o webhook recebeu o log de eventos:

    gcloud beta functions logs read $WEBHOOK_NAME \
        --region=$(gcloud config get-value compute/region) \
        --limit=10
    

    A saída será assim:

    {
      data:[
         {
            "type":'disk',
            "url":'https://console.cloud.google.com/compute/disksDetail/zones/us-central1-a/disks/my-disk-1?project=$PROJECT&supportedpurview=project',
            "name":'my-disk-1'
         },
         {
            "type":'project',
            "project_id":'$PROJECT',
            "project_url":'https://console.cloud.google.com/home/dashboard?project=$PROJECT'
         },
         {
            "zone":'us-central1-a'
         },
         {
            "date_time":'2020-04-15T09:07:21.205-06:00'
         }
      ]
    }
    

    A saída mostra que o webhook recebeu a notificação de que foi tirado um snapshot do disco.

Limpar

A maneira mais fácil de eliminar o faturamento é excluir o projeto criado para o tutorial.

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar a página "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir