Attivare le funzioni dalle voci di log

Cloud Audit Logs registra eventi in molti servizi Google Cloud . Utilizzando i sink, puoi filtrare questi log e inoltrarli ad argomenti Pub/Sub che attivano Cloud Run Functions. In questo modo puoi rispondere agli eventi di qualsiasi servizioGoogle Cloud che produce audit log.

Questa pagina mostra un esempio di come richiamare funzioni da voci di log indirizzate a un argomento Pub/Sub. Questo tutorial utilizza i trigger Eventarc, ma in alternativa puoi utilizzare i trigger Pub/Sub diretti per attivare la funzione.

Struttura degli eventi delle funzioni attivate da Pub/Sub

Le funzioni attivate dalle voci di log di Cloud Logging ricevono un oggetto PubsubMessage il cui parametro data è una stringa codificata in base64. Per gli eventi di log di Cloud Logging, la decodifica di questo valore restituisce la voce di log pertinente come stringa JSON.

Prima di iniziare

Il codice campione inoltra Cloud Audit Logs a una funzione Cloud Run. Prima di eseguire il codice campione, devi disporre di quanto segue:

Consulta la guida ai trigger Pub/Sub per le API da abilitare e i ruoli richiesti per il deployment delle funzioni attivate da Pub/Sub.

Codice campione

Puoi utilizzare una funzione attivata da Pub/Sub per rilevare e rispondere ai log di Cloud Logging esportati:

Node.js

exports.processLogEntry = data => {
  const dataBuffer = Buffer.from(data.data, 'base64');

  const logEntry = JSON.parse(dataBuffer.toString('ascii')).protoPayload;
  console.log(`Method: ${logEntry.methodName}`);
  console.log(`Resource: ${logEntry.resourceName}`);
  console.log(`Initiator: ${logEntry.authenticationInfo.principalEmail}`);
};

Python

import base64
import json

def process_log_entry(data, context):
    data_buffer = base64.b64decode(data["data"])
    log_entry = json.loads(data_buffer)["protoPayload"]

    print(f"Method: {log_entry['methodName']}")
    print(f"Resource: {log_entry['resourceName']}")
    print(f"Initiator: {log_entry['authenticationInfo']['principalEmail']}")

Go


// Package log contains examples for handling Cloud Functions logs.
package log

import (
	"context"
	"log"
)

// PubSubMessage is the payload of a Pub/Sub event.
// See the documentation for more details:
// https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// ProcessLogEntry processes a Pub/Sub message from Cloud Logging.
func ProcessLogEntry(ctx context.Context, m PubSubMessage) error {
	log.Printf("Log entry data: %s", string(m.Data))
	return nil
}

Java


import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;
import functions.eventpojos.PubsubMessage;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.logging.Logger;

public class StackdriverLogging implements BackgroundFunction<PubsubMessage> {
  private static final Logger logger = Logger.getLogger(StackdriverLogging.class.getName());

  @Override
  public void accept(PubsubMessage message, Context context) {
    String name = "World";

    if (!message.getData().isEmpty()) {
      name = new String(Base64.getDecoder().decode(
          message.getData().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
    }
    String res = String.format("Hello, %s", name);
    logger.info(res);
  }
}

Esegui il deployment e attiva una funzione

Per configurare un trigger durante il deployment della funzione:

  1. Esegui questo comando nella directory che contiene il codice campione per eseguire il deployment della funzione:

    Node.js

    gcloud run deploy nodejs-log-function \
          --source . \
          --function processLogEntry \
          --base-image nodejs20 \
          --region REGION
    

    Python

    gcloud run deploy python-log-function \
          --source . \
          --function process_log_entry \
          --base-image python312 \
          --region REGION
    

    Go

    gcloud run deploy go-log-function \
          --source . \
          --function ProcessLogEntry \
          --base-image go122 \
          --region REGION
    

    Java

    gcloud run deploy java-log-function \
          --source . \
          --function StackdriverLogging \
          --base-image java21 \
          --region REGION
    

    Sostituisci quanto segue:

    • REGION: la regione Google Cloud in cui vuoi eseguire il deployment della funzione. Ad esempio europe-west1.
    • Il flag --function specifica l'entry point della funzione nel codice sorgente di esempio. Questo è il codice che Cloud Run esegue quando viene eseguita la funzione. Il valore di questo flag deve essere un nome di funzione o un nome di classe completo esistente nel codice sorgente.
    • Il flag --base-image specifica l'ambiente dell'immagine di base per la tua funzione. Per maggiori dettagli sulle immagini di base e sui pacchetti inclusi in ogni immagine, consulta Immagini di base dei runtime.
  2. Esegui questo comando per creare un trigger che filtra gli eventi:

    gcloud eventarc triggers create TRIGGER_NAME  \
        --location=EVENTARC_TRIGGER_LOCATION \
        --destination-run-service=SERVICE  \
        --destination-run-region=REGION \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_NAME \
        --service-account=PROJECT_NUMBER-compute@
    

    Sostituisci quanto segue:

    • TRIGGER_NAME: il nome del trigger.
    • EVENTARC_TRIGGER_LOCATION: la località del trigger Eventarc. In generale, la località di un trigger Eventarc deve corrispondere alla località della risorsaGoogle Cloud che vuoi monitorare per gli eventi. Nella maggior parte degli scenari, devi eseguire il deployment della funzione nella stessa regione. Per ulteriori dettagli sulle località dei trigger Eventarc, consulta Informazioni sulle località Eventarc.
    • SERVICE: il nome della funzione di cui stai eseguendo il deployment.
    • REGION: la regione Cloud Run in cui hai eseguito il deployment della funzione.
    • PROJECT_NUMBER: il tuo numero di progetto Google Cloud . I trigger Eventarc sono collegati ai service account da utilizzare come identità quando richiami la funzione. Il account di servizio del trigger Eventarc deve disporre dell'autorizzazione per richiamare la funzione. Per impostazione predefinita, Cloud Run utilizza l'account di servizio Compute predefinito.
    • Il flag --event-filters specifica i filtri degli eventi monitorati dal trigger. Quando un evento corrisponde a tutti i filtri, attiva una chiamata alla funzione. Ogni trigger deve avere un tipo di evento supportato. Non puoi modificare il tipo di filtro degli eventi dopo la creazione. Per modificare il tipo di filtro degli eventi, devi creare un nuovo trigger ed eliminare quello precedente. Se vuoi, puoi ripetere il flag --event-filters con un filtro supportato nel formato ATTRIBUTE=VALUE per aggiungere altri filtri.
    • TOPIC_NAME: il nome dell'argomento Pub/Sub che riceve gli eventi voce di log.
    • Il flag --transport-topic specifica l'argomento Pub/Sub utilizzato da Eventarc per trasportare gli eventi alla tua funzione. Tieni presente che questo flag non è obbligatorio se non hai creato in precedenza un argomento Pub/Sub.

Voce di log di Cloud

Quando viene creata una voce di log Cloud che corrisponde a uno dei tuoi filtri, le voci di log corrispondenti per la tua funzione nella consoleGoogle Cloud dovrebbero essere simili alle seguenti:

Method: METHOD
Resource: projects/YOUR_GCLOUD_PROJECT/...
Initiator: YOUR_EMAIL_ADDRESS