Invio di notifiche per gli eventi di Google Cloud


Questo tutorial è rivolto ai team DevOps che vogliono ricevere notifiche per importanti eventi Google Cloud inviati alle proprie piattaforme di collaborazione, ad esempio Google Chat, Slack o Microsoft Teams. Le notifiche liberano i team dal dover accedere regolarmente alla console Google Cloud per verificare la disponibilità di aggiornamenti sugli eventi.

Come esempio per questo tutorial, le notifiche vengono generate dopo aver acquisito snapshot del disco. L'acquisizione di uno istantanea del disco esegue il backup dei dati dei dischi permanenti a livello di zona o di regione. Puoi modificare questo tutorial in modo da eseguire automaticamente il push delle notifiche ai tuoi sistemi di collaborazione quando si verificano altri eventi Google Cloud importanti, ad esempio quando viene creata o eliminata un'istanza di macchina virtuale (VM).

Il codice per questo tutorial è disponibile in un repository di GitHub.

Questo tutorial è destinato a ingegneri specializzati in DevOps e tecnologia cloud. per cui hai familiarità con Cloud Logging, Pub/Sub e Cloud Functions.

Lo stato State of DevOps segnala le funzionalità identificate che favoriscono le prestazioni relative alla distribuzione del software. Questo tutorial ti aiuterà a utilizzare le seguenti funzionalità:

Architettura

Il seguente diagramma mostra i diversi componenti utilizzati in questo tutorial.

Architettura di un sistema che invia notifiche push dopo l'acquisizione degli snapshot del disco.

Per prima cosa, crei un disco permanente e acquisisci uno snapshot del disco. Quindi, filtra gli eventi di log che corrispondono agli snapshot dei dischi riusciti ed esporti gli eventi pubblicandoli in un argomento Pub/Sub. Una funzione Cloud Functions legge il messaggio dall'argomento e invia una notifica push a un webhook. Per questo tutorial, questo webhook è rappresentato da una Cloud Function.

Obiettivi

  • Configura Cloud Logging per esportare gli eventi selezionati in Pub/Sub in modo che Cloud Functions possa utilizzarli.
  • Esegui il deployment di una Cloud Function che utilizza gli eventi esportati da Cloud Logging e quindi attiva un webhook.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  3. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Userai Cloud Shell per eseguire tutti i comandi di questo tutorial.

  4. Abilita le API Compute Engine, Cloud Logging, Cloud Functions e Pub/Sub:

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

Preparazione dell'ambiente

  1. In Cloud Shell, imposta il valore predefinito di gcloud per la regione e la zona di Compute Engine che vuoi utilizzare per questo tutorial:

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

    Questo tutorial utilizza la regione us-central1 e la zona us-central1-a. Puoi cambiare la regione e la zona in base alle tue esigenze. Per ulteriori informazioni, consulta Area geografica e regioni.

  2. Definisci le variabili di ambiente che utilizzi per questo 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"
    

Crea le risorse

In questa sezione creerai le seguenti risorse Google Cloud per questo tutorial:

  • Argomento Pub/Sub
  • Sink Cloud Logging
  • Funzione Cloud Functions Functions

crea un argomento Pub/Sub

  • In Cloud Shell, crea un argomento Pub/Sub per pubblicare messaggi evento in:

    gcloud pubsub topics create $PUBSUB_TOPIC
    

crea un sink di Cloud Logging in Pub/Sub

Cloud Logging ti consente di archiviare, cercare e analizzare eventi di Google Cloud. Puoi filtrare ed esportare questi log in Cloud Storage, BigQuery e Pub/Sub.

  1. In Cloud Shell, esporta i log generati dagli snapshot del disco in 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"'
    

    L'output contiene l'indirizzo email dell'account di servizio che Cloud Logging utilizza quando pubblica i log nell'argomento Pub/Sub che hai creato in precedenza. Questo indirizzo email assuma la forma di SERVICE_ACCOUNT_NAME@gcp-sa-logging.iam.gserviceaccount.com.

  2. Copia l'indirizzo email dell'account di servizio. Ti servirà nella prossima sezione.

Configurare le autorizzazioni

  • In Cloud Shell, concedi all'account di servizio il ruolo IAM Publisher Pub/Sub (roles/pubsub.publisher) in modo che possa pubblicare messaggi nell'argomento Pub/Sub:

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

    Sostituisci SERVICE_ACCOUNT_EMAIL_ADDRESS con l'indirizzo email che hai copiato nella sezione precedente.

Crea un webhook

In genere, in produzione, ricevi notifiche push di eventi importanti di Google Cloud alle tue piattaforme di collaborazione. La maggior parte di queste piattaforme offre webhook. In questo tutorial creerai una Cloud Function per simulare un webhook da una di queste piattaforme. Questa Cloud Function, che viene attivata tramite HTTP, stampa i contenuti dei messaggi ricevuti.

Per impostazione predefinita, qualsiasi utente o servizio può richiamare una funzione Cloud Functions HTTP. Puoi configurare Identity and Access Management (IAM) sulle funzioni HTTP per limitare questo comportamento in modo che la funzione HTTP possa essere richiamata solo fornendo le credenziali di autenticazione nella richiesta.

  1. In Cloud Shell, clona il repository Git che contiene il codice tutorial:

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. Passa alla directory di lavoro:

    cd gcf-notification-forwarding/
    
  3. Esegui il deployment del webhook webhookEmulator della funzione Cloud Function utilizzando un trigger HTTP:

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

    Il completamento di questo comando può richiedere fino a due minuti.

crea una Cloud Function per le notifiche push

Creerai una Cloud Function che sottoscrive l'argomento Pub/Sub creato in precedenza in modalità push. Quindi, ogni volta che Cloud Logging esporta (o esegue il push) di un evento nell'argomento Pub/Sub, questa Cloud Function viene attivata. La funzione riceve l'evento, lo elabora e lo invia all'endpoint HTTP del webhook che hai creato in precedenza.

  • In Cloud Shell, esegui il deployment della Cloud Function:

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

Test della configurazione

Per testare questa configurazione, acquisisci uno snapshot del disco e controlla se il webhook riceve il log eventi generato dallo snapshot del disco.

  1. In Cloud Shell, crea un disco permanente a livello di zona. Il valore predefinito è un disco rigido standard da 500 GB.

    gcloud compute disks create $DISK \
        --zone=$(gcloud config get-value compute/zone)
    
  2. Attiva la creazione di uno snapshot del disco che hai creato in precedenza:

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

    Il completamento di questo comando può richiedere fino a due minuti. Dopo aver acquisito lo snapshot, viene generata una voce di log delle attività di amministrazione. Il log eventi viene filtrato e ne viene eseguito il push all'argomento Pub/Sub. La funzione Cloud Function sottoscritta la prende, la formatta e ne esegue il push all'endpoint HTTP del webhook.

  3. Dopo alcuni minuti, controlla se il webhook ha ricevuto il log eventi:

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

    L'output è simile al seguente:

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

    L'output mostra che il webhook ha ricevuto la notifica che indica che è stato eseguito un'istantanea del disco.

Esegui la pulizia

Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi