Memanggil fungsi Cloud Run secara langsung

Untuk mendukung iterasi dan proses debug yang cepat, fungsi Cloud Run menyediakan perintah call dalam antarmuka command line dan fungsi pengujian di UI Google Cloud Console. Ini memungkinkan Anda memanggil fungsi secara langsung untuk memastikan bahwa fungsi tersebut berperilaku seperti yang diharapkan. Hal ini menyebabkan fungsi segera dijalankan, meskipun mungkin telah di-deploy untuk merespons peristiwa tertentu.

Menguji fungsi dengan Google Cloud CLI

Untuk memanggil fungsi Anda secara langsung menggunakan gcloud CLI, gunakan perintah gcloud functions call dan masukkan data apa pun yang diharapkan fungsi Anda sebagai JSON dalam argumen --data. Contoh:

gcloud functions call YOUR_FUNCTION_NAME \
  --region=REGION --gen2 \
  --data '{"name":"Kalani"}'

Ganti:

  • YOUR_FUNCTION_NAME: nama fungsi yang Anda uji
  • REGION: region Google Cloud tempat fungsi Anda di-deploy

Argumen --data dikirim ke fungsi Anda sebagai berikut:

  • Untuk fungsi HTTP, data yang Anda berikan akan dikirim sebagai isi permintaan POST.
  • Untuk fungsi CloudEvent, data diteruskan secara langsung sebagai data peristiwa ke fungsi Anda.

Untuk informasi selengkapnya, lihat dokumentasi gcloud functions call.

Menguji fungsi dengan Konsol Google Cloud

Untuk memanggil fungsi secara langsung dari Konsol Google Cloud, ikuti langkah-langkah berikut:

  1. Buka halaman Ringkasan fungsi Cloud Run.

  2. Dari daftar, klik nama fungsi yang ingin dipanggil. Tindakan ini akan mengarahkan Anda ke halaman Detail fungsi.

  3. Klik tab Pengujian.

  4. Di kolom Konfigurasi Peristiwa Pemicuan, masukkan data apa pun yang diharapkan fungsi Anda sebagai JSON.

  5. Klik +Tambahkan parameter kueri dan +Tambahkan parameter header untuk menambahkan parameter kueri dan header ke panggilan fungsi sesuai kebutuhan.

    Konsol Google Cloud menyusun parameter yang Anda tentukan ke dalam perintah gcloud functions call di jendela perintah pengujian CLI.

  6. Pilih Jalankan di cloud shell untuk membuka jendela Cloud Shell guna menjalankan perintah ini.

  7. Tekan Enter untuk memicu perintah gcloud functions call setelah muncul di jendela Cloud Shell Anda.

Contoh fungsi berbasis peristiwa Cloud Pub/Sub

Contoh ini menunjukkan cara memanggil secara langsung fungsi berbasis peristiwa yang dipicu oleh peristiwa Cloud Pub/Sub:

Node.js

const functions = require('@google-cloud/functions-framework');

// Register a CloudEvent callback with the Functions Framework that will
// be executed when the Pub/Sub trigger topic receives a message.
functions.cloudEvent('helloPubSub', cloudEvent => {
  // The Pub/Sub message is passed as the CloudEvent's data payload.
  const base64name = cloudEvent.data.message.data;

  const name = base64name
    ? Buffer.from(base64name, 'base64').toString()
    : 'World';

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

Python

import base64

from cloudevents.http import CloudEvent
import functions_framework


# Triggered from a message on a Cloud Pub/Sub topic.
@functions_framework.cloud_event
def subscribe(cloud_event: CloudEvent) -> None:
    # Print out the data from Pub/Sub, to prove that it worked
    print(
        "Hello, " + base64.b64decode(cloud_event.data["message"]["data"]).decode() + "!"
    )

Go


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

import (
	"context"
	"fmt"
	"log"

	"github.com/GoogleCloudPlatform/functions-framework-go/functions"
	"github.com/cloudevents/sdk-go/v2/event"
)

func init() {
	functions.CloudEvent("HelloPubSub", helloPubSub)
}

// MessagePublishedData contains the full Pub/Sub message
// See the documentation for more details:
// https://cloud.google.com/eventarc/docs/cloudevents#pubsub
type MessagePublishedData struct {
	Message PubSubMessage
}

// 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 CloudEvent message and extracts the Pub/Sub message.
func helloPubSub(ctx context.Context, e event.Event) error {
	var msg MessagePublishedData
	if err := e.DataAs(&msg); err != nil {
		return fmt.Errorf("event.DataAs: %w", err)
	}

	name := string(msg.Message.Data) // Automatically decoded from base64.
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	return nil
}

Java

import com.google.cloud.functions.CloudEventsFunction;
import com.google.gson.Gson;
import functions.eventpojos.PubSubBody;
import io.cloudevents.CloudEvent;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.logging.Logger;

public class SubscribeToTopic implements CloudEventsFunction {
  private static final Logger logger = Logger.getLogger(SubscribeToTopic.class.getName());

  @Override
  public void accept(CloudEvent event) {
    // The Pub/Sub message is passed as the CloudEvent's data payload.
    if (event.getData() != null) {
      // Extract Cloud Event data and convert to PubSubBody
      String cloudEventData = new String(event.getData().toBytes(), StandardCharsets.UTF_8);
      Gson gson = new Gson();
      PubSubBody body = gson.fromJson(cloudEventData, PubSubBody.class);
      // Retrieve and decode PubSub message data
      String encodedData = body.getMessage().getData();
      String decodedData =
          new String(Base64.getDecoder().decode(encodedData), StandardCharsets.UTF_8);
      logger.info("Hello, " + decodedData + "!");
    }
  }
}

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

Untuk memanggil fungsi secara langsung, kirim PubsubMessage, yang mengharapkan data berenkode base64, sebagai data peristiwa:

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

Contoh CLI ini menggunakan sintaksis bash atau sh. Ini berfungsi di lingkungan Linux dan Mac, tetapi tidak di Windows.

Anda juga dapat memanggil fungsi ini dari Konsol Google Cloud menggunakan data peristiwa yang sama di kolom Peristiwa pemicu.