Cloud Functions の関数を作成する

Cloud Functions では、多くのプログラミング言語でソースコードを記述できます。選択した言語ランタイムと記述する関数のタイプによって、コードを構造化して関数を実装する方法が異なります。このページでは、Cloud Functions の関数のタイプの概要とソースコードの要件について説明します。

Cloud Functions の関数のタイプ

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

関数で URL エンドポイントを使用し、Webhook などの HTTP リクエストに応答する必要がある場合は、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 関数の作成およびイベント ドリブン関数の作成をご覧ください。

依存関係

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

次のステップ