Go ランタイム

概要

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

ランタイムに関する一般的な情報と、各 Go ランタイムが使用する Ubuntu のバージョンについては、Cloud Run functions 実行環境をご覧ください。

ランタイムの選択

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

gcloud

Google Cloud CLI を使用している場合は、目的の Go ランタイムで --runtime パラメータを使用してランタイムを指定します。例:

gcloud functions deploy FUNCTION_NAME --runtime go121 FLAGS...

FLAGS... は関数の最初のデプロイ時に渡される引数です。必須の引数と省略可能な引数の詳細については、Google Cloud CLI を使用してデプロイするをご覧ください。

コンソール

Google Cloud コンソールを使用している場合は、Google Cloud コンソール クイックスタートで詳しい手順をご覧ください。

関数の準備

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

Cloud Run functions で Go の使用をすぐに開始するには、クイックスタートをご覧ください。

ソースコードの構造

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

依存関係の指定

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
}