Pemicu Pihak Kedua dengan Cloud Logging

Banyak peristiwa Google Cloud yang dicatat dalam Cloud Audit Logs. Anda dapat memfilter log ini dan meneruskannya ke topik Pub/Sub menggunakan sink. Topik Pub/Sub ini kemudian dapat mengirimkan notifikasi yang memicu fungsi Cloud Run. Hal ini memungkinkan Anda membuat peristiwa dari layanan Google Cloud apa pun yang menghasilkan log audit.

Konfigurasi

Untuk menjalankan contoh dalam dokumen ini, Anda memerlukan Topik Pub/Sub dan sink Cloud Logging. Contoh ini menggunakannya untuk meneruskan Cloud Audit Logs ke fungsi Cloud Run.

Struktur peristiwa

Seperti semua fungsi yang dipicu Pub/Sub, fungsi yang dipicu oleh entri log Cloud menerima objek PubsubMessage yang parameter data-nya adalah String berenkode base64. Untuk peristiwa log Cloud, mendekode nilai ini akan menampilkan entri log yang relevan sebagai string JSON.

Kode contoh

Anda dapat menggunakan fungsi yang dipicu Pub/Sub untuk mendeteksi dan merespons log Cloud yang diekspor:

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

Men-deploy fungsi

Gunakan perintah berikut untuk men-deploy fungsi:

Node.js

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

Gunakan flag --runtime untuk menentukan ID runtime dari versi Node.js yang didukung untuk menjalankan fungsi Anda.

Python

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

Gunakan flag --runtime untuk menentukan ID runtime versi Python yang didukung untuk menjalankan fungsi Anda.

Go

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

Gunakan flag --runtime untuk menentukan ID runtime versi Go yang didukung untuk menjalankan fungsi Anda.

Java

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

Gunakan flag --runtime untuk menentukan ID runtime versi Java yang didukung untuk menjalankan fungsi Anda.

Memicu fungsi

Saat entri log Cloud yang cocok dengan salah satu filter dibuat, Anda akan melihat entri log yang sesuai untuk fungsi Anda:

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