Activar funciones a partir de entradas de registro

En los 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. Puedes crear eventos personalizados a partir de cualquier servicio que genere Google Cloud registros de auditoría.

En esta página se muestra un ejemplo de cómo activar funciones a partir de entradas de registro enrutadas a un tema de Pub/Sub.

Estructura de eventos de funciones activadas por Pub/Sub

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

Antes de empezar

El código de ejemplo reenvía los registros de auditoría de Cloud a una función de Cloud Run. Antes de ejecutar el código de ejemplo, necesitarás lo siguiente:

Consulta la guía de activadores de Pub/Sub para ver las APIs que debes habilitar y los roles necesarios para implementar funciones activadas por Pub/Sub.

Código de muestra

Puedes usar una función activada por Pub/Sub para detectar y responder a los registros de Cloud Logging 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 y activar una función

Para configurar un activador durante la implementación de una función, siga estos pasos:

  1. Ejecuta el siguiente comando en el directorio que contiene el código de muestra para desplegar tu función:

    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
    

    Sustituye:

    • REGION por la Google Cloud región en la que quieras desplegar tu función. Por ejemplo, europe-west1.

    • La marca --function especifica el punto de entrada de la función en el código fuente de ejemplo. Este es el código que ejecuta Cloud Run cuando se ejecuta tu función. El valor de esta marca debe ser un nombre de función o un nombre de clase completo que exista en el código fuente.

    • La marca --base-image especifica el entorno de imagen base de tu función. Para obtener más información sobre las imágenes base y los paquetes incluidos en cada imagen, consulta Imágenes base de los entornos de ejecución.

  2. Ejecuta el siguiente comando para crear un activador que filtre eventos:

    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" \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Sustituye:

    • TRIGGER_NAME con el nombre del activador.

    • EVENTARC_TRIGGER_LOCATION con la ubicación del activador de Eventarc. Por lo general, la ubicación de un activador de Eventarc debe coincidir con la ubicación del Google Cloud recurso que quieras monitorizar para detectar eventos. En la mayoría de los casos, también debes implementar tu función en la misma región. Consulta ¿Qué son las ubicaciones de Eventarc? para obtener más información sobre las ubicaciones de los activadores de Eventarc.

    • SERVICE con el nombre de la función que vas a implementar.

    • REGION con la región de Cloud Run de la función.

    • PROJECT_NUMBER con el número de tu proyecto Google Cloud . Los activadores de Eventarc están vinculados a cuentas de servicio para usarse como identidad al invocar tu función. La cuenta de servicio de tu activador de Eventarc debe tener permiso para invocar tu función. De forma predeterminada, Cloud Run usa la cuenta de servicio de Compute predeterminada.

    • La marca --event-filters especifica los filtros de eventos que monitoriza el activador. Un evento que coincida con todos los event-filters y filtros activa llamadas a tu función. Cada activador debe tener un tipo de evento admitido. No puedes cambiar el tipo de filtro de eventos después de crearlo. Para cambiar el tipo de filtro de eventos, debes crear un nuevo activador y eliminar el antiguo. Opcionalmente, puedes repetir la marca --event-filters con un filtro admitido en el formulario ATTRIBUTE=VALUE para añadir más filtros.

Entrada de registro de Cloud

Cuando se crea una entrada de registro de Cloud que coincide con uno de tus filtros, las entradas de registro correspondientes de tu función en la consolaGoogle Cloud deberían tener el siguiente aspecto:

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