関数は、リクエスト ハンドラで HTTP リクエストを介してトリガーできます。これにより、サポートされている HTTP メソッド(GET
、POST
、PUT
、DELETE
、OPTIONS
)を使って関数を呼び出すことができます。
その他の HTTP オプション
オプション | 説明 |
---|---|
region |
HTTP 関数には、単一のリージョンだけでなく、リージョンの配列も指定できます。複数のリージョンが指定されている場合、リージョンごとに個別の関数インスタンスがデプロイされます。 |
timeoutSeconds (Python の場合は timeout_sec ) |
HTTP 関数には、最大 1 時間のタイムアウトを指定できます。 |
cors |
HTTP 関数には CORS ポリシーを指定できます。これを true に設定すると、すべてのオリジンを許可できます。string 、regex 、または 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.com
と flutter.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 関数とともに使用することもできます。詳しくは、Cloud Functions を Firebase Hosting に接続するをご覧ください。