関数の記述

このページでは、Functions フレームワークで関数を作成する方法について説明します。

Cloud Run の関数ソースコードを作成する場合は、Cloud Run 関数を記述するためのオープンソース ライブラリである Functions Framework を使用する必要があります。Functions Framework を使用すると、Cloud Run やローカル開発マシン、Knative ベースの環境など、さまざまな環境で実行される軽量関数を作成できます。

Functions Framework を使用すると、次のことができます。

  • リクエストに応じて関数を呼び出します。
  • イベントデータを一般的な方法で記述するための業界標準仕様である CloudEvents 仕様に準拠したイベントを自動的にアンマーシャルします。
  • ローカル開発用サーバーを起動して、迅速にテストします。

Functions Framework を使用して関数を作成する

Functions フレームワークは、モジュラー サービスを構築するためのインターフェースを提供します。ソースコードで Functions フレームワークを使用するには、以下を指定します。

関数のエントリ ポイント

ソースコードでは、関数のエントリ ポイントを定義する必要があります。エントリ ポイントは、Cloud Run 関数が呼び出されたときに実行されるコードです。このエントリ ポイントは、関数のデプロイ時に指定します。

エントリ ポイントの定義方法は、使用する言語ランタイムによって異なります。一部の言語では、エントリ ポイントが関数で、他の言語ではエントリ ポイントがクラスになっています。

署名の種類

Functions Framework で関数のソースコードを作成する場合は、次の 2 つの署名タイプのいずれかを指定する必要があります。

  • HTTP 関数: HTTP ハンドラ関数を登録する関数。詳細については、HTTP 関数を作成するをご覧ください。
  • CloudEvents 関数(イベント ドリブン関数とも呼ばれます): CloudEvents ハンドラ関数を登録する関数。詳細については、CloudEvents 関数を作成するをご覧ください。

関数で URL エンドポイントを使用し、Webhook などの HTTP リクエストに応答する必要がある場合は、HTTP 関数を使用します。Pub/Sub トピックのメッセージや Cloud Storage バケットの変更など、Google Cloud プロジェクト内のイベントに応答して関数を直接トリガーする場合は、CloudEvents 関数を使用します。

ソース ディレクトリの構造

Functions Framework は、多くのプログラミング言語でサポートされています。選択した言語ランタイムと記述する関数のタイプによって、コードを構造化して関数を実装する方法が異なります。

Cloud Run で関数の定義を見つけられるように、言語ランタイムごとにソースコードの構造について要件があります。

Node.js

Node.js 関数の基本的なディレクトリ構造は次のとおりです。

.
├── index.js
└── package.json

デフォルトでは、Cloud Run は関数ディレクトリのルートにある index.js というファイルからソースコードを読み込みます。別のメイン ソースファイルを指定するには、package.json ファイルの main フィールドを使用します。

package.json ファイルには、依存関係として Functions Framework for Node.js も含める必要があります。

{
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  }
}

メインファイル内のコードで関数エントリ ポイントを定義する必要があります。他のコードおよび Node.js モジュールはインポートできます。メインファイルでは、個別にデプロイ可能な複数の関数エントリ ポイントを定義できます。

詳細については、Node.js 用 Functions Framework をご覧ください。

Python

Python 関数の基本的なディレクトリ構造は次のとおりです。

.
├── main.py
└── requirements.txt

Cloud Run は、関数ディレクトリのルートにある main.py という名前のファイルからソースコードを読み込みます。メインファイルの名前は main.py にする必要があります。

requirements.txt ファイルには、依存関係として Functions Framework for Python が含まれている必要があります。

functions-framework==3.*

main.py ファイルのコードで関数エントリ ポイントを定義する必要があります。他のコードと外部依存関係は通常どおりインポートできます。また、main.py ファイルを使用して、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。

詳細については、Python 用 Functions Framework をご覧ください。

Go

Go 関数の基本的なディレクトリ構造は次のとおりです。

.
├── myfunction.go
└── go.mod

関数は、Go パッケージ内のプロジェクトのルートに置く必要があります。パッケージとそのソースファイルには任意の名前を付けることができます。ただし、関数を package main に含めることはできません。ローカルテストなどで main パッケージが必要な場合は、サブディレクトリにパッケージを作成できます。

.
├── myfunction.go
├── go.mod
└── cmd/
  └── main.go

go.mod ファイルには、依存関係として Functions Framework for Go が含まれている必要があります。

module example.com/my-module

require (
  github.com/GoogleCloudPlatform/functions-framework-go v1.5.2
)

ルート パッケージのコードは関数エントリ ポイントを定義する必要があります。サブパッケージと依存関係から通常どおり他のコードをインポートできます。また、パッケージで、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。

詳細については、Go 用 Functions Framework をご覧ください。

Java

Java 関数の基本的なディレクトリ構造は次のとおりです。

.
├── pom.xml
└── src/
  └── main/
      └── java/
          └── MyFunction.java

Java のソースファイルは src/main/java/ ディレクトリに配置する必要があり、任意の名前を付けることができます。ソースファイルでパッケージが宣言されている場合は、src/main/java の下にパッケージの名前を含むディレクトリを追加します。

.
├── pom.xml
└── src/
  └── main/
      └── java/
          └── mypackage/
              └── MyFunction.java

関連するテストを src/test/java/ サブディレクトリに配置することをおすすめします。

pom.xml ファイルには、依存関係として Functions Framework for Java が含まれている必要があります。

...
    <dependency>
      <groupId>com.google.cloud.functions</groupId>
      <artifactId>functions-framework-api</artifactId>
      <version>1.0.4</version>
    </dependency>
...

ソースファイルのコードは関数のエントリ ポイントを定義します。他のコードおよび外部依存関係は通常どおりインポートできます。また、ソースファイルで、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。

詳細については、Java 用 Functions Framework をご覧ください。

.NET

.NET 関数の基本的なディレクトリ構造は次のとおりです。

.
├── MyFunction.cs
└── MyProject.csproj

プロジェクトは、他の .NET ソースコードと同じように構造化できます。ソースファイルには任意の名前を付けることができます。

プロジェクト ファイルには、依存関係として Functions Framework for .NET が含まれている必要があります。

...
    <PackageReference Include="Google.Cloud.Functions.Hosting" Version="1.0.0" />
...

ソースファイルのコードは関数のエントリ ポイントを定義します。他のコードおよび外部依存関係は通常どおりインポートできます。また、ソースファイルで、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。

詳細については、Functions Framework for .NET をご覧ください。

Ruby

Ruby 関数の基本的なディレクトリ構造は次のとおりです。

.
├── app.rb
├── Gemfile
└── Gemfile.lock

Cloud Run は、関数ディレクトリのルートにある app.rb という名前のファイルからソースコードを読み込みます。メインファイルの名前は app.rb にする必要があります。

Gemfile ファイルには、依存関係として Functions Framework for Ruby が含まれている必要があります。

source "https://rubygems.org"
gem "functions_framework", "~> 1.0"

app.rb ファイルのコードで関数エントリ ポイントを定義する必要があります。他のコードと外部依存関係は通常どおりインポートできます。また、app.rb ファイルを使用して、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。

詳細については、Ruby 用 Functions Framework をご覧ください。

PHP

PHP 関数の基本的なディレクトリ構造は次のとおりです。

.
├── index.php
└── composer.json

Cloud Run は、関数ディレクトリのルートにある index.php という名前のファイルからソースコードを読み込みます。メインファイルの名前は index.php にする必要があります。

composer.json ファイルには、依存関係として Functions Framework for PHP が含まれている必要があります。

{
  "require": {
    "google/cloud-functions-framework": "^1.1"
  }
}

index.php ファイルのコードで関数エントリ ポイントを定義する必要があります。他のコードと外部依存関係は通常どおりインポートできます。また、index.php ファイルを使用して、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。

詳細については、Functions Framework for PHP をご覧ください。

複数の関数を 1 つのプロジェクトにグループ化する場合、すべての関数が同じ依存関係のセットを共有する結果になる可能性があります。ただし、一部の関数は依存関係の全部は必要としない場合があります。

可能であれば、大規模な関数のコードベースを分割し、上記の例のように、独自のソースファイルとプロジェクト構成ファイルで各関数を最上位のディレクトリに配置することをおすすめします。このアプローチにより、特定の関数に必要な依存関係の数が最小限に抑えられ、関数が必要とするメモリ量が削減されます。

次のステップ