Cloud Functions の作成

Google Cloud Functions は Node.jsPythonGo で記述でき、言語固有のランタイムで実行されます。Cloud Functions の実行環境は、選択したランタイムによって異なります。ランタイム環境の詳細については、各ランタイムの概要ページをご覧ください。

Cloud Functions のタイプ

Cloud Functions には、HTTP 関数とバックグラウンド関数の 2 つのタイプがあります。

HTTP 関数

標準的な HTTP リクエストから HTTP 関数を実行します。この HTTP リクエストはレスポンスを待ち、GET、PUT、POST、DELETE、OPTIONS など、通常の HTTP リクエスト メソッドを処理します。Cloud Functions を使用する際は、TLS 証明書が自動的にプロビジョニングされるため、すべての HTTP 関数を、セキュアな接続を使用して呼び出すことができます。

詳しくは、HTTP 関数の作成をご覧ください。

例:

Node.js

const escapeHtml = require('escape-html');

/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 *                     More info: https://expressjs.com/en/api.html#req
 * @param {Object} res Cloud Function response context.
 *                     More info: https://expressjs.com/en/api.html#res
 */
exports.helloHttp = (req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
};

Python

from flask import escape

def hello_http(request):
    """HTTP Cloud Function.
    Args:
        request (flask.Request): The request object.
        <http://flask.pocoo.org/docs/1.0/api/#flask.Request>
    Returns:
        The response text, or any set of values that can be turned into a
        Response object using `make_response`
        <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>.
    """
    request_json = request.get_json(silent=True)
    request_args = request.args

    if request_json and 'name' in request_json:
        name = request_json['name']
    elif request_args and 'name' in request_args:
        name = request_args['name']
    else:
        name = 'World'
    return 'Hello {}!'.format(escape(name))

Go


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"encoding/json"
	"fmt"
	"html"
	"net/http"
)

// HelloHTTP is an HTTP Cloud Function with a request parameter.
func HelloHTTP(w http.ResponseWriter, r *http.Request) {
	var d struct {
		Name string `json:"name"`
	}
	if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
		fmt.Fprint(w, "Hello, World!")
		return
	}
	if d.Name == "" {
		fmt.Fprint(w, "Hello, World!")
		return
	}
	fmt.Fprintf(w, "Hello, %s!", html.EscapeString(d.Name))
}

バックグラウンド関数

バックグラウンド関数を使用すると、Pub/Sub トピックのメッセージや Cloud Storage バケットの変更など、Cloud インフラストラクチャのイベントを処理できます。

詳しくは、バックグラウンド関数の作成をご覧ください。

例:

Node.js 8+

/**
 * Background Cloud Function.
 *
 * @param {object} data The event payload.
 * @param {object} context The event metadata.
 */
exports.helloBackground = (data, context) => {
  return `Hello ${data.name || 'World'}!`;
};

Node.js 6(非推奨)

/**
 * Background Cloud Function.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.helloBackground = (event, callback) => {
  callback(null, `Hello ${event.data.name || 'World'}!`);
};

Python

def hello_background(event, context):
    """Background Cloud Function.
    Args:
         event (dict): The dictionary with data specific to the given event.
         context (google.cloud.functions.Context): The Cloud Functions event
         metadata.
    """
    if event and 'name' in event:
        name = event['name']
    else:
        name = 'World'
    return 'Hello {}!'.format(name)

Go


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"context"
	"log"
)

// PubSubMessage is the payload of a Pub/Sub event.
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// HelloPubSub consumes a Pub/Sub message.
func HelloPubSub(ctx context.Context, m PubSubMessage) error {
	name := string(m.Data)
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	return nil
}

ソースコードの構造化

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

Node.js

Node.js ランタイムでは、Node.js モジュールから関数のソースコードをエクスポートする必要があります。これにより、Cloud Functions は require() 呼び出しで読み込みを行います。読み込むモジュールを決めるために、Cloud Functions は package.jsonファイルの main フィールドを使用します。たとえば、main フィールドが指定されていない場合、Cloud Functions は index.js からコードを読み込みます。

たとえば、ソースコードでは次の構成が有効です。

  • プロジェクトのルートにあり、複数の関数をエクスポートする 1 つの index.js

    .
    └── index.js
    
  • コードを foo.js からインポートし、1 つ以上の関数をエクスポートする index.js ファイル。

    .
    ├── index.js
    └── foo.js
    
  • "main": "app.js" を含む package.json で 1 つ以上の関数を書き出す app.js

    .
    ├── app.js
    └── package.json
    

Python

Python ランタイムの場合、関数のエントリポイントは Python ソースファイルで main.py プロジェクトのルートに定義する必要があります。

たとえば、ソースコードでは次の構成が有効です。

  • プロジェクトのルートにあり、1 つ以上の関数を定義する 1 つの main.py:

    .
    └── main.py
    
  • 依存関係を指定した requirements.txt ファイルを含む main.py ファイル:

    .
    ├── main.py
    └── requirements.txt
    
  • ローカルの依存関係からコードをインポートする main.py ファイル:

    .
    ├── main.py
    └── mylocalpackage/
        ├── __init__.py
        └── myscript.py
    

Go

Go ランタイムの場合、関数はプロジェクト ルートの Go パッケージに存在している必要があります。関数を package main に含めることはできません。サブパッケージは、Go モジュールを使用している場合にのみサポートされます。

たとえば、ソースコードでは次の構成が有効です。

  • プロジェクトのルートにあり、1 つ以上の関数をエクスポートするパッケージ:

    .
    └── function.go
    
  • プロジェクトのルートにあり、サブパッケージからコードをインポートし、1 つ以上の関数をエクスポートするパッケージ:

    .
    ├── function.go
    ├── go.mod
    └── shared/
        └── shared.go
    
  • プロジェクトのルートにあり、package main を定義するサブディレクトリを持つパッケージ。

    .
    ├── cmd/
    |   └── main.go
    └── function.go
    

依存関係の指定

通常、関数の依存関係は、使用しているランタイムに基づいて指定します。詳細については、該当するページをご覧ください。

Cloud Functions の命名方法

Cloud Functions には、デプロイ時に name プロパティが設定されます。設定後は変更できません。関数の名前は識別子として使用されるため、リージョン内で一意にする必要があります。デフォルトでは、関数の名前はソースコードのエントリ ポイントとしても使用されます。たとえば、関数の名前を foo に設定した場合、デプロイするソースコード内で foo() 関数が実行されます。別の関数を実行する場合は、デプロイ時に --entry-point フラグを使用します。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Functions のドキュメント