Activa funciones desde entradas de registro

Los Registros de auditoría de Cloud registran eventos en muchos servicios de Google Cloud . Con los receptores, puedes filtrar estos registros y reenviarlos a temas de Pub/Sub que activan funciones de Cloud Run. Esto te permite responder a eventos de cualquier servicio deGoogle Cloud que produzca registros de auditoría.

En esta página, se muestra un ejemplo de cómo invocar funciones desde entradas de registro enrutadas a un tema de Pub/Sub. En este instructivo, se usan activadores de Eventarc, pero también puedes usar activadores directos de Pub/Sub cuando activas tu función.

Estructura de eventos de las funciones activadas por Pub/Sub

Las funciones activadas por las entradas de registro de Cloud Logging reciben un objeto PubsubMessage cuyo parámetro data es una cadena codificada en base64. Para los eventos de registro de Cloud Logging, decodificar este valor devuelve la entrada de registro correspondiente como una cadena JSON.

Antes de comenzar

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

Consulta la guía de activadores de Pub/Sub para conocer las APIs que debes habilitar y los roles necesarios para implementar funciones que se activan con Pub/Sub.

Código de muestra

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

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

Implementa y activa una función

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

  1. Ejecuta el siguiente comando en el directorio que contiene el código de muestra para implementar 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
    

    Reemplaza lo siguiente:

    • REGION: Es la región de Google Cloud en la que deseas implementar tu función. Por ejemplo, europe-west1
    • La marca --function especifica el punto de entrada a la función en el código fuente de ejemplo. Este es el código que Cloud Run ejecuta cuando se ejecuta tu función. El valor de esta marca debe ser un nombre de función o un nombre de clase completamente calificado que exista en tu código fuente.
    • La marca --base-image especifica el entorno de la imagen base para tu función. Para obtener más detalles 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" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_NAME \
        --service-account=PROJECT_NUMBER-compute@
    

    Reemplaza lo siguiente:

    • TRIGGER_NAME: el nombre del activador.
    • EVENTARC_TRIGGER_LOCATION: Es la ubicación del activador de Eventarc. En general, la ubicación de un activador de Eventarc debe coincidir con la ubicación del recurso deGoogle Cloud que deseas supervisar para detectar eventos. En la mayoría de los casos, también debes implementar tu función en la misma región. Consulta Información sobre las ubicaciones de Eventarc para obtener más detalles sobre las ubicaciones de activadores de Eventarc.
    • SERVICE: Es el nombre de la función que estás implementando.
    • REGION: la región de Cloud Run en la que implementaste la función.
    • PROJECT_NUMBER: Es el número del proyecto de Google Cloud . Los activadores de Eventarc están vinculados a cuentas de servicio para usarlos como identidad cuando se invoca la función. La cuenta de servicio del activador de Eventarc debe tener permiso para invocar tu función. De forma predeterminada, Cloud Run usa la cuenta de servicio de procesamiento predeterminada.
    • La marca --event-filters especifica los filtros de eventos que supervisa el activador. Cuando un evento coincide con todos los filtros de eventos, se activa una llamada a tu función. Cada activador debe tener un tipo de evento compatible. No puedes cambiar el tipo de filtro de eventos después de la creación. Para cambiar el tipo de filtro de eventos, debes crear un activador nuevo y borrar el anterior. De manera opcional, puedes repetir la marca --event-filters con un filtro compatible en el formato ATTRIBUTE=VALUE para agregar más filtros.
    • TOPIC_NAME: Es el nombre del tema de Pub/Sub que recibe los eventos de entrada de registro.
    • La marca --transport-topic especifica el tema de Pub/Sub que Eventarc usa para transportar eventos a tu función. Ten en cuenta que esta marca no es obligatoria si no creaste un tema de Pub/Sub con anterioridad.

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 para tu función en la consola deGoogle Cloud deberían verse de la siguiente manera:

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