Memicu fungsi dari entri log

Cloud Audit Logs mencatat peristiwa di banyak Google Cloud layanan. Dengan menggunakan sink, Anda dapat memfilter log ini dan meneruskannya ke topik Pub/Sub yang memicu fungsi Cloud Run. Dengan begitu, Anda dapat merespons peristiwa dari layananGoogle Cloud mana pun yang menghasilkan log audit.

Halaman ini menunjukkan contoh cara memanggil fungsi dari entri log yang dirutekan ke topik Pub/Sub. Tutorial ini menggunakan pemicu Eventarc, tetapi Anda juga dapat menggunakan pemicu Pub/Sub langsung saat memicu fungsi.

Struktur peristiwa fungsi yang dipicu Pub/Sub

Fungsi yang dipicu oleh entri log Cloud Logging menerima objek PubsubMessage yang parameter data-nya adalah string berenkode base64. Untuk peristiwa log Cloud Logging, mendekode nilai ini akan menampilkan entri log yang relevan sebagai string JSON.

Sebelum memulai

Kode contoh meneruskan Cloud Audit Logs ke fungsi Cloud Run. Sebelum menjalankan kode contoh, Anda memerlukan hal berikut:

Lihat panduan pemicu Pub/Sub untuk mengetahui API yang perlu diaktifkan dan peran yang diperlukan untuk men-deploy fungsi yang dipicu oleh Pub/Sub.

Kode contoh

Anda dapat menggunakan fungsi yang dipicu Pub/Sub untuk mendeteksi dan merespons log Cloud Logging 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 dan memicu fungsi

Untuk mengonfigurasi pemicu selama deployment fungsi:

  1. Jalankan perintah berikut di direktori yang berisi kode contoh untuk men-deploy fungsi Anda:

    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
    

    Ganti kode berikut:

    • REGION: Region Google Cloud tempat Anda ingin men-deploy fungsi. Contoh, europe-west1.
    • Flag --function menentukan titik masuk ke fungsi dalam contoh kode sumber. Ini adalah kode yang dijalankan Cloud Run saat fungsi Anda berjalan. Nilai flag ini harus berupa nama fungsi atau nama class yang sepenuhnya memenuhi syarat yang ada dalam kode sumber Anda.
    • Flag --base-image menentukan lingkungan image dasar untuk fungsi Anda. Untuk mengetahui detail selengkapnya tentang image dasar dan paket yang disertakan dalam setiap image, lihat Image dasar runtime.
  2. Jalankan perintah berikut untuk membuat pemicu yang memfilter peristiwa:

    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@
    

    Ganti kode berikut:

    • TRIGGER_NAME: nama untuk pemicu Anda.
    • EVENTARC_TRIGGER_LOCATION: lokasi untuk pemicu Eventarc. Secara umum, lokasi pemicu Eventarc harus cocok dengan lokasi resourceGoogle Cloud yang ingin Anda pantau peristiwanya. Dalam sebagian besar skenario, Anda juga harus men-deploy fungsi di region yang sama. Lihat Memahami lokasi Eventarc untuk detail selengkapnya tentang lokasi pemicu Eventarc.
    • SERVICE: nama fungsi yang Anda deploy.
    • REGION: region Cloud Run tempat Anda men-deploy fungsi.
    • PROJECT_NUMBER: nomor project Google Cloud Anda. Pemicu Eventarc ditautkan ke akun layanan untuk digunakan sebagai identitas saat memanggil fungsi Anda. Akun layanan pemicu Eventarc Anda harus memiliki izin untuk memanggil fungsi Anda. Secara default, Cloud Run menggunakan Akun layanan komputasi default.
    • Flag --event-filters menentukan filter peristiwa yang dipantau pemicu. Jika cocok dengan semua filter peristiwa, peristiwa akan memicu panggilan ke fungsi Anda. Setiap pemicu harus memiliki jenis peristiwa yang didukung. Anda tidak dapat mengubah jenis filter peristiwa setelah pembuatan. Untuk mengubah jenis filter peristiwa, Anda harus membuat pemicu baru dan menghapus pemicu lama. Secara opsional, Anda dapat mengulangi flag --event-filters dengan filter yang didukung dalam bentuk ATTRIBUTE=VALUE untuk menambahkan lebih banyak filter.
    • TOPIC_NAME: nama topik Pub/Sub yang menerima peristiwa entri log.
    • Flag --transport-topic menentukan topik Pub/Sub yang digunakan Eventarc untuk memindahkan peristiwa ke fungsi Anda. Perhatikan bahwa flag ini tidak diperlukan jika Anda sebelumnya tidak membuat topik Pub/Sub.

Entri log Cloud

Saat entri log Cloud yang cocok dengan salah satu filter dibuat, entri log yang sesuai untuk fungsi Anda di konsolGoogle Cloud akan terlihat seperti berikut:

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