Activadores de terceros con Cloud Logging

En Registros de auditoría de Cloud se registran muchos Google Cloud eventos. Puedes filtrar estos registros y reenviarlos a temas de Pub/Sub mediante receptores. Estos temas de Pub/Sub pueden enviar notificaciones que activan funciones de Cloud Run. De esta forma, puedes crear eventos personalizados a partir de cualquier servicio que genere registros de auditoría. Google Cloud

Configuración

Para ejecutar el ejemplo de este documento, necesitas un tema de Pub/Sub y un receptor de Cloud Logging. En el ejemplo se usan para reenviar registros de auditoría de Cloud a una función de Cloud Run.

Estructura de eventos

Al igual que todas las funciones activadas por Pub/Sub, las funciones activadas por entradas de registro de Cloud reciben un objeto PubsubMessage cuyo parámetro data es una cadena codificada en base64. En el caso de los eventos de registro de Cloud, al decodificar este valor se devuelve la entrada de registro correspondiente como una cadena JSON.

Código de muestra

Puedes usar una función activada por Pub/Sub para detectar y responder a los registros de Cloud exportados:

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

Desplegar una función

Usa el siguiente comando para desplegar la función:

Node.js

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

Usa la marca --runtime para especificar el ID del entorno de ejecución de una versión compatible de Node.js para ejecutar tu función.

Python

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

Usa la marca --runtime para especificar el ID de tiempo de ejecución de una versión de Python compatible para ejecutar tu función.

Go

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

Usa la marca --runtime para especificar el ID de tiempo de ejecución de una versión de Go compatible para ejecutar tu función.

Java

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

Usa la marca --runtime para especificar el ID de tiempo de ejecución de una versión de Java compatible para ejecutar tu función.

Activar una función

Cuando se crea una entrada de registro de Cloud que coincide con uno de tus filtros, deberías ver las entradas de registro correspondientes de tu función:

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