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

Cloud Audit Logs enregistre les événements de nombreux services Google Cloud . À l'aide de récepteurs, vous pouvez filtrer ces journaux et les transférer vers des sujets Pub/Sub qui déclenchent des fonctions Cloud Run. Cela vous permet de répondre aux événements de n'importe quel serviceGoogle Cloud qui génère des journaux d'audit.

Cette page montre un exemple d'appel de fonctions à partir d'entrées de journal acheminées vers un sujet Pub/Sub. Ce tutoriel utilise des déclencheurs Eventarc, mais vous pouvez également utiliser des déclencheurs Pub/Sub directs pour déclencher votre fonction.

Structure d'événement des 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 journal Cloud Logging, le décodage de cette valeur renvoie l'entrée de journal correspondante sous forme de 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 aurez besoin des éléments suivants :

Consultez le guide sur les 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. Exécutez la commande suivante dans le répertoire contenant l'exemple de code pour déployer votre fonction :

    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
    

    Remplacez les éléments suivants :

    • REGION : région Google Cloud dans laquelle vous souhaitez déployer votre fonction. Par exemple, europe-west1.
    • L'option --function spécifie le point d'entrée de la fonction dans l'exemple de code source. Il s'agit du code que Cloud Run exécute lors de l'exécution de votre fonction. 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 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" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_NAME \
        --service-account=PROJECT_NUMBER-compute@
    

    Remplacez les éléments suivants :

    • TRIGGER_NAME : nom de votre déclencheur.
    • EVENTARC_TRIGGER_LOCATION : l'emplacement du déclencheur Eventarc. En général, l'emplacement d'un déclencheur Eventarc doit correspondre à celui de la ressourceGoogle 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 : nom de la fonction que vous déployez.
    • REGION : région Cloud Run dans laquelle vous avez déployé votre fonction.
    • PROJECT_NUMBER : 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. Lorsqu'un événement correspond à tous les filtres d'événement, il déclenche un appel 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énement après sa création. Pour modifier le type de filtre d'événement, vous devez créer un 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.
    • TOPIC_NAME : nom du sujet Pub/Sub qui reçoit les événements d'entrée de journal.
    • L'option --transport-topic spécifie le sujet Pub/Sub qu'Eventarc utilise pour transporter les événements vers votre fonction. Notez que cette option n'est pas obligatoire si vous n'avez pas créé de sujet Pub/Sub auparavant.

Entrée de journal cloud

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

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