Activadores secundarios con Cloud Logging

Muchos eventos de Google Cloud Platform se encuentran en los registros de auditoría de Cloud. Puedes filtrar estos registros y reenviarlos a los temas de Pub/Sub mediante receptores. Luego, estos temas de Pub/Sub pueden enviar notificaciones que activan funciones de Cloud Functions. Esto te permite crear eventos personalizados desde cualquier servicio de Google Cloud Platform que produzca registros de auditoría.

Configuración

Para ejecutar la muestra que se encuentra a continuación, necesitarás un tema de Pub/Sub y un receptor de Cloud Logging. La muestra los usa para desviar registros de auditoría de Cloud a una función de Cloud Functions.

Estructura de eventos

Como ocurre con todas las funciones activadas por Pub/Sub, las que se activan mediante entradas de registro de Cloud reciben un objeto PubsubMessage cuyo parámetro data es una string codificada en base64. En el caso de los eventos de registro de Cloud, la decodificación de este valor muestra la entrada de registro pertinente como una string JSON.

Código de muestra

Puedes usar una función activada por Pub/Sub como la que se muestra a continuación para detectar registros de Cloud 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 com.google.events.cloud.pubsub.v1.Message;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.logging.Logger;

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

  @Override
  public void accept(Message 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 una función

Usa el siguiente comando para implementar la función:

Node.js

gcloud functions deploy processLogEntry \
--runtime nodejs10 \
--trigger-topic YOUR_PUBSUB_TOPIC
Puedes usar los siguientes valores para que la marca --runtime especifique tu versión preferida de Node.js:
  • nodejs10
  • nodejs12
  • nodejs14 (vista previa pública)

Python

gcloud functions deploy process_log_entry \
--runtime python38 \
--trigger-topic YOUR_PUBSUB_TOPIC
Puedes usar los siguientes valores para que la marca --runtime especifique tu versión preferida de Python:
  • python37
  • python38
  • python39 (vista previa pública)

Comienza a usarlo

gcloud functions deploy ProcessLogEntry \
--runtime go113 \
--trigger-topic YOUR_PUBSUB_TOPIC
Puedes usar los siguientes valores en la marca --runtime para especificar tu versión preferida de Go:
  • go111 (obsoleta)
  • go113

Java

gcloud functions deploy java-log-function \
--entry-point StackdriverLogging \
--runtime java11 \
--memory 512MB \
--trigger-topic YOUR_PUBSUB_TOPIC

Activa una función

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

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