Déclencher des fonctions à partir d'entrées de journal

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. Vous pouvez créer des événements personnalisés à partir de n'importe quel service Google Cloud qui génère des journaux d'audit.

Cette page montre comment déclencher des fonctions à partir d'entrées de journal acheminées vers un sujet Pub/Sub.

Structure des événements des fonctions déclenchées par Pub/Sub

Comme toutes les fonctions déclenchées par Pub/Sub, les fonctions déclenchées par les entrées de journal Cloud Logging 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 Logging, le décodage de cette valeur renvoie l'entrée de journal appropriée sous la forme d'une chaîne JSON.

Avant de commencer

L'exemple de code transfère les journaux Cloud Audit Logs vers une fonction Cloud Run. Avant d'exécuter l'exemple de code, vous devez disposer des éléments suivants:

Consultez le guide des déclencheurs Pub/Sub pour connaître les API à activer et les rôles requis pour déployer des fonctions déclenchées par Pub/Sub.

Exemple de code

Vous pouvez utiliser une fonction déclenchée par Pub/Sub pour détecter les journaux Cloud Logging 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 et déclencher une fonction

Pour configurer un déclencheur lors du déploiement de la fonction:

  1. Pour déployer votre fonction, exécutez la commande suivante dans le répertoire contenant l'exemple de code:

    Node.js

    gcloud beta run deploy nodejs-log-function \
          --source . \
          --function processLogEntry \
          --base-image nodejs20 \
          --region REGION
    

    Python

    gcloud beta run deploy python-log-function \
          --source . \
          --function process_log_entry \
          --base-image python312 \
          --region REGION
    

    Go

    gcloud beta run deploy go-log-function \
          --source . \
          --function ProcessLogEntry \
          --base-image go122 \
          --region REGION
    

    Java

    gcloud beta run deploy java-log-function \
          --source . \
          --function StackdriverLogging \
          --base-image java21 \
          --region REGION
    

    Remplacez :

    • REGION par la région Google Cloud dans laquelle vous souhaitez déployer votre fonction. Par exemple, us-central1.

    • L'option --function spécifie le point d'entrée de la fonction dans un exemple de code source. Il s'agit du code exécuté par Cloud Run lorsque votre fonction s'exécute. La valeur de cette option doit être un nom de fonction ou un nom de classe complet qui existe dans votre code source.

    • L'option --base-image spécifie l'environnement d'image de base de votre fonction. Pour en savoir plus sur les images de base et les packages inclus dans chaque image, consultez la section Images de base des environnements d'exécution.

  2. Exécutez la commande suivante pour créer un déclencheur qui filtre les événements:

    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
    

    Remplacez :

    • TRIGGER_NAME par le nom de votre déclencheur.

    • EVENTARC_TRIGGER_LOCATION par l'emplacement du déclencheur Eventarc. En général, l'emplacement d'un déclencheur Eventarc doit correspondre à celui de la ressource Google Cloud dont vous souhaitez surveiller les événements. Dans la plupart des scénarios, vous devez également déployer votre fonction dans la même région. Consultez la section Comprendre les emplacements Eventarc pour en savoir plus sur les emplacements des déclencheurs Eventarc.

    • SERVICE par le nom de la fonction que vous déployez.

    • REGION par la région Cloud Run de la fonction.

    • PROJECT_NUMBER par le numéro de votre projet Google Cloud Les déclencheurs Eventarc sont associés à des comptes de service, destinés à être utilisés comme identité lors de l'appel de votre fonction. Le compte de service de votre déclencheur Eventarc doit être autorisé à appeler votre fonction. Par défaut, Cloud Run utilise le compte de service Compute par défaut.

    • L'option --event-filters spécifie les filtres d'événements que le déclencheur surveille. Un événement correspondant à tous les filtres event-filters déclenche des appels vers votre fonction. Chaque déclencheur doit avoir un type d'événement compatible. Vous ne pouvez pas modifier le type de filtre d'événements après sa création. Pour modifier le type de filtre d'événement, vous devez créer un nouveau déclencheur et supprimer l'ancien. Facultatif : vous pouvez répéter l'option --event-filters avec un filtre compatible au format ATTRIBUTE=VALUE pour ajouter d'autres filtres.

Entrée de journal Cloud

Lorsqu'une entrée de journal Cloud qui correspond à l'un de vos filtres est créée, les entrées de journal correspondantes pour votre fonction dans la console Google Cloud doivent se présenter comme suit:

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