הפעלת פונקציות מרשומות ביומן

יומני הביקורת של Cloud מתעדים אירועים בשירותים רבים של Google Cloud . באמצעות כיורים, אתם יכולים לסנן את היומנים האלה ולהעביר אותם לנושאי Pub/Sub שמפעילים פונקציות Cloud Run. כך אפשר להגיב לאירועים מכל שירות שלGoogle Cloud שמפיק יומני ביקורת.

בדף הזה מופיעה דוגמה להפעלת פונקציות מרשומות ביומן שמנותבות לנושא Pub/Sub. במדריך הזה משתמשים בטריגרים של Eventarc, אבל אפשר גם להשתמש בטריגרים ישירים של Pub/Sub כשמפעילים את הפונקציה.

מבנה האירועים של פונקציות שמופעלות על ידי Pub/Sub

פונקציות שמופעלות על ידי רשומות ביומן של Cloud Logging מקבלות אובייקט PubsubMessage שהפרמטר data שלו הוא מחרוזת בקידוד base64. באירועי יומן של Cloud Logging, פענוח הערך הזה מחזיר את רשומת היומן הרלוונטית כמחרוזת JSON.

לפני שמתחילים

הקוד לדוגמה מעביר את יומני הביקורת של Cloud לפונקציית Cloud Run. לפני שמריצים את הקוד לדוגמה, צריך:

במדריך בנושא טריגרים של Pub/Sub מפורטים ממשקי ה-API שצריך להפעיל והתפקידים שנדרשים כדי לפרוס פונקציות שמופעלות על ידי Pub/Sub.

קוד לדוגמה

אתם יכולים להשתמש בפונקציה שמופעלת על ידי Pub/Sub כדי לזהות יומנים שיוצאו מ-Cloud Logging ולהגיב להם:

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

פריסה והפעלה של פונקציה

כדי להגדיר טריגר במהלך פריסת הפונקציה:

  1. מריצים את הפקודה הבאה בספרייה שמכילה את הקוד לדוגמה כדי לפרוס את הפונקציה:

    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
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫REGION: Google Cloud האזור שבו רוצים לפרוס את הפונקציה. לדוגמה, europe-west1.
    • הדגל --function מציין את נקודת הכניסה לפונקציה בקוד המקור לדוגמה. זה הקוד ש-Cloud Run מריץ כשהפונקציה פועלת. הערך של הדגל הזה חייב להיות שם של פונקציה או שם מלא של מחלקה שקיימים בקוד המקור.
    • הדגל --base-image מציין את סביבת קובץ האימג' הבסיסי של הפונקציה. לפרטים נוספים על קובצי אימג' בסיסיים ועל החבילות שכלולות בכל קובץ אימג', ראו קובצי אימג' בסיסיים של סביבות זמן ריצה.
  2. מריצים את הפקודה הבאה כדי ליצור טריגר שמסנן אירועים:

    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@
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫TRIGGER_NAME: שם הטריגר.
    • ‫EVENTARC_TRIGGER_LOCATION: המיקום של הטריגר של Eventarc. באופן כללי, המיקום של טריגר Eventarc צריך להתאים למיקום של המשאב ב-Google Cloud שאתם רוצים לעקוב אחרי האירועים שלו. ברוב המקרים, כדאי לפרוס את הפונקציה באותו אזור. למידע נוסף על מיקומי הטריגרים של Eventarc, קראו את המאמר הסבר על מיקומי Eventarc.
    • ‫SERVICE: שם הפונקציה שאתם פורסים.
    • ‫REGION: האזור ב-Cloud Run שבו פרסתם את הפונקציה.
    • ‫PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud . טריגרים של Eventarc מקושרים לחשבונות שירות כדי להשתמש בהם כזהות כשמפעילים את הפונקציה. לחשבון השירות של הטריגר ב-Eventarc צריכה להיות הרשאה להפעיל את הפונקציה. כברירת מחדל, Cloud Run משתמש בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine.
    • הדגל --event-filters מציין את מסנני האירועים שהטריגר עוקב אחריהם. כשאירוע תואם לכל מסנני האירועים, הוא מפעיל קריאה לפונקציה. לכל טריגר צריך להיות סוג אירוע נתמך. אי אפשר לשנות את סוג מסנן האירועים אחרי שיוצרים אותו. כדי לשנות את סוג מסנן האירועים, צריך ליצור טריגר חדש ולמחוק את הישן. אפשר לחזור על הדגל --event-filters עם מסנן נתמך בפורמט ATTRIBUTE=VALUE כדי להוסיף עוד מסננים.
    • ‫TOPIC_NAME: השם של נושא Pub/Sub שמקבל את האירועים של רשומות היומן.
    • הדגל --transport-topic מציין את נושא Pub/Sub שבו Eventarc משתמש כדי להעביר אירועים לפונקציה. שימו לב שהדגל הזה לא נדרש אם לא יצרתם בעבר נושא Pub/Sub.

רשומה ביומן בענן

כשנוצרת רשומה ביומן של Cloud שתואמת לאחד מהמסננים, הרשומות התואמות ביומן של הפונקציה במסוףGoogle Cloud אמורות להיראות כך:

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