HTTPハンドラーは、CAPortが設定されているカスタムコンテナー関数のみをサポートします。 このトピックでは、カスタムコンテナーのHTTPハンドラーの構造的な特性、呼び出しの説明、および制限について説明します。 このトピックでは、HTTPハンドラーの使用方法の例と、よくある質問に対する回答についても説明します。
背景情報
Function Computeは、メソッド、パス、クエリ、リクエストヘッダー、リクエスト本文、Function Computeによって生成された共通ヘッダーを含むリクエストをHTTPサーバーに転送します。 既存のHTTP webアプリケーションをスムーズに移行できます。 詳細は、「HTTP関数」をご参照ください。
関数の呼び出し
HTTPハンドラーを呼び出すために使用できるメソッドは、web API操作のメソッドと似ています。 cURL、Postman、またはブラウザーを使用して、HTTPハンドラーを呼び出すリクエストを送信できます。 ブラウザを使用してHTTPトリガーにアクセスすると、関数が強制的にダウンロードされる場合があります。 この問題を解決する方法の詳細については、「webブラウザーを使用してHTTPトリガー付きの関数にアクセスする場合、応答をダウンロードする必要があるのはなぜですか? 」をご参照ください。
ヘッダー | 説明 |
(オプション) x-fc-base-path | カスタムドメイン名を指定しない場合、x-fc-base-pathの値として |
(オプション) x-fc-status | このヘッダーは、イベント関数のヘッダーと同様に動作します。 これは、Function Computeに移行されていないが、web API操作を呼び出して作成されたHTTP関数に適用できます。 レスポンスヘッダーに
説明 HTTPレスポンスで |
使用上の注意
サービスの各バージョンまたはエイリアスのHTTP関数に対して作成できるHTTPトリガーは1つだけです。 詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
HTTPリクエストの制限
リクエストヘッダーは、x-fc- で始まるカスタムフィールドまたは次のフィールドをサポートしません。
接続
keep-alive
リクエストが次のいずれかの制限を超えた場合、システムは
400
ステータスコードとInvalidArgument
エラーコードを返します。ヘッダーサイズ: ヘッダー内のすべてのキーと値の合計サイズは8 KBを超えることはできません。
パスサイズ: すべてのクエリパラメーターを含むパスの合計サイズは、4 KBを超えることはできません。
ボディサイズ: 同期呼び出しリクエストのボディの合計サイズは32 MBを超えることはできません。 非同期呼び出し要求の本体の合計サイズは128 KBを超えることはできません。
HTTPレスポンスの制限
レスポンスヘッダーは、x-fc- で始まるカスタムフィールドまたは次のフィールドをサポートしていません。
接続
content-length
日付
keep-alive
サーバー
content-disposition: 添付
説明セキュリティ上の理由から、Function Computeのデフォルトのドメイン名e aliyuncs.comを使用すると、サーバーはcontent-disposition: attachmentフィールドをレスポンスヘッダーに強制的に追加します。 このフィールドにより、返された結果が添付ファイルとしてブラウザにダウンロードされます。 この制限を解除するには、カスタムドメイン名を指定する必要があります。 詳細については、「カスタムドメイン名の設定」をご参照ください。
応答が次のいずれかの制限を超えると、システムはステータスコード
502
とエラーBadResponse
を返します。ヘッダーサイズ: ヘッダー内のすべてのキーと値の合計サイズは8 KBを超えることはできません。
その他
カスタムドメイン名をバインドして、HTTP関数の異なるHTTPパスをマッピングできます。 詳細については、「カスタムドメイン名の設定」をご参照ください。 API Gatewayを使用して、バックエンドサービスタイプをHTTPに設定し、HTTP関数パスをバックエンドサービスアドレスとして指定することで、同様の機能を実装することもできます。 詳細については、次をご参照ください: Function ComputeをAPI操作のバックエンドサービスとして使用します。
サンプルコード
次のNode.js Expressの例では、GETメソッドとPOSTメソッドは異なるハンドラーにルーティングされます。 必要なハンドラーにパスをマップできます。
'use strict';
const express = require('express');
// Constants
const PORT = 9000;
const HOST = '0.0.0.0';
// HTTP function get
const app = express();
// Parse request body as JSON
app.use(express.json())
app.get('/*', (req, res) => {
console.log(req.body)
res.send('Hello FunctionCompute, http GET');
});
app.post('/*', (req, res) => {
console.log(req.body)
res.send('Hello FunctionCompute, http POST');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
例
よくある質問
カスタムコンテナランタイムのリスニングポートは、カスタムコンテナランタイムで開始されたHTTPサーバーのリスニングポートと同じである必要がありますか。
カスタムコンテナランタイムで開始されたサービスでサードパーティサービスを呼び出すときにFunctionNotStartedエラーが発生した場合はどうすればよいですか?
「リクエストを完了する前に予期せず終了したプロセス」というエラーメッセージを含む502エラーが返された場合はどうすればよいですか?
Alibaba Cloudパブリックコンテナイメージを使用しない場合、Function Computeサービスロールにどのような権限を付与する必要がありますか。