Cloud Functions の直接呼び出し

迅速なイテレーションとデバッグをサポートするために、Cloud Functions ではコマンドライン インターフェースで call コマンドを使用できます。また、Cloud Console UI でテスト機能を実行できます。これにより、関数を直接呼び出し、予期した動作が行われているかどうか確認できます。特定のイベントに応答するように関数がデプロイされている場合でも、関数がすぐに実行されます。

gcloud コマンドライン インターフェースを使用する

gcloud ツールを使用して関数を直接呼び出すには、gcloud functions call コマンドを使用し、関数が想定する任意のデータを JSON 形式で --data 引数に渡します。例:

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

YOUR_FUNCTION_NAME は実行する関数の名前です。--data 引数は、関数に次のように渡されます。

  • HTTP 関数の場合、指定したデータは POST リクエストの本体として送信されます。
  • バックグラウンド関数の場合、データがイベントデータとして関数に直接渡されます。バックグラウンド関数でイベントデータにアクセスする必要がある場合は、バックグラウンド関数のパラメータをご覧ください。

GCP Console の使用

Cloud Console から関数を直接呼び出すには、次の手順に沿って操作します。

  1. Cloud Functions の概要ページに移動します。

  2. リストで、呼び出す関数の名前をクリックします。

    [関数の詳細] ページに移動します。

  3. [テスト] タブをクリックします。

  4. [トリガー イベント] フィールドに、関数が想定するデータを JSON 形式で入力します。

  5. [関数をテスト] をクリックします。

関数からのレスポンスが [出力] フィールドに表示されます。個々の実行のログは、[ログ] フィールドに表示されます。

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 `data` field contains the PubsubMessage message. The
         `attributes` field will contain custom attributes if there are any.
         context (google.cloud.functions.Context): The Cloud Functions event
         metadata. The `event_id` field contains the Pub/Sub message ID. The
         `timestamp` field contains the publish time.
    """
    import base64

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

    if 'data' in event:
        name = base64.b64decode(event['data']).decode('utf-8')
    else:
        name = 'World'
    print('Hello {}!'.format(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.
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;
        }
    }
}

関数を直接呼び出すには、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'"}'

Cloud Console UI から関数を呼び出すこともできます。[トリガー イベント] フィールドで同じイベントデータを使用します。