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

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

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

מבנה האירועים של פונקציות שמופעלות על ידי 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" \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    מחליפים את:

    • TRIGGER_NAME בשם של הטריגר.

    • EVENTARC_TRIGGER_LOCATION עם המיקום של טריגר Eventarc. באופן כללי, המיקום של טריגר Eventarc צריך להיות זהה למיקום של Google Cloud המשאב שרוצים לעקוב אחרי האירועים שלו. ברוב התרחישים, כדאי גם לפרוס את הפונקציה באותו אזור. מידע נוסף על מיקומי טריגרים של Eventarc זמין במאמר הסבר על מיקומי Eventarc.

    • SERVICE בשם הפונקציה שאתם פורסים.

    • REGION עם האזור של פונקציית Cloud Run.

    • PROJECT_NUMBER במספר הפרויקט. Google Cloud טריגרים של Eventarc מקושרים לחשבונות שירות כדי לשמש כזהות כשמפעילים את הפונקציה. לחשבון השירות של טריגר Eventarc צריכה להיות הרשאה להפעלת הפונקציה. כברירת מחדל, Cloud Run משתמש בחשבון השירות שמוגדר כברירת מחדל של Compute.

    • הדגל --event-filters מציין את מסנני האירועים שהטריגר עוקב אחריהם. אירוע שתואם לכל event-filters, המסננים מפעילים קריאות לפונקציה. לכל טריגר צריך להיות סוג אירוע נתמך. אי אפשר לשנות את סוג המסנן של האירוע אחרי שיוצרים אותו. כדי לשנות את סוג המסנן של האירוע, צריך ליצור טריגר חדש ולמחוק את הטריגר הישן. אפשר גם לחזור על הדגל --event-filters עם מסנן נתמך בצורה ATTRIBUTE=VALUE כדי להוסיף עוד מסננים.

רשומה ביומן Cloud

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

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