Funktionen über Logeinträge auslösen

Viele Google Cloud Ereignisse werden in Cloud-Audit-Logs protokolliert. Sie können diese Logs filtern und sie mithilfe von Senken an Pub/Sub-Themen weiterleiten. Diese Pub/Sub-Themen können dann Benachrichtigungen senden, die Cloud Run-Funktionen auslösen. Sie können benutzerdefinierte Ereignisse aus jedem Google Cloud Dienst erstellen, der Audit-Logs generiert.

Auf dieser Seite finden Sie ein Beispiel dafür, wie Funktionen über Protokolleinträge ausgelöst werden, die an ein Pub/Sub-Thema weitergeleitet werden.

Ereignisstruktur von durch Pub/Sub ausgelösten Funktionen

Wie alle durch Pub/Sub ausgelösten Funktionen erhalten Funktionen, die von Cloud Logging-Logeinträgen ausgelöst werden, ein PubsubMessage-Objekt, dessen data-Parameter ein base64-codierter String ist. Bei Cloud Logging-Logereignissen wird durch die Decodierung dieses Werts der relevante Logeintrag als JSON-String zurückgegeben.

Hinweise

Im Beispielcode werden Cloud-Audit-Logs an eine Cloud Run-Funktion weitergeleitet. Bevor Sie den Beispielcode ausführen, benötigen Sie Folgendes:

Im Leitfaden zu Pub/Sub-Triggern finden Sie Informationen zu den APIs, die Sie aktivieren müssen, und zu den erforderlichen Rollen für die Bereitstellung von Funktionen, die von Pub/Sub ausgelöst werden.

Beispielcode

Sie können eine durch Pub/Sub ausgelöste Funktion verwenden, um exportierte Cloud Logging-Logs zu erkennen und zu verarbeiten:

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

Funktion bereitstellen und auslösen

So konfigurieren Sie einen Trigger während der Funktionsbereitstellung:

  1. Führen Sie den folgenden Befehl in dem Verzeichnis aus, das den Beispielcode enthält, um die Funktion bereitzustellen:

    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
    

    Ersetzen Sie:

    • REGION mit der Google Cloud Region, in der Sie die Funktion bereitstellen möchten. Beispiel: us-central1

    • Das Flag --function gibt den Einstiegspunkt für die Funktion im Beispiel-Quellcode an. Dies ist der Code, der von Cloud Run ausgeführt wird, wenn Ihre Funktion ausgeführt wird. Der Wert dieses Flags muss ein Funktionsname oder ein voll qualifizierter Klassenname sein, der in Ihrem Quellcode vorhanden ist.

    • Das Flag --base-image gibt die Umgebung des Basis-Images für Ihre Funktion an. Weitere Informationen zu Basis-Images und den in den einzelnen Images enthaltenen Paketen finden Sie unter Laufzeit-Basis-Images.

  2. Führen Sie den folgenden Befehl aus, um einen Trigger zu erstellen, der Ereignisse filtert:

    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
    

    Ersetzen Sie:

    • TRIGGER_NAME durch den Namen des Triggers.

    • EVENTARC_TRIGGER_LOCATION mit dem Standort des Eventarc-Triggers. Im Allgemeinen sollte der Standort eines Eventarc-Triggers mit dem Standort der Google Cloud Ressource übereinstimmen, die Sie auf Ereignisse überwachen möchten. In den meisten Szenarien sollten Sie Ihre Funktion auch in derselben Region bereitstellen. Weitere Informationen zu Eventarc-Triggerstandorten finden Sie unter Informationen zu Eventarc-Standorten.

    • SERVICE durch den Namen der Funktion, die Sie bereitstellen.

    • REGION durch die Cloud Run-Region der Funktion.

    • PROJECT_NUMBER durch Ihre Google Cloud Projektnummer. Eventarc-Trigger sind mit Dienstkonten verknüpft, um sie beim Aufrufen Ihrer Funktion als Identität zu verwenden. Das Dienstkonto Ihres Eventarc-Triggers muss die Berechtigung zum Aufrufen Ihrer Funktion haben. Cloud Run verwendet standardmäßig das Compute-Standarddienstkonto.

    • Das Flag --event-filters gibt die Ereignisfilter an, die der Trigger überwacht. Ein Ereignis, das mit allen event-filters-Filtern übereinstimmt, löst Aufrufe Ihrer Funktion aus. Jeder Trigger muss einen unterstützten Ereignistyp haben. Der Ereignisfiltertyp kann nach dem Erstellen nicht mehr geändert werden. Wenn Sie den Ereignisfiltertyp ändern möchten, müssen Sie einen neuen Trigger erstellen und den alten löschen. Optional können Sie das Flag --event-filters mit einem unterstützten Filter im Format ATTRIBUTE=VALUE wiederholen, um weitere Filter hinzuzufügen.

Cloud-Logeintrag

Wenn ein Cloud-Logeintrag erstellt wird, der mit einem Ihrer Filter übereinstimmt, sollten die entsprechenden Logeinträge für Ihre Funktion in der Google Cloud Console so aussehen:

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