Memanggil Cloud Functions secara langsung

Untuk mendukung iterasi dan proses debug yang cepat, Cloud Functions 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

Generasi ke-1

Untuk memanggil fungsi generasi ke-1 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 --data '{"name":"Tristan"}'

dengan YOUR_FUNCTION_NAME adalah nama fungsi yang ingin Anda jalankan. Argumen --data dikirim ke fungsi Anda sebagai berikut:

  • Untuk fungsi HTTP, data yang Anda berikan akan dikirim sebagai isi permintaan POST.
  • Untuk fungsi latar belakang, data diteruskan secara langsung sebagai data peristiwa ke fungsi Anda. Untuk mengetahui informasi lebih lanjut tentang cara mengakses data peristiwa di fungsi background, baca Parameter fungsi background.
  • Untuk fungsi CloudEvent, data diteruskan secara langsung sebagai data peristiwa ke fungsi Anda. Untuk mengetahui informasi selengkapnya tentang cara mengakses data peristiwa dalam fungsi CloudEvent, lihat parameter fungsi CloudEvent.

Generasi ke-2

Untuk memanggil fungsi generasi ke-2 secara langsung menggunakan gcloud CLI, gunakan perintah gcloud functions call versi generasi ke-2 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 mengetahui informasi selengkapnya tentang cara mengakses data peristiwa dalam fungsi CloudEvent, lihat parameter fungsi CloudEvent.

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:

Generasi ke-1

  1. Buka halaman Ringkasan Cloud Functions.

  2. Klik nama fungsi yang ingin dipanggil.

  3. Klik tab Pengujian.

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

  5. Klik Uji fungsi.

Respons fungsi akan muncul di kolom Output, dan log untuk eksekusi individu akan muncul di kolom Log.

Generasi ke-2

  1. Buka halaman Ringkasan Cloud Functions.

  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 tombol +Tambah parameter kueri dan +Tambah parameter header untuk menambahkan parameter kueri dan header ke panggilan fungsi sesuai kebutuhan.

    Konsol Google Cloudnsole 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 generasi ke-1 yang dipicu oleh peristiwa 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);
}

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.