קריאה ישירה לפונקציות Cloud Run

כדי לתמוך באיטרציה ובניפוי באגים מהירים, פונקציות Cloud Run מספקות פקודה call בממשק שורת הפקודה (CLI) ופונקציונליות לבדיקה בממשק המשתמש של מסוףGoogle Cloud . האפשרות הזו מאפשרת לכם להפעיל פונקציה ישירות כדי לוודא שהיא פועלת כמצופה. כתוצאה מכך, הפונקציה מופעלת באופן מיידי, גם אם היא הופעלה כדי להגיב לאירוע ספציפי.

בדיקת הפונקציה באמצעות Google Cloud CLI

כדי להפעיל פונקציה ישירות באמצעות ה-CLI של gcloud, משתמשים בפקודה gcloud functions call ומספקים את הנתונים שהפונקציה מצפה להם כ-JSON בארגומנט --data. לדוגמה:

gcloud functions call YOUR_FUNCTION_NAME --data '{"name":"Tristan"}'

כאשר YOUR_FUNCTION_NAME הוא שם הפונקציה שרוצים להפעיל. הארגומנט --data נשלח לפונקציה שלכם באופן הבא:

  • בפונקציות HTTP, הנתונים שאתם מספקים נשלחים כגוף של בקשת POST.
  • בפונקציות ברקע, הנתונים מועברים ישירות כנתוני האירוע לפונקציה.
  • בפונקציות CloudEvent, הנתונים מועברים ישירות כנתוני האירוע לפונקציה.

מידע נוסף זמין במאמרי העזרה בנושא gcloud functions call.

בדיקת הפונקציה באמצעות Google Cloud המסוף

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

  1. כניסה לדף סקירה כללית של פונקציות Cloud Run.

  2. לוחצים על שם הפונקציה שרוצים להפעיל.

  3. לוחצים על הכרטיסייה בדיקה.

  4. בשדה Configure Triggering Event (הגדרת אירוע הפעלה), מזינים נתונים שהפונקציה מצפה לקבל בפורמט JSON.

  5. לוחצים על בדיקת הפונקציה.

התשובה של הפונקציה מופיעה בשדה Output, והיומנים של הביצוע הספציפי מופיעים בשדה Logs.

דוגמה לפונקציה מבוססת-אירועים ב-Cloud Pub/Sub

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

Node.js

/**
 * Background Cloud Function to be triggered by Pub/Sub.
 * This function is exported by index.js, and executed when
 * the trigger topic receives a message.
 *
 * @param {object} message The Pub/Sub message.
 * @param {object} context The event metadata.
 */
exports.helloPubSub = (message, context) => {
  const name = message.data
    ? Buffer.from(message.data, 'base64').toString()
    : 'World';

  console.log(`Hello, ${name}!`);
};

Python

def hello_pubsub(event, context):
    """Background Cloud Function to be triggered by Pub/Sub.
    Args:
         event (dict):  The dictionary with data specific to this type of
                        event. The `@type` field maps to
                         `type.googleapis.com/google.pubsub.v1.PubsubMessage`.
                        The `data` field maps to the PubsubMessage data
                        in a base64-encoded string. The `attributes` field maps
                        to the PubsubMessage attributes if any is present.
         context (google.cloud.functions.Context): Metadata of triggering event
                        including `event_id` which maps to the PubsubMessage
                        messageId, `timestamp` which maps to the PubsubMessage
                        publishTime, `event_type` which maps to
                        `google.pubsub.topic.publish`, and `resource` which is
                        a dictionary that describes the service API endpoint
                        pubsub.googleapis.com, the triggering topic's name, and
                        the triggering event type
                        `type.googleapis.com/google.pubsub.v1.PubsubMessage`.
    Returns:
        None. The output is written to Cloud Logging.
    """
    import base64

    print(
        """This Function was triggered by messageId {} published at {} to {}
    """.format(
            context.event_id, context.timestamp, context.resource["name"]
        )
    )

    if "data" in event:
        name = base64.b64decode(event["data"]).decode("utf-8")
    else:
        name = "World"
    print(f"Hello {name}!")

Go


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

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"`
}

// HelloPubSub consumes a Pub/Sub message.
func HelloPubSub(ctx context.Context, m PubSubMessage) error {
	name := string(m.Data) // Automatically decoded from base64.
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	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.Level;
import java.util.logging.Logger;

public class HelloPubSub implements BackgroundFunction<PubsubMessage> {
  private static final Logger logger = Logger.getLogger(HelloPubSub.class.getName());

  @Override
  public void accept(PubsubMessage message, Context context) {
    String name = "world";
    if (message != null && message.getData() != null) {
      name = new String(
          Base64.getDecoder().decode(message.getData().getBytes(StandardCharsets.UTF_8)),
          StandardCharsets.UTF_8);
    }
    logger.info(String.format("Hello %s!", name));
    return;
  }
}

C#‎

using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using Google.Events.Protobuf.Cloud.PubSub.V1;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;

namespace HelloPubSub;

public class Function : ICloudEventFunction<MessagePublishedData>
{
    private readonly ILogger _logger;

    public Function(ILogger<Function> logger) =>
        _logger = logger;

    public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken)
    {
        string nameFromMessage = data.Message?.TextData;
        string name = string.IsNullOrEmpty(nameFromMessage) ? "world" : nameFromMessage;
        _logger.LogInformation("Hello {name}", name);
        return Task.CompletedTask;
    }
}

Ruby

require "functions_framework"
require "base64"

FunctionsFramework.cloud_event "hello_pubsub" do |event|
  # The event parameter is a CloudEvents::Event::V1 object.
  # See https://cloudevents.github.io/sdk-ruby/latest/CloudEvents/Event/V1.html
  name = Base64.decode64 event.data["message"]["data"] rescue "World"

  # A cloud_event function does not return a response, but you can log messages
  # or cause side effects such as sending additional events.
  logger.info "Hello, #{name}!"
end

PHP

use CloudEvents\V1\CloudEventInterface;
use Google\CloudFunctions\FunctionsFramework;

// Register the function with Functions Framework.
// This enables omitting the `FUNCTIONS_SIGNATURE_TYPE=cloudevent` environment
// variable when deploying. The `FUNCTION_TARGET` environment variable should
// match the first parameter.
FunctionsFramework::cloudEvent('helloworldPubsub', 'helloworldPubsub');

function helloworldPubsub(CloudEventInterface $event): void
{
    $log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb');

    $cloudEventData = $event->getData();
    $pubSubData = base64_decode($cloudEventData['message']['data']);

    $name = $pubSubData ? htmlspecialchars($pubSubData) : 'World';
    fwrite($log, "Hello, $name!" . PHP_EOL);
}

כדי להפעיל את הפונקציה ישירות, שולחים את PubsubMessage כנתוני האירוע, והפונקציה מצפה לנתונים בקידוד Base64:

Node.js

DATA=$(printf 'Hello!'|base64) && gcloud functions call helloPubSub --data '{"data":"'$DATA'"}'

Python

DATA=$(printf 'Hello!'|base64) && gcloud functions call hello_pubsub --data '{"data":"'$DATA'"}'

Go

DATA=$(printf 'Hello!'|base64) && gcloud functions call HelloPubSub --data '{"data":"'$DATA'"}'

Java

DATA=$(printf 'Hello!'|base64) && gcloud functions call java-hello-pubsub --data '{"data":"'$DATA'"}'

C#‎

DATA=$(printf 'Hello!'|base64) && gcloud functions call csharp-hello-pubsub --data '{"data":"'$DATA'"}'

Ruby

DATA=$(printf 'Hello!'|base64) && gcloud functions call hello_pubsub --data '{"data":"'$DATA'"}'

PHP

DATA=$(printf 'Hello!'|base64) && gcloud functions call helloworldPubsub --data '{"data":"'$DATA'"}'

בדוגמה הזו ל-CLI נעשה שימוש בתחביר bash או sh. היא פועלת בסביבות Linux ו-Mac, אבל לא ב-Windows.

אפשר גם להפעיל את הפונקציה מהמסוף באמצעות אותם נתוני אירוע בשדה אירוע ההפעלה. Google Cloud