Functions Framework を使用して関数を実行する

Cloud Functions は、オープンソースの Functions Framework ライブラリを使用して、デプロイされた関数を永続的な HTTP アプリケーションでラップします。

Functions Framework は、ローカルマシン、オンプレミス サーバー、Compute EngineCloud Run など、言語自体をサポートする他のプラットフォームでも実行できます。

依存関係をインストールする

関数のディレクトリに、使用する言語の Functions Framework ライブラリをインストールします。

詳細については、Java Functions Framework ライブラリをご覧ください。

Node.js

npm install --save-dev @google-cloud/functions-framework

Python

pip install functions-framework

Go

go install github.com/GoogleCloudPlatform/functions-framework-go/funcframework

Java

Maven

Maven を使用している場合は、次のものを pom.xml ファイルに追加します。

<dependency>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>functions-framework-api</artifactId>
  <version>1.1.0</version>
  <scope>provided</scope>
</dependency>

Gradle

Gradle を使用している場合は、次のものを build.gradle ファイルに追加します。

dependencies {
  // Every function needs this dependency to get the Functions Framework API.
  compileOnly 'com.google.cloud.functions:functions-framework-api:1.1.0'

  // To run function locally using Functions Framework's local invoker
  invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.3.1'
}

C#

以下のコマンドは、.NET Templates を使用して、.NET Functions Framework ライブラリを依存関係とする .NET Cloud Functions の新しい関数のコードベースを作成します。

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

Ruby では、Cloud Functions にデプロイするために Functions Framework を関数の依存関係に追加する必要があります

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

Functions Framework を構成する

Functions Framework を使用して関数を実行する前に、実行する関数のタイプと名前を指定する必要があります。これらの属性は、コマンドライン インターフェース(CLI)のフラグ、または環境変数として指定できます。

サポートされる関数のタイプ

Functions Framework 全体では、Cloud Functions でサポートされている 3 つのタイプの関数をすべてサポートしています。すべての言語ランタイムは、http と、event または cloudevent のいずれかをサポートします。

関数タイプ 署名タイプ 説明 サポート ランタイム
HTTP でトリガーされる関数 http HTTP リクエストを受信して応答する関数。 すべてのランタイム
バックグラウンド関数 event Cloud Functions 固有のイベント形式 第 1 世代のみ: Node.jsPythonGoJava
CloudEvent 関数 cloudevent 業界標準のイベント形式 第 2 世代: すべてのランタイム
第 1 世代: .NETRubyPHP

実行する関数を指定する

Functions Framework で関数を実行する前に、コード内のどの関数を実行するかを指定する必要があります。ほとんどの言語では、以下の表にあるターゲット モデルのメソッド名を指定します(Java.NET など、このルールに対する例外も記載されています)。

言語ごとの手順

各言語でサポートされている構成オプションの一覧については、以下の表をご覧ください。

Node.js

CLI の引数 環境変数 説明
--port PORT リクエストをリッスンするポート。(デフォルト: 8080
--target FUNCTION_TARGET 呼び出される export 関数の名前。(デフォルト: function
--signature-type FUNCTION_SIGNATURE_TYPE 関数で使用される署名タイプ。http(デフォルト)、eventcloudevent のいずれかになります。

Python

CLI の引数 環境変数 説明
--port PORT リクエストをリッスンするポート。(デフォルト: 8080
--target FUNCTION_TARGET 呼び出される export 関数の名前。(デフォルト: function
--signature-type FUNCTION_SIGNATURE_TYPE 関数で使用される署名タイプ。http(デフォルト)、eventcloudevent のいずれかになります。

Go

環境変数 説明
PORT リクエストをリッスンするポート。(デフォルト: 8080

Java

引数名 環境変数 説明
run.port PORT リクエストをリッスンするポート。(デフォルト: 8080
run.functionTarget FUNCTION_TARGET 呼び出される export 関数の名前。(デフォルト: function

C#

CLI の引数 環境変数 説明
--port PORT リクエストをリッスンするポート。(デフォルト: 8080
--target(または引数のみ) FUNCTION_TARGET 呼び出される関数の classname。(デフォルト: function

Ruby

CLI の引数 環境変数 説明
--port PORT リクエストをリッスンするポート。(デフォルト: 8080
--target FUNCTION_TARGET 呼び出される export 関数の名前。(デフォルト: function

PHP

環境変数 説明
FUNCTION_TARGET 呼び出される関数の名前。(デフォルト: function
FUNCTION_SIGNATURE_TYPE 関数で使用される署名タイプ。http(デフォルト)、eventcloudevent のいずれかになります。

Functions Framework を構成して実行する手順は次のとおりです。

Node.js

Node.js Functions Framework では、関数の名前と署名タイプをコマンドライン引数または環境変数で指定できます。

以下の例に示すように、必要な CLI 引数を指定した start スクリプトを追加して、これらの値を package.json ビルドファイルに指定することもできます。

"scripts": {
  "start": "npx functions-framework --target=YOUR_FUNCTION_NAME [--signature-type=YOUR_SIGNATURE_TYPE]"
}

YOUR_FUNCTION_NAME は関数のメソッド名で置き換えます。YOUR_SIGNATURE_TYPE(該当する場合)は、上の表にある関数の署名タイプで置き換えます。

Python

Python Functions Framework では、関数の名前と署名タイプをコマンドライン引数または環境変数で指定できます。コマンドライン引数は、フレームワークを実行するときに指定する必要があります。

Go

Go Functions Framework では、funcframework.RegisterHTTPFunctionContext を使用して関数の対象と署名タイプを指定します。

Java

Java Functions Framework は、次の 3 つのソースから構成データを受け取ります(優先順位の最も高いものから順に示します)。

  • コマンドライン引数
  • ビルドファイル
  • 環境変数

コマンドライン引数

Maven

実行するコマンドラインを指定するには、次のコマンドライン インターフェース(CLI)フラグを mvn コマンドに追加します。

-Drun.functionTarget=YOUR_FUNCTION_NAME

同様の CLI フラグを追加して、ターゲット ポートを指定することもできます。

-Drun.port=12345

Gradle

Gradle の CLI フラグは、Maven の場合とほぼ同じです。Gradle の場合は、以下に示すように、各フラグの先頭の -D-P に置き換えます。

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

ビルドファイル

実行する関数は、プロジェクトのビルドファイルで指定することもできます。Maven と Gradle には同様の CLI フラグがありますが、buildfile 句は大きく異なります。

Maven

Maven ビルドファイルの名前は pom.xml です。このファイルに次の句を追加して、ターゲット関数を指定します。

<plugin>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>function-maven-plugin</artifactId>
  <version>0.11.0</version>
  <configuration>
    <functionTarget>functions.HelloWorld</functionTarget>
  </configuration>
</plugin>

<functionTarget> は、関数のクラス名に置き換えます。(たとえば、パッケージ functions 内のクラス名が HelloCloudFunctions の場合、クラス名は functions.HelloCloudFunctions になります。これは、親のビルドファイル(pom.xml または build.gradle)からの相対パスです)。

Gradle

Gradle ビルドファイルの名前は、build.gradle です。このファイルに次の句を追加して、ターゲット関数を指定します。

// Register a "runFunction" task to run the function locally
tasks.register("runFunction", JavaExec) {
  main = 'com.google.cloud.functions.invoker.runner.Invoker'
  classpath(configurations.invoker)
  inputs.files(configurations.runtimeClasspath, sourceSets.main.output)
  args(
    '--target', project.findProperty('run.functionTarget') ?: '',
    '--port', project.findProperty('run.port') ?: 8080
  )
  doFirst {
    args('--classpath', files(configurations.runtimeClasspath, sourceSets.main.output).asPath)
  }
}

C#

dotnet new と上記のいずれかのテンプレートを使用してプロジェクトを作成すると、.NET Functions Framework によって関数が自動的に検出されます。

プロジェクトに複数の関数がある場合は、フレームワークの実行セクションで関数の実行方法を確認してください。

Ruby

Ruby Functions Framework では、関数の名前と署名タイプをコマンドライン引数または環境変数で指定できます。コマンドライン引数は、フレームワークを実行するときに指定する必要があります。

PHP

PHP Functions Framework では、環境変数をコマンドライン環境変数として指定できます。

また、次の例に示すように、start スクリプトを追加することで、これらの値を composer.json ビルドファイルに指定することもできます。

"scripts": {
   "start": [
       "Composer\\Config::disableProcessTimeout",
       "FUNCTION_TARGET=YOUR_FUNCTION_NAME php -S localhost:${PORT:-8080} vendor/bin/router.php"
    ]
}

YOUR_FUNCTION_NAMEは、関数の名前で置き換えます。YOUR_SIGNATURE_TYPE(該当する場合)は、上の表にある関数の署名タイプに置き換えます。

Functions Framework を実行する

Functions Framework を使用して関数を実行するには、次のコマンドを使用します。デフォルトでは、PORT 値を明示的に指定しない限り、関数には localhost:8080 でアクセスできます。

Node.js

npm start

Python

functions-framework --target=YOUR_FUNCTION_NAME

YOUR_FUNCTION_NAME は、関数のメソッド名に置き換えます。

Go

cd cmd
go build
./cmd

Java

Maven

次のコマンドを使用して、pom.xml で指定された関数を実行します。

mvn function:run

コマンドライン引数で指定された関数を実行するには、次のコマンドを使用します。

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

YOUR_FUNCTION_NAME は、関数のクラス名に置き換えます。

Gradle

次のコマンドを使用して、build.gradle で指定された関数を実行します。

./gradlew runFunction

コマンドライン引数で指定された関数を実行するには、次のコマンドを使用します。

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

YOUR_FUNCTION_NAME は、関数のクラス名に置き換えます。

C#

現在の .NET プロジェクトに関数が 1 つだけ存在する場合は、次のコマンドを使用して関数を実行します(これは、テンプレートで作成されたプロジェクトのデフォルトの構造です)。

dotnet run

.NET プロジェクトに複数の関数が含まれている場合は、次のコマンドを使用して特定の関数を実行します。YOUR_FUNCTION_CLASSNAME は、関数のクラス名(名前空間を含む)で置き換えます。

dotnet run YOUR_FUNCTION_CLASSNAME

複数の関数を同時に実行する場合は、複数の Functions Framework インスタンスを実行する必要があります。実行中のフレームワーク インスタンス間の競合を回避するため、各インスタンスで異なる PORT 値を使用する必要があります。次のコマンドは、PORT の値が 8080 の関数を実行する方法を示しています。

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Ruby

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

YOUR_FUNCTION_NAME は、関数のメソッド名に置き換えます。

PHP

export FUNCTION_TARGET=YOUR_FUNCTION_NAME
php -S localhost:8080 vendor/bin/router.php

YOUR_FUNCTION_NAME は、関数の名前に置き換えます。

関数を呼び出す

ローカルで実行する関数を操作する方法については、ローカル関数の呼び出しページをご覧ください。

クリーンアップ

関数の実行が終了したら、Ctrl + C を押して実行中のフレームワーク インスタンスを停止します。