Cloud Functions を作成する

Cloud Functions は、複数のプログラミング言語でソースコードの書き込みをサポートしています。選択した言語ランタイムと作成する関数の種類によって、コードを構造化し、関数を実装する方法が決まります。このページでは、Cloud Functions のタイプの概要とソースコードに期待することについて説明します。

Cloud Functions のタイプ

Cloud Functions の関数には次の 2 つのタイプがあります。

関数で 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 関数を作成するおよびイベント ドリブン関数を作成するをご覧ください。

依存関係

依存関係は、ランタイムごとに標準ツールを使用して管理できます。詳細については、該当するページをご覧ください。

次のステップ