Memicu fungsi dari entri log

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

Halaman ini menunjukkan contoh cara memicu fungsi dari entri log yang dirutekan ke topik Pub/Sub.

Struktur peristiwa fungsi yang dipicu Pub/Sub

Seperti semua 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 contoh kode, Anda memerlukan hal berikut:

Lihat panduan pemicu Pub/Sub untuk API yang akan 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 beta run deploy nodejs-log-function \
          --source . \
          --function processLogEntry \
          --base-image nodejs20 \
          --region REGION
    

    Python

    gcloud beta run deploy python-log-function \
          --source . \
          --function process_log_entry \
          --base-image python312 \
          --region REGION
    

    Go

    gcloud beta run deploy go-log-function \
          --source . \
          --function ProcessLogEntry \
          --base-image go122 \
          --region REGION
    

    Java

    gcloud beta run deploy java-log-function \
          --source . \
          --function StackdriverLogging \
          --base-image java21 \
          --region REGION
    

    Ganti:

    • REGION dengan region Google Cloud tempat Anda ingin men-deploy fungsi. Misalnya, us-central1.

    • Flag --function menentukan titik entri 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" \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Ganti:

    • TRIGGER_NAME dengan nama untuk pemicu Anda.

    • EVENTARC_TRIGGER_LOCATION dengan lokasi untuk pemicu Eventarc. Secara umum, lokasi pemicu Eventarc harus cocok dengan lokasi resource Google 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 mengetahui detail selengkapnya tentang lokasi pemicu Eventarc.

    • SERVICE dengan nama fungsi yang Anda deployment.

    • REGION dengan region Cloud Run fungsi.

    • PROJECT_NUMBER dengan nomor project Google Cloud Anda. Pemicu Eventarc ditautkan ke akun layanan untuk digunakan sebagai identitas saat memanggil fungsi Anda. Akun layanan pemicu Eventarc 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. Peristiwa yang cocok dengan semua event-filters, filter 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 tanda --event-filters dengan filter yang didukung dalam bentuk ATTRIBUTE=VALUE untuk menambahkan filter lainnya.

Entri log cloud

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

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