Go ランタイム
Cloud Functions は、次の Go ランタイムをサポートしています。
- Go 1.16(推奨)
- Go 1.13
- Go 1.11
Go 開発用にローカルマシンを準備する方法については、Go 開発環境の設定をご覧ください。
Cloud Functions で Go の使用を開始するには、クイックスタートをご覧ください。
ランタイムの選択
デプロイ時に関数の Go ランタイムを選択できます。
gcloud
Google Cloud CLI を使用している場合は、選択した Go ランタイムで --runtime
パラメータを使用して、ランタイムを指定できます(サポートされている値は go111
、go113
、go116
です)。例:
gcloud functions deploy FUNCTION_NAME --runtime go116 FLAGS...
FLAGS...
は関数の最初のデプロイ時に渡される引数です。必須の引数とオプションの引数については、gcloud ツールを使用したデプロイをご覧ください。
Console
Cloud Console を使用している場合は、関数を作成してデプロイするときにランタイムを選択できます。詳しい手順については、Cloud Console クイックスタートをご覧ください。
実行環境
実行環境には、ランタイム、オペレーティング システム、パッケージ、関数を呼び出すライブラリが含まれます。
Go 1.11.6、Go 1.13.15、Go 1.16.7 ランタイムでは、Ubuntu 18.04 に基づいた実行環境が使用されます。詳しくは、Cloud Functions の実行環境をご覧ください。
ソースコードの構造
Cloud Functions で関数の定義を見つけられるよう、ランタイムごとに、ソースコードの構造に対する特定の要件があります。詳しくは、Cloud Functions の作成をご覧ください。
依存関係の指定
Go の Cloud Functions では、go.mod
ファイルを含む Go モジュール、または vendor
ディレクトリのいずれかによって、すべての依存関係を指定する必要があります。詳しくは、Go での依存関係の指定をご覧ください。
環境変数
Go 1.13 以降のランタイムで自動的に設定される環境変数は、Cloud Functions でサポートされている以前のランタイムよりも少なくなっています。詳しくは、環境変数の使用をご覧ください。
1 回限りの初期化
関数によっては、API クライアントの作成やデータベース アクセスの構成など、1 回限りの初期化が必要になる場合があります。これを行うには、次の 2 つの方法があります。
func init()
関数を使用して、関数の新しいインスタンスが起動したときに値を初期化します。func init()
関数内のコードは、関数が最初のリクエストを受信する前に実行されることに注意してください。sync.Once.Do()
関数を使用して、Cloud Functions の各インスタンスで 1 回だけコードを実行します。これは、関数のインスタンスが最初に起動したときではなく、リクエストに応じた初期化を行う場合に役立ちます。たとえば、特定の状況において、データベース クライアントのみを初期化したい場合があります。
context.Context
Go の context
パッケージは Context
型を定義します。この型は、API の境界を越えてプロセス間で期限、キャンセル シグナル、その他のリクエスト スコープ値を保持します。
特定の関数呼び出しより長く存続する API クライアントは、グローバルな context.Context
値で初期化する必要があります(たとえば、context.Background()
関数で作成された値)。パフォーマンスを最適化するため、グローバル スコープでクライアントを初期化するという方法があります。このクライアントとそのコンテキストは、特定の関数のインスタンス存続期間にわたって持続する可能性があります。
関数呼び出しコンテキストは、特定の関数呼び出しの存続期間内に限定して存在するオブジェクトまたはオペレーションに対してのみ使用してください。
呼び出しコンテキストは、関数の実行が終了した後はいつでも取り消される可能性があります。つまり、このコンテキストを使用して初期化されたクライアントは閉じられる可能性があります。関数呼び出しコンテキストには、関数の引数を通じてアクセスできます。通常、HTTP 関数の場合は r.Context()
、バックグラウンド関数の場合は ctx
です。
Pub/Sub クライアントを使用した例については、次のコードをご覧ください。
Go 1.16
Go 1.16 では、依存関係の管理に変更が加えられています。特に注目すべき点は、デフォルトで「モジュール対応」モードで動作することです。これは、ソースコードに go.mod
ファイルが含まれる必要があることを意味します。リリースノートの全文は golang.org で参照できます。
1.16 より前のバージョンで既存のデプロイをサポートし、移行パスを簡素化するには:
go.mod
を使用しない関数は引き続きサポートされます。vendor
が使用されており、go.mod
が使用されていない関数は、1.16 より前のバージョンで以前と同様に動作します。Functions Framework がvendor
にない場合は、Cloud Functions によって追加されます。vendor
とgo.mod
を使用する関数は Go 1.14 以降でサポートされていますが、go.mod
/vendor
には Functions Framework が必要です。ない場合は、ビルドは次のエラーで失敗します。
vendored dependencies must include "github.com/GoogleCloudPlatform/functions-framework-go";
if your function does not depend on the module, please add a blank import:
`_ "github.com/GoogleCloudPlatform/functions-framework-go"`
特定の Go バージョンで vendor
ディレクトリを使用する方法について詳細をご覧ください。