このトピックでは、カスタムコンテナーランタイムのイベントハンドラーの構造特性、サンプルコード、およびFAQについて説明します。
背景情報
webサーバーモードのカスタムコンテナー関数の場合、function Computeは共通ヘッダー、リクエスト本文、POSTメソッド、/invokeおよび /initializeパスをコンテナー内のHTTPサーバーに転送します。 function Computeでサポートされているランタイム (Golangランタイムなど) のcontext
やevent
などの関数シグネチャを使用できます。 リクエストヘッダーと本文を入力パラメーターとして使用して、関数のサービスロジックを定義することもできます。 詳細は、「イベントハンドラー」をご参照ください。
非webサーバーモードのカスタムコンテナー関数の場合、function Computeは環境変数を使用してコンテナーの起動環境にボディを追加します。 os.GetEnv("FC_CUSTOM_CONTAINER_EVENT")
を使用して、イベント情報を取得し、カスタム操作を実行できます。
関数の呼び出し
webサーバーモードの関数がイベントハンドラーを使用する場合、HTTPサーバーは /invoke
パスとPOST
メソッドに対応するロジックのみを実装する必要があります。
パス | リクエスト | 期待される応答 |
POST |
| レスポンス本文: 関数ハンドラーの戻り値。 戻り値には、応答コードと応答ヘッダーが含まれます。
レスポンスヘッダーに
説明 HTTPレスポンスで |
webサーバーモードのカスタムコンテナーのサンプルコード
次のNode.js Expressの例では、関数インスタンスの初期化時にPOSTメソッドと /initializeがFunction Computeによって呼び出されます。 POSTメソッドと /invokeは、Function Computeが呼び出されるときにハンドラーとして機能します。 context
パラメーターとevent
パラメーターは、req.headers
とreq.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)
例
よくある質問
カスタムコンテナランタイムのリスニングポートは、カスタムコンテナランタイムで開始されたHTTPサーバーのリスニングポートと同じである必要がありますか。
カスタムコンテナランタイムで開始されたサービスでサードパーティサービスを呼び出すときにFunctionNotStartedエラーが発生した場合はどうすればよいですか?
「リクエストを完了する前に予期せず終了したプロセス」というエラーメッセージを含む502エラーが返された場合はどうすればよいですか?
Alibaba Cloudパブリックコンテナイメージを使用しない場合、Function Computeサービスロールにどのような権限を付与する必要がありますか。