Llama a Cloud Functions directamente

Para admitir iteraciones y depuraciones rápidas, Cloud Functions proporciona un comando call en la interfaz de línea de comandos y la funcionalidad de prueba en la IU de la consola de Google Cloud. Esto te permite invocar directamente una función para asegurarte de que se comporta como se esperaba. Esto hace que la función se ejecute de inmediato, incluso si se implementó para responder a un evento específico.

Prueba tu función con Google Cloud CLI

1ª gen.

Para invocar directamente una función de 1ª gen. mediante gcloud CLI, usa el comando gcloud functions call y proporciona los datos que tu función espera como JSON en el argumento --data. Por ejemplo:

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

donde YOUR_FUNCTION_NAME es el nombre de la función que quieres ejecutar. El argumento --data se envía a tu función como se muestra a continuación:

  • Para las funciones de HTTP, los datos que suministras se envían como el cuerpo de una solicitud POST.
  • Para las funciones en segundo plano, los datos se pasan directamente a tu función como los datos del evento. Para obtener más información sobre cómo acceder a los datos de eventos en funciones en segundo plano, consulta los parámetros de las funciones en segundo plano.
  • Para las funciones de CloudEvent, los datos se pasan directamente a tu función como los datos del evento. Para obtener más información sobre cómo acceder a los datos de eventos en las funciones de CloudEvent, consulta Parámetros de funciones de CloudEvent.

2ª gen.

Para invocar directamente una función de 2ª gen. mediante gcloud CLI, usa la versión de 2ª gen. del comando gcloud functions call y proporciona los datos que tu función espera como JSON en el argumento --data. Por ejemplo:

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

Reemplaza lo siguiente:

  • YOUR_FUNCTION_NAME: Es el nombre de la función que deseas probar.
  • REGION: La región de Google Cloud en la que se implementa tu función

El argumento --data se envía a tu función como se muestra a continuación:

  • Para las funciones de HTTP, los datos que suministras se envían como el cuerpo de una solicitud POST.
  • Para las funciones de CloudEvent, los datos se pasan directamente a tu función como los datos del evento. Para obtener más información sobre cómo acceder a los datos de eventos en las funciones de CloudEvent, consulta Parámetros de funciones de CloudEvent.

Para obtener más información, consulta la documentación gcloud functions call.

Prueba tu función con la consola de Google Cloud

Para invocar directamente una función desde la consola de Google Cloud, sigue estos pasos:

1ª gen.

  1. Ir a la página Descripción general de Cloud Functions

  2. Haz clic en el nombre de la función que quieres invocar.

  3. Haz clic en la pestaña Prueba.

  4. En el campo Configurar evento de activación, ingresa cualquier dato que tu función espere como archivo JSON.

  5. Haz clic en Probar la función.

La respuesta de tu función aparece en el campo Resultado y los registros de la ejecución individual aparecen en el campo Registros.

2ª gen.

  1. Ir a la página Descripción general de Cloud Functions

  2. En la lista, haz clic en el nombre de la función que quieres invocar. Esta acción te lleva a la página Detalles de la función.

  3. Haz clic en la pestaña Prueba.

  4. En el campo Configurar evento de activación, ingresa cualquier dato que tu función espere como archivo JSON.

  5. Haz clic en los botones +Agregar parámetro de consulta y +Agregar parámetro de encabezado para agregar parámetros de consulta y encabezado a tu llamada a función según sea necesario.

    La consola de Google Cloud ensambla los parámetros que especifiques en un comando gcloud functions call en la ventana de comando de prueba de la CLI.

  6. Selecciona Ejecutar en Cloud Shell para abrir una ventana de Cloud Shell a fin de ejecutar este comando.

  7. Presiona Intro para activar el comando gcloud functions call después de que aparezca en la ventana de Cloud Shell.

Ejemplo de función controlada por eventos de Cloud Pub/Sub

En este ejemplo, se muestra cómo invocar directamente una función controlada por eventos de 1ª gen. que se activa mediante eventos de 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);
}

Para invocar la función directamente, envía un PubsubMessage, que espera datos codificados en Base 64 como los datos del evento:

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

En este ejemplo de la CLI, se usa la sintaxis bash o sh. Funciona en entornos de Linux y Mac, pero no en Windows.

También puedes invocar la función desde la consola de Google Cloud mediante los mismos datos de eventos en el campo Evento de activación.