Déclencheurs secondaires avec Cloud Logging

De nombreux événements Google Cloud sont consignés dans Cloud Audit Logs. Vous pouvez filtrer ces journaux et les transférer vers des sujets Pub/Sub à l'aide de récepteurs. Ces sujets Pub/Sub peuvent ensuite envoyer des notifications qui déclenchent Cloud Run Functions. Cela vous permet de créer des événements personnalisés à partir de n'importe quel service Google Cloud qui génère des journaux d'audit.

Configuration

Pour exécuter l'exemple de ce document, vous avez besoin d'un sujet Pub/Sub et d'un récepteur Cloud Logging. Ils serviront à transférer les journaux Cloud Audit Logs vers Cloud Run Functions.

Structure de l'événement

Comme toutes les fonctions déclenchées par Pub/Sub, les fonctions déclenchées par les entrées de journal Cloud reçoivent un objet PubsubMessage dont le paramètre data est une chaîne encodée en base64. Pour les événements de journaux Cloud, le décodage de cette valeur renvoie l'entrée de journal correspondante sous forme de chaîne JSON.

Exemple de code

Vous pouvez utiliser une fonction déclenchée par Pub/Sub pour détecter les journaux cloud exportés et y répondre :

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

Déployer une fonction

Saisissez la commande suivante pour déployer la fonction :

Node.js

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

Utilisez l'option --runtime pour spécifier l'ID d'exécution d'une version Node.js compatible pour exécuter votre fonction.

Python

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

Utilisez l'option --runtime pour spécifier l'ID d'exécution d'une version Python compatible pour exécuter votre fonction.

Go

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

Utilisez l'option --runtime pour spécifier l'ID d'exécution d'une version Go compatible pour exécuter votre fonction.

Java

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

Utilisez l'option --runtime pour spécifier l'ID d'exécution d'une version Java compatible pour exécuter votre fonction.

Déclencher une fonction

Lorsqu'une entrée de journal Cloud qui correspond à l'un de vos filtres est créée, vous devriez voir les entrées de journal correspondantes pour votre fonction :

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