Go ランタイム

Cloud Run functions は、オペレーティング システムのバージョンに加えて、アドオン パッケージ、言語サポート、お使いの関数をサポートして呼び出す Go Functions Framework ライブラリで構成される環境で実行されます。この環境は言語バージョンで識別され、ランタイム ID として知られています。

関数の準備

関数は、 Google Cloud コンソールから直接準備することも、ローカルマシンで作成してアップロードすることもできます。Go 開発用にローカルマシンを準備するには、Go 開発環境を設定するをご覧ください。

ランタイムの選択

Cloud Run functions は、サポートされている言語ランタイムとベースイメージのページに記載されている複数のバージョンの Go をサポートしています。デプロイ時に、関数に使用する Go ランタイムを選択できます。

gcloud

Cloud Run functions を使用して gcloud CLI で HTTP 関数をデプロイするには、Google Cloud CLI を使用してデプロイするをご覧ください。

Console

Google Cloud コンソールを使用している場合は、関数を作成してデプロイするときにランタイムを選択します。詳しい手順については、Google Cloud コンソール クイックスタートをご覧ください。

ソースコードの構造

Cloud Run functions が関数の定義を見つけるには、ソースコードが特定の構造に従っている必要があります。詳細については、Cloud Run functions の関数を作成するをご覧ください。

依存関係を指定する

Go の Cloud Run functions では、Go モジュールと go.mod ファイル、または vendor ディレクトリのいずれかで、すべての依存関係を指定する必要があります。詳細については、Go で依存関係を指定するをご覧ください。

環境変数

Go ランタイムは、必要に応じて関数で使用する特定の環境変数を自動的に設定します。詳細については、環境変数を構成するをご覧ください。

Context タイプ

Go の context パッケージContext 型を定義します。この型は、API の境界を越えてプロセス間で期限、キャンセル シグナル、その他のリクエスト スコープ値を保持します。

次のコードでは、Pub/Sub クライアントによるコンテキスト アクセスの例を示します。


// 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
}