Envoyer des notifications pour des événements Google Cloud


Ce tutoriel est destiné aux équipes DevOps qui souhaitent recevoir des notifications pour les événements Google Cloud importants transmis à leurs plates-formes de collaboration, telles que Google Chat, Slack, ou Microsoft Teams. Les notifications dispensent les équipes de se connecter régulièrement à Google Cloud Console pour rechercher si des événements ont été modifiés.

À titre d'exemple pour ce tutoriel, les notifications sont générées après chaque réalisation d'un instantané de disque. La prise d'un instantané de disque sauvegarde les données de vos disques persistants zonaux ou régionaux. Vous pouvez modifier ce tutoriel pour envoyer automatiquement des notifications à vos systèmes de collaboration lorsque d'autres événements Google Cloud importants se produisent, par exemple lorsqu'une instance de machine virtuelle (VM) est créée ou supprimée.

Le code de ce tutoriel est disponible dans un dépôt GitHub.

Ce tutoriel est destiné aux ingénieurs spécialisés dans les technologies DevOps et cloud. Nous partons du principe que vous connaissez Cloud Logging, Pub/Sub et Cloud Functions.

Les rapports sur l'état du DevOps identifient les capacités qui améliorent les performances de livraison de logiciels. Ce tutoriel vous permettra d'effectuer les opérations suivantes :

Architecture

Le schéma suivant montre les différents composants que vous utilisez dans ce tutoriel.

Architecture d'un système qui envoie des notifications après la prise d'instantanés de disque

Tout d'abord, créez un disque persistant et prenez un instantané de disque. Vous pouvez ensuite filtrer les événements de journal correspondant aux instantanés de disque réussis et les exporter en les publiant dans un sujet Pub/Sub. Une fonction Cloud lit le message du sujet et envoie une notification push à un webhook. Pour ce tutoriel, ce webhook est représenté par une fonction Cloud.

Objectifs

  • Configurez Cloud Logging pour exporter les événements sélectionnés vers Pub/Sub afin que Cloud Functions puisse les utiliser.
  • Déployez une fonction Cloud qui consomme les événements exportés par Cloud Logging, puis déclenche un webhook.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    Vous utilisez Cloud Shell pour exécuter toutes les commandes de ce tutoriel.

  4. Activez les API Compute Engine, Cloud Logging, Cloud Functions et Pub/Sub :

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

Préparer l'environnement

  1. Dans Cloud Shell, définissez la valeur par défaut gcloud pour la région et la zone Compute Engine que vous souhaitez utiliser pour ce tutoriel :

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

    Ce tutoriel utilise la région us-central1 et la zone us-central1-a. Vous pouvez modifier la région et la zone selon vos besoins. Pour plus d'informations, consultez la page Zones géographiques et régions.

  2. Définissez les variables d'environnement que vous utilisez pour ce tutoriel :

    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"
    

Créer des ressources

Dans cette section, vous créez les ressources Google Cloud suivantes pour ce tutoriel :

  • Sujet Pub/Sub
  • Récepteur Cloud Logging
  • Fonction Cloud

Créer un sujet Pub/Sub

  • Dans Cloud Shell, créez un sujet Pub/Sub pour publier les messages d'événement dans :

    gcloud pubsub topics create $PUBSUB_TOPIC
    

Créer un récepteur Cloud Logging pour Pub/Sub

Cloud Logging vous permet de stocker, rechercher et d'analyser des événements à partir de Google Cloud. Vous pouvez filtrer et exporter ces journaux vers Cloud Storage, BigQuery et Pub/Sub.

  1. Dans Cloud Shell, exportez les journaux générés par les instantanés de disque vers 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"'
    

    Le résultat contient l'adresse e-mail du compte de service utilisée par Cloud Logging lors de la publication des journaux dans le sujet Pub/Sub que vous avez créé précédemment. Cette adresse e-mail prend la forme SERVICE_ACCOUNT_NAME@gcp-sa-logging.iam.gserviceaccount.com.

  2. Copiez l'adresse e-mail du compte de service. Vous en aurez besoin dans la section suivante.

Configurer les autorisations

  • Dans Cloud Shell, accordez au compte de service le rôle IAM d'éditeur Pub/Sub (roles/pubsub.publisher) afin qu'il puisse publier des messages dans le sujet Pub/Sub :

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

    Remplacez SERVICE_ACCOUNT_EMAIL_ADDRESS par l'adresse e-mail que vous avez copiée dans la section précédente.

Créer un webhook

En règle générale, en production, vous êtes informé des événements Google Cloud importants par des notifications push envoyées à vos plates-formes de collaboration. La plupart de ces plates-formes proposent des webhooks. Dans ce tutoriel, vous créez une fonction Cloud pour simuler un webhook à partir de l'une de ces plates-formes. Cette fonction Cloud, qui est déclenchée via HTTP, imprime le contenu des messages reçus.

Par défaut, tout utilisateur ou service peut appeler une fonction Cloud HTTP. Vous pouvez configurer Identity and Access Management (IAM) sur des fonctions HTTP pour limiter ce comportement. Ainsi, votre fonction HTTP ne pourra être invoquée qu'en fournissant des identifiants d'authentification dans la requête.

  1. Dans Cloud Shell, clonez le dépôt Git contenant le code du tutoriel :

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. Passez au répertoire de travail :

    cd gcf-notification-forwarding/
    
  3. Déployez le webhook Cloud Functions webhookEmulator à l'aide d'un déclencheur HTTP :

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

    L'exécution de cette commande peut prendre jusqu'à deux minutes.

Créer une fonction Cloud pour les notifications push

Vous créez une fonction Cloud qui s'abonne au sujet Pub/Sub que vous avez créé précédemment en mode push. Ensuite, chaque fois que Cloud Logging exporte (ou transfère) un événement vers le sujet Pub/Sub, cette fonction Cloud est déclenchée. La fonction reçoit l'événement, le traite et le transmet au point de terminaison HTTP du webhook que vous avez créé précédemment.

  • Dans Cloud Shell, déployez la fonction Cloud :

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

Tester la configuration

Pour tester cette configuration, prenez un instantané de disque et vérifiez si le webhook reçoit le journal des événements généré par l'instantané du disque.

  1. Dans Cloud Shell, créez un disque persistant zonal. La valeur par défaut est un disque dur standard de 500 Go.

    gcloud compute disks create $DISK \
        --zone=$(gcloud config get-value compute/zone)
    
  2. Déclenchez la création d'un instantané du disque que vous avez créé précédemment :

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

    L'exécution de cette commande peut prendre jusqu'à deux minutes. Une fois l'instantané pris en compte, une entrée de journal d'activité d'administration est générée. Le journal des événements est filtré et transféré vers le sujet Pub/Sub. La fonction Cloud abonnée le récupère, le met en forme et le transmet au point de terminaison HTTP du webhook.

  3. Après quelques minutes, vérifiez si le webhook a reçu le journal des événements :

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

    Le résultat est semblable à celui-ci :

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

    Le résultat indique que le webhook a reçu la notification indiquant qu'un instantané de disque a été pris.

Nettoyer

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étapes suivantes