Funktionen über Logeinträge auslösen

Cloud-Audit-Logs zeichnet Ereignisse in vielen Google Cloud -Diensten auf. Mithilfe von Senken können Sie diese Logs filtern und an Pub/Sub-Themen weiterleiten, die Cloud Run-Funktionen auslösen. So können Sie auf Ereignisse von jedemGoogle Cloud -Dienst reagieren, der Audit-Logs erstellt.

Auf dieser Seite finden Sie ein Beispiel für das Aufrufen von Funktionen aus Logeinträgen, die an ein Pub/Sub-Thema weitergeleitet werden. In dieser Anleitung werden Eventarc-Trigger verwendet. Sie können aber auch direkte Pub/Sub-Trigger verwenden, um Ihre Funktion auszulösen.

Ereignisstruktur von Pub/Sub-ausgelösten Funktionen

Funktionen, die durch Cloud Logging-Logeinträge ausgelöst werden, erhalten ein PubsubMessage-Objekt, dessen data-Parameter ein base64-codierter String ist. Bei Cloud Logging-Logereignissen wird durch das Decodieren dieses Werts der relevante Logeintrag als JSON-String zurückgegeben.

Hinweis

Der Beispielcode leitet Cloud-Audit-Logs an eine Cloud Run-Funktion weiter. Bevor Sie den Beispielcode ausführen, benötigen Sie Folgendes:

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

Beispielcode

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

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 Folgendes:

    • REGION: die Region in Google Cloud , in der Sie Ihre Funktion bereitstellen möchten. Beispiel: europe-west1.
    • Das Flag --function gibt den Einstiegspunkt für die Funktion im Beispielquellcode an. Dies ist der Code, den Cloud Run ausführt, 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 Basis-Image-Umgebung 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" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_NAME \
        --service-account=PROJECT_NUMBER-compute@
    

    Ersetzen Sie Folgendes:

    • TRIGGER_NAME: der Name des Triggers.
    • EVENTARC_TRIGGER_LOCATION: der Standort des Eventarc-Triggers. Im Allgemeinen sollte der Standort eines Eventarc-Triggers mit dem Standort derGoogle 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: der Name der Funktion, die Sie bereitstellen.
    • REGION: die Cloud Run-Region, in der Sie Ihre Funktion bereitgestellt haben.
    • PROJECT_NUMBER: 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 Standarddienstkonto von Compute.
    • Das Flag --event-filters gibt die Ereignisfilter an, die der Trigger überwacht. Wenn ein Ereignis mit allen Ereignisfiltern übereinstimmt, wird ein Aufruf Ihrer Funktion ausgelöst. 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.
    • TOPIC_NAME: der Name des Pub/Sub-Themas, das die Logeintragsereignisse empfängt.
    • Das Flag --transport-topic gibt das Pub/Sub-Thema an, das Eventarc zum Übertragen von Ereignissen an Ihre Funktion verwendet. Dieses Flag ist nicht erforderlich, wenn Sie zuvor kein Pub/Sub-Thema erstellt haben.

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