Cloud Functions を作成する
Cloud Functions は、複数のプログラミング言語でソースコードの書き込みをサポートしています。選択した言語ランタイムと作成する関数の種類によって、コードを構造化し、関数を実装する方法が決まります。このページでは、Cloud Functions のタイプの概要とソースコードに期待することについて説明します。
Cloud Functions のタイプ
Cloud Functions の関数には次の 2 つのタイプがあります。
HTTP 関数: HTTP リクエストを処理し、HTTP トリガーを使用します。HTTP 関数の実装については、HTTP 関数の作成をご覧ください。
イベント ドリブン関数、クラウド環境からイベントを処理し、Cloud Functions トリガーで説明されているイベント トリガーを使用します。イベント ドリブン関数の実装については、イベント ドリブン関数の書き込みをご覧ください。
関数で URL エンドポイントを取得し、HTTP リクエスト(Webhook など)に応答する必要がある場合は、HTTP 関数を使用します。Pub/Sub トピックのメッセージや Cloud Storage バケットの変更など、Google Cloud プロジェクト内のイベントに応答して関数を直接トリガーする必要がある場合は、イベント ドリブン関数を使用します。
ソースのディレクトリ構造
Cloud Functions で関数の定義を見つけられるよう、各言語のランタイムにはソースコードの構造化に関する要件があります。各ランタイムの関数の基本的なディレクトリ構造は次のとおりです。
Node.js
Node.js 関数の基本的なディレクトリ構造は次のとおりです。
. ├── index.js └── package.json
デフォルトでは、Cloud Functions は関数ディレクトリのルートにある 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 モジュールを通常どおりインポートできます。メインファイルでは、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
Python
Python 関数の基本的なディレクトリ構造は次のとおりです。
. ├── main.py └── requirements.txt
Cloud Functions は、関数ディレクトリのルートにある main.py
という名前のファイルからソースコードを読み込みます。メインファイルの名前は main.py
にする必要があります。
requirements.txt
ファイルには、依存関係として Functions Framework for Python が含まれている必要があります。
functions-framework==3.*
main.py
ファイルのコードでは、関数エントリ ポイントを定義する必要があります。他のコードや外部依存関係は、通常どおりにインポートできます。main.py
ファイルには、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
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
)
ルート パッケージのコードは関数のエントリ ポイントを定義する必要があります。また、通常どおりにサブパッケージと依存関係から他のコードをインポートできます。パッケージには、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
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>
...
ソースファイル内のコードは、関数のエントリ ポイントを定義する必要があり、他のコードや外部依存関係を通常どおりインポートできます。ソースファイルでは、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
C#
.NET 関数の基本的なディレクトリ構造は次のとおりです。
. ├── MyFunction.cs └── MyProject.csproj
他の .NET ソースコードと同様にプロジェクトを構造化します。ソースファイルには任意の名前を付けることができます。
プロジェクト ファイルに、依存関係として Functions Framework for .NET が含まれている必要があります。
...
<PackageReference Include="Google.Cloud.Functions.Hosting" Version="1.0.0" />
...
ソースファイル内のコードは、関数のエントリ ポイントを定義する必要があり、他のコードや外部依存関係を通常どおりインポートできます。ソースファイルでは、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
.NET 用の Cloud Functions テンプレート パッケージを使用して、必要なファイルを生成することもできます。
Ruby
Ruby 関数の基本的なディレクトリ構造は次のとおりです。
. ├── app.rb ├── Gemfile └── Gemfile.lock
Cloud Functions は、関数ディレクトリのルートにある app.rb
という名前のファイルからソースコードを読み込みます。メインファイルの名前は app.rb
にする必要があります。
Gemfile
ファイルには、依存関係として Functions Framework for Ruby が含まれている必要があります。
source "https://rubygems.org"
gem "functions_framework", "~> 1.0"
app.rb
ファイルのコードでは、関数エントリ ポイントを定義する必要があります。他のコードや外部依存関係は、通常どおりインポートできます。app.rb
ファイルには、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
PHP
PHP 関数の基本的なディレクトリ構造は次のとおりです。
. ├── index.php └── composer.json
Cloud Functions は、関数ディレクトリのルートにある index.php
という名前のファイルからソースコードを読み込みます。メインファイルの名前は index.php
にする必要があります。
composer.json
ファイルには、依存関係として Functions Framework for PHP が含まれている必要があります。
{
"require": {
"google/cloud-functions-framework": "^1.1"
}
}
index.php
ファイルのコードでは、関数エントリ ポイントを定義する必要があります。他のコードや外部依存関係は、通常どおりインポートできます。index.php
ファイルには、個別にデプロイできる複数の関数エントリ ポイントを定義することもできます。
複数の関数を 1 つのプロジェクトにグループ化する場合、すべての関数が同じ依存関係のセットを共有する結果になる可能性があります。 ただし、一部の関数はすべての依存関係を必要としない場合があります。
可能であれば、大規模な多関数のコードベースを分割し、各関数を独自のソースファイルとプロジェクト構成ファイルとともに、独自の最上位ディレクトリに配置することをおすすめします。このアプローチにより、特定の関数に必要な依存関係の数が最小限に抑えられ、関数が必要とするメモリ量が削減されます。
関数のエントリ ポイント
ソースコードでは、関数のエントリ ポイントを定義する必要があります。エントリ ポイントは、Cloud Functions の関数が呼び出されたときに実行される特定のコードです。このエントリ ポイントは、関数をデプロイするときに指定します。
エントリ ポイントの定義方法は、使用する言語ランタイムによって異なります。一部の言語ではエントリ ポイントが関数ですが、他の言語ではエントリ ポイントがクラスです。エントリ ポイントの定義とさまざまな言語での Cloud Functions の実装について詳しくは、HTTP 関数を作成するおよびイベント ドリブン関数を作成するをご覧ください。
依存関係
依存関係は、ランタイムごとに標準ツールを使用して管理できます。詳細については、該当するページをご覧ください。
- Node.js での依存関係の指定
- Python での依存関係の指定
- Go での依存関係の指定
- Java での依存関係の指定
- .NET での依存関係の指定
- Ruby での依存関係の指定
- PHP での依存関係の指定
次のステップ
- HTTP 関数を作成する方法を学習する。
- イベント ドリブン関数を作成する方法を学習する。
- Cloud Functions のトリガーについて学習する。