HTTP リクエスト経由で関数を呼び出す


関数は、リクエスト ハンドラで HTTP リクエストを介してトリガーできます。これにより、サポートされている HTTP メソッド(GETPOSTPUTDELETEOPTIONS)を使って関数を呼び出すことができます。

その他の HTTP オプション

オプション 説明
region HTTP 関数には、単一のリージョンだけでなく、リージョンの配列も指定できます。複数のリージョンが指定されている場合、リージョンごとに個別の関数インスタンスがデプロイされます。
timeoutSeconds(Python の場合は timeout_sec HTTP 関数には、最大 1 時間のタイムアウトを指定できます。
cors HTTP 関数には CORS ポリシーを指定できます。これを true に設定すると、すべてのオリジンを許可できます。stringregex、または array に設定して、許可するオリジンを指定することもできます。明示的に設定しない場合、デフォルトで false/no CORS ポリシーが使用されます。

CORS(クロスオリジン リソース シェアリング)の構成

cors オプションを使用して、関数にアクセスできるオリジンを制御します。デフォルトでは、HTTP 関数に CORS は構成されていません。つまり、関数に対するクロスオリジン リクエストを行うと、次のエラーが発生します。

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

関数の cors オプションを false に設定して、CORS を明示的に無効にすることもできます。

一部のクロスオリジン リクエストを許可する場合は、許可するドメインまたは正規表現のリストを渡します。たとえば、ドメイン firebase.comflutter.com を所有していて、firebase.com に多くのサブドメインが存在する場合、cors オプションを [/firebase\.com$/, 'flutter.com'](Node.js)または [r'firebase\.com$', r'https://flutter\.com'](Python)に設定します。

Node.js

const { onRequest } = require("firebase-functions/v2/https");

exports.sayHello = onRequest(
  { cors: [/firebase\.com$/, "flutter.com"] },
  (req, res) => {
    res.status(200).send("Hello world!");
  }
);

Python(プレビュー)

from firebase_functions import https_fn, options

@https_fn.on_request(
    cors=options.CorsOptions(
        cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
        cors_methods=["get", "post"],
    )
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

関数を公開する場合は(たとえば、公開 API やウェブサイトを処理する場合)、cors ポリシーを true に設定します。

HTTP リクエストで関数をトリガーする

プラットフォーム(onRequest() または on_request)のリクエスト ハンドラを使用して、HTTP イベントを処理する関数を作成します。このセクションの例は、HTTP GET リクエストを関数エンドポイントに送信するときにトリガーされるタイムサーバーのサンプルに基づいています。このサンプル関数では現在のサーバー時間を取得し、URL クエリ パラメータの指定に従って形式設定したうえで、結果を HTTP レスポンスで送信しています。

リクエスト オブジェクトとレスポンス オブジェクトの使用

リクエスト オブジェクトを使用すると、クライアントから送信された HTTP リクエストのプロパティにアクセスできます。レスポンス オブジェクトを使用すると、クライアントにレスポンスを返すことができます。

Node.js

exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
// ...
});

Python(プレビュー)

@https_fn.on_request(
    cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"])
)
def date(req: https_fn.Request) -> https_fn.Response:
    """Get the server's local date and time."""

既存の Express または Flask アプリを使用する

リクエスト ハンドラの引数としてアプリを使用すると、アプリ全体を HTTP 関数に渡すことができます。

Node.js

const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = onRequest(app);

Python(プレビュー)

from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask

initialize_app()
app = flask.Flask(__name__)

# Build multiple CRUD interfaces:


@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
    if id is not None:
        return db.reference(f"/widgets/{id}").get()
    else:
        return db.reference("/widgets").get()


@app.post("/widgets")
def add_widget():
    new_widget = flask.request.get_data(as_text=True)
    db.reference("/widgets").push(new_widget)
    return flask.Response(status=201, response="Added widget")


# Expose Flask app as a single Cloud Function:


@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
    with app.request_context(req.environ):
        return app.full_dispatch_request()


HTTP 関数の呼び出し

HTTP 関数はデプロイ後、その一意の URL を使って呼び出すことができます。デプロイ後、CLI から出力された正確な URL を使用します。

たとえば、date() を呼び出す URL は次のようになります。

https://us-central1-<project-id>.cloudfunctions.net/date

Express アプリと Flask アプリのルーティングでは、定義したアプリの URL パスに関数名が接頭辞として追加されます。

リクエストからの値の読み込み

date() 関数の例では、この関数は URL パラメータと本文の両方を format 値に対してテストし、使用する日時形式を設定します。

Node.js

let format = req.query.format;
format = req.body.format;

Python(プレビュー)

format = req.args["format"] if "format" in req.args else None

HTTP 関数の終了

サーバー時間を取得して形式を設定した後、その結果を HTTP レスポンスとして送信して date() 関数を終了します。

Node.js

必ず send()redirect()、または end() を使用して HTTP 関数を終了してください。そうしないと、関数は引き続き実行され、システムによって強制終了される可能性があります。同期、非同期、Promise もご覧ください。

const formattedDate = moment().format(`${format}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);

Python(プレビュー)

formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)

Firebase Hosting との統合

HTTP 関数を Firebase Hosting に接続できます。Firebase Hosting サイトでのリクエストを特定の HTTP 関数にプロキシできます。これにより、独自のカスタム ドメインを HTTP 関数とともに使用することもできます。詳しくは、Firebase Hosting への Cloud Functions の接続についてのドキュメントをご覧ください。