Trigger di seconde parti con Cloud Logging

Molti eventi Google Cloud vengono registrati negli audit log di Cloud. Puoifiltrare questi log e inoltrarli agli argomenti Pub/Sub utilizzando destinazioni. Questi argomenti Pub/Sub possono quindi inviare notifiche che attivano le funzioni Cloud Run. In questo modo puoi creare eventi personalizzati da qualsiasi servizio Google Cloud che genera audit log.

Configurazione

Per eseguire l'esempio in questo documento, devi avere un argomento Pub/Sub e un destinazione di Cloud Logging. L'esempio li utilizza per inoltrare Cloud Audit Logs a una funzione Cloud Run.

Struttura evento

Come tutte le funzioni attivate da Pub/Sub, le funzioni attivate dalle voci di log di Cloud ricevono un oggetto PubsubMessage il cui parametro data è una stringa codificata in base64. Per gli eventi dei log Cloud, la decodifica di questo valore restituisce la voce di log pertinente come stringa JSON.

Codice di esempio

Puoi utilizzare una funzione attivata da Pub/Sub per rilevare e rispondi ai log di Cloud 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']}")

Vai


// 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);
  }
}

Eseguire il deployment di una funzione

Utilizza questo comando per eseguire il deployment della funzione:

Node.js

gcloud functions deploy processLogEntry \
--runtime nodejs20 \
--trigger-topic YOUR_PUBSUB_TOPIC/
FLAGS...

Utilizza il flag --runtime per specificare l'ID runtime di una versione di Node.js supportata per eseguire la funzione.

Python

gcloud functions deploy process_log_entry \
--runtime python312 \
--trigger-topic YOUR_PUBSUB_TOPIC/
FLAGS...

Utilizza la --runtime per specificare l'ID runtime di un versione Python supportata per l'esecuzione la tua funzione.

Vai

gcloud functions deploy ProcessLogEntry \
--runtime go121 \
--trigger-topic YOUR_PUBSUB_TOPIC/
FLAGS...

Utilizza la --runtime per specificare l'ID runtime di un versione Go supportata per l'esecuzione la tua funzione.

Java

gcloud functions deploy java-log-function \
--entry-point StackdriverLogging \
--runtime java17 \
--memory 512MB \
--trigger-topic YOUR_PUBSUB_TOPIC/
FLAGS...

Utilizza il flag --runtime per specificare l'ID runtime di una versione Java supportata per eseguire la funzione.

Attivazione di una funzione

Quando viene creata una voce di log di Cloud corrispondente a uno dei tuoi filtri, dovresti vedere le voci di log corrispondenti per la tua funzione:

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