すべてのプロダクト
Search
ドキュメントセンター

Function Compute:イベントハンドラー

最終更新日:Oct 18, 2024

このトピックでは、カスタムコンテナーランタイムのイベントハンドラーの構造特性、サンプルコード、およびFAQについて説明します。

背景情報

webサーバーモードのカスタムコンテナー関数の場合、function Compute共通ヘッダー、リクエスト本文、POSTメソッド、/invokeおよび /initializeパスをコンテナー内のHTTPサーバーに転送します。 function Computeでサポートされているランタイム (Golangランタイムなど) のcontexteventなどの関数シグネチャを使用できます。 リクエストヘッダーと本文を入力パラメーターとして使用して、関数のサービスロジックを定義することもできます。 詳細は、「イベントハンドラー」をご参照ください。

非webサーバーモードのカスタムコンテナー関数の場合、function Computeは環境変数を使用してコンテナーの起動環境にボディを追加します。 os.GetEnv("FC_CUSTOM_CONTAINER_EVENT") を使用して、イベント情報を取得し、カスタム操作を実行できます。

関数の呼び出し

webサーバーモードの関数がイベントハンドラーを使用する場合、HTTPサーバーは /invokeパスとPOSTメソッドに対応するロジックのみを実装する必要があります。

パス

リクエスト

期待される応答

POST /invoke

  • リクエスト本文: 関数入力。これは、InvokeFunction操作を呼び出すときに指定するペイロードです。

  • リクエストヘッダー: 共通リクエストヘッダー。 詳細については、「Function Computeの一般的なリクエストヘッダー」をご参照ください。

    重要

    Content-Typeapplication/octet-streamである必要があります。

レスポンス本文: 関数ハンドラーの戻り値。 戻り値には、応答コードと応答ヘッダーが含まれます。

  • HTTPステータスコード (StatusCode)

    • 200: 成功

    • 404: 失敗

  • レスポンスヘッダー (x-fc-status)

    • 200: 成功

    • 404: 失敗

レスポンスヘッダーにx-fc-statusフィールドを含めて、ローカル関数が正常に呼び出されたかどうかをFunction Computeに報告できます。

  • x-fc-statusフィールドに値を指定しない場合、Function Computeは呼び出しが成功したと見なされます。 関数の実行中にエラーが発生した場合、システムはfunction Computeにエラーを報告しません。 この場合、ビジネスロジックは影響を受けませんが、Function Computeの可観測性は影響を受けます。 次の図に例を示します。image8hanshujisuanruntime

  • x-fc-statusフィールドに値を指定した場合、システムはx-fc-statusフィールドを使用して関数呼び出しの失敗をfunction Computeに報告します。 関数の呼び出し中にエラーが発生した場合、システムはエラースタック情報をログに記録します。 次の図に例を示します。image9runtimefc

説明

HTTPレスポンスでStatusCodeおよびx-fc-statusフィールドを指定することを推奨します。

webサーバーモードのカスタムコンテナーのサンプルコード

次のNode.js Expressの例では、関数インスタンスの初期化時にPOSTメソッドと /initializeFunction Computeによって呼び出されます。 POSTメソッドと /invokeは、Function Computeが呼び出されるときにハンドラーとして機能します。 contextパラメーターとeventパラメーターは、req.headersreq.bodyから取得され、関数呼び出しの結果がHTTP応答として返されます。

'use strict';

const express = require('express');

// Constants.
const PORT = 9000;
const HOST = '0.0.0.0';
const app = express();
// Parse the JSON-formatted request body.
app.use(express.json({type:['application/json', 'application/octet-stream']}))


// The example of the Initializer hook. You must configure the Initializer hook when you create the function.
app.post('/initialize', (req, res) => {
  console.log(req.body)
  res.send('Hello FunctionCompute, /initialize\n');
});


// Invoke the event function.
app.post('/invoke', (req, res) => {
  console.log(req.body)
  res.send('Hello FunctionCompute, event function\n');
});

var server = app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

server.timeout = 0; // Never time out.
server.keepAliveTimeout = 0; // keepalive, never timeout

非webサーバーモードのカスタムコンテナー関数のサンプルコード

次のPythonイメージの例では、イベントトリガーコンテンツはFC_CUSTOM_CONTAINER_eventを使用して取得されます。

import os

if __name__ == '__main__':
    FC_EVENT = os.environ['FC_CUSTOM_CONTAINER_EVENT']
    print("Hello serverless image")
    print("FC event is: " + FC_EVENT)

よくある質問