Envía notificaciones para eventos de Google Cloud


Este instructivo es para los equipos de DevOps que desean recibir notificaciones sobre eventos importantes de Google Cloud en sus plataformas de colaboración, como Google Chat, Slack o Equipos de Microsoft. Las notificaciones liberan a los equipos de tener que acceder con frecuencia a la consola de Google Cloud para comprobar si hay actualizaciones del evento.

Como ejemplo para este instructivo, las notificaciones se generan después de que tomas instantáneas de disco. Si tomas una instantánea de disco, se realiza una copia de seguridad de los datos de tus discos persistentes zonales o regionales. Puedes modificar este instructivo para enviar notificaciones automáticamente a tus sistemas de colaboración cuando ocurren otros eventos importantes de Google Cloud, por ejemplo, cuando se crea o borra una instancia de máquina virtual (VM).

El código para este instructivo está disponible en un repositorio de GitHub.

Este instructivo está dirigido a ingenieros especializados en DevOps y en la tecnología de nube. Se supone que estás familiarizado con Cloud Logging, Pub/Sub y Cloud Functions.

Los informes State of DevOps identificaron las capacidades que impulsan el rendimiento de la entrega de software. Este instructivo te ayudará con las siguientes funciones:

Arquitectura

En el siguiente diagrama, se muestran los diferentes componentes que usarás en este instructivo.

Arquitectura de un sistema que envía notificaciones después de que se toman las instantáneas de disco.

Primero, crea un disco persistente y toma una instantánea de disco. Luego, debes filtrar los eventos de registro que corresponden a las instantáneas de disco correctas y exportarlos a un tema de Pub/Sub. Una función de Cloud Functions lee el mensaje del tema y envía una notificación push a un webhook. Para este instructivo, este webhook está representado por una función de Cloud Functions.

Objetivos

  • Configurar Cloud Logging para exportar los eventos seleccionados a Pub/Sub a fin de que Cloud Functions pueda usarlos
  • Implementar una función de Cloud Functions que usa eventos exportados por Cloud Logging y, luego, activar un webhook.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  3. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    Usarás Cloud Shell para ejecutar todos los comandos de este instructivo.

  4. Habilita las API de Compute Engine, Cloud Logging, Cloud Functions y Pub/Sub:

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

Prepara tu entorno

  1. En Cloud Shell, configura el gcloud predeterminado para la región y zona de Compute Engine que deseas usar en este instructivo:

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

    En este instructivo, se usa la región us-central1 y la zona us-central1-a. Puedes cambiar la región y la zona según tus necesidades. Para obtener más información, consulta Geografía y regiones.

  2. Define las variables de entorno que usarás para este instructivo:

    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"
    

Crea recursos

En esta sección, crearás los siguientes recursos de Google Cloud para este instructivo:

  • Tema de Pub/Sub
  • Receptor de Cloud Logging
  • Función de Cloud Functions

Crea un tema de Pub/Sub

  • En Cloud Shell, crea un tema de Pub/Sub para publicar mensajes de eventos en:

    gcloud pubsub topics create $PUBSUB_TOPIC
    

Crea un receptor de Cloud Logging en Pub/Sub

Cloud Logging te permite almacenar, buscar y analizar eventos de Google Cloud. Puedes filtrar y exportar estos registros a Cloud Storage, BigQuery y Pub/Sub.

  1. En Cloud Shell, exporta los registros generados por las instantáneas de disco a 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"'
    

    El resultado contiene la dirección de correo electrónico de la cuenta de servicio que usa Cloud Logging cuando publica registros en el tema de Pub/Sub que creaste antes. Esta dirección de correo electrónico tiene el formato SERVICE_ACCOUNT_NAME@gcp-sa-logging.iam.gserviceaccount.com.

  2. Copia la dirección de correo electrónico de la cuenta de servicio. La necesitarás en la siguiente sección.

Configura los permisos

  • En Cloud Shell, otorga a la cuenta de servicio la función de IAM de publicador de Pub/Sub (roles/pubsub.publisher) para que pueda publicar mensajes en el tema de Pub/Sub:

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

    Reemplaza SERVICE_ACCOUNT_EMAIL_ADDRESS con la dirección de correo electrónico que copiaste en la sección anterior.

Crea un webhook

Por lo general, en producción, se te notifican los eventos importantes de Google Cloud mediante notificaciones push enviadas a tus plataformas de colaboración. La mayoría de estas plataformas ofrecen webhooks. En este instructivo, crearás una función de Cloud Functions para simular un webhook desde una de estas plataformas. Esta función de Cloud Functions, que se activa a través de HTTP, imprime el contenido de los mensajes recibidos.

De forma predeterminada, cualquier usuario o servicio puede invocar una función de HTTP de Cloud Functions. Puedes configurar la administración de identidades y accesos (IAM) en las funciones de HTTP para restringir este comportamiento a fin de que tu función de HTTP solo se pueda invocar si se proporcionan credenciales de autenticación en la solicitud.

  1. En Cloud Shell, clona el repositorio de Git que contiene el código del instructivo:

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. Cambia al directorio de trabajo:

    cd gcf-notification-forwarding/
    
  3. Implementa el webhook webhookEmulator de la función de Cloud Functions con un activador HTTP:

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

    Este comando puede tardar hasta dos minutos en completarse.

Crea una función de Cloud Functions para enviar notificaciones

Debes crear una función de Cloud Functions que se suscriba al tema de Pub/Sub que creaste anteriormente en el modo push. Luego, cada vez que Cloud Logging exporta (o envía) un evento al tema de Pub/Sub, se activa esta función de Cloud Functions. La función recibe el evento, lo procesa y lo envía al extremo HTTP del webhook que creaste antes.

  • En Cloud Shell, implemente la Cloud Function:

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

Prueba la configuración

Para probar esta configuración, toma una instantánea de disco y verifica si el webhook recibe el registro de acontecimientos que genera la instantánea de disco.

  1. En Cloud Shell, crea un disco persistente zonal. El valor predeterminado es una unidad de disco duro estándar de 500 GB.

    gcloud compute disks create $DISK \
        --zone=$(gcloud config get-value compute/zone)
    
  2. Activa la creación de una instantánea del disco que creaste anteriormente:

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

    Este comando puede tardar hasta dos minutos en completarse. Una vez que se toma la instantánea, se genera una entrada de registro de actividad del administrador. El registro de acontecimientos se filtra y se envía al tema de Pub/Sub. La función de Cloud Functions suscrita lo captura, lo formatea y lo envía al extremo HTTP del webhook.

  3. Después de unos minutos, verifica si el webhook recibió el registro de acontecimientos:

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

    El resultado es similar al siguiente:

    {
      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/?project=$PROJECT'
         },
         {
            "zone":'us-central1-a'
         },
         {
            "date_time":'2020-04-15T09:07:21.205-06:00'
         }
      ]
    }
    

    En el resultado. se muestra que el webhook recibió la notificación de que se tomó una instantánea de disco.

Limpia

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?