HTTP トリガーは、関数 URL と呼ばれる関数の HTTP(S) エンドポイントを提供し、HTTP リクエストを介して関数を直接呼び出すことができます。 このトピックでは、HTTP トリガーを使用して関数コンピューティングの組み込みランタイムで関数を呼び出す方法について説明します。 カスタムランタイムでのトリガーの使用方法については、「Web 関数」をご参照ください。
考慮事項
関数コンピューティング 3.0 では、カスタムランタイムまたはカスタムコンテナランタイムで実行される関数を呼び出す HTTP トリガーのメカニズムは、関数コンピューティング 2.0 と同じです。 ただし、HTTP トリガーが組み込みランタイムで実行される関数を呼び出す方法には、顕著な違いがあります。 詳細については、次のセクションをご参照ください。
呼び出しプロセス
組み込みランタイムでは、クライアントが関数 URL を呼び出すと、Function Compute はリクエストをイベントオブジェクト(event)にマッピングし、そのイベントオブジェクトを関数に渡します。関数の実行が完了すると、Function Compute は結果を HTTP レスポンスにマッピングし、クライアントに返送します。
リクエスト構造体
リクエスト構造体のフォーマット
リクエスト構造体のフォーマットは次のとおりです。
{
"version": "v1",
"rawPath": "/example",
"body": "Hello FC!",
"isBase64Encoded": false,
"headers": {
"header1": "value1",
"header2": "value1,value2"
},
"queryParameters": {
"parameter1": "value1",
"parameter2": "value1,value2"
},
"requestContext": {
"accountId": "123456*********",
"domainName": "<http-trigger-id>.<region-id>.fcapp.run",
"domainPrefix": "<http-trigger-id>",
"http": {
"method": "GET",
"path": "/example",
"protocol": "HTTP/1.1",
"sourceIp": "11.11.11.**",
"userAgent": "PostmanRuntime/7.32.3"
},
"requestId": "1-64f6cd87-*************",
"time": "2023-09-05T06:41:11Z",
"timeEpoch": "1693896071895"
}
}次の表にパラメーターを示します。
パラメーター | 説明 | 例 |
version | イベントのペイロードフォーマットバージョン。 現在サポートされているバージョンは v1 です。 | v1 |
rawPath | リクエストパス。 たとえば、リクエスト URL が | /example |
body | リクエスト本文。 マッピングプロセス中に、関数コンピューティングはバイナリデータの Base64 エンコーディングを実行します。 | Hello FC! |
isBase64Encoded | リクエスト本文が Base64 エンコードされているかどうかを指定します。 有効な値: true および false。 | false |
headers | リクエストヘッダーのリスト。キーと値のペアで表示されます。 1 つのキーに複数の値がある場合、それらの値はコンマ (,) で区切られます。 関数コンピューティング 3.0 が HTTP リクエストをイベントオブジェクトに変換するマッピングプロセスでは、各リクエストヘッダーキーの最初の文字が大文字に変換されます。これは正規化プロセスと呼ばれます。 詳細については、「HTTP トリガーを使用して関数を呼び出すと、ヘッダーキーの最初の文字が大文字になるのはなぜですか?」をご参照ください。 | {"Header1": "value1", "Header2": "value1,value2"} |
queryParameters | リクエストのクエリパラメーター。 たとえば、リクエスト URL が | { "parameter1": "value1", "parameter2": "value1,value2" } |
requestContext | requestId、リクエストが行われた時刻、承認された呼び出し元の ID など、リクエストに関する追加情報を含むオブジェクト。 | |
requestContext.accountId | 関数を所有する Alibaba Cloud アカウントの ID。 | 123456********* |
requestContext.domainName | HTTP トリガーのドメイン名。 | <http-trigger-id>.<region-id>.fcapp.run |
requestContext.domainPrefix | HTTP トリガーのドメインプレフィックス。 | <http-trigger-id> |
requestContext.http | HTTP リクエストに関する詳細情報を含むオブジェクト。 | |
requestContext.http.method | リクエストで使用される HTTP メソッド。 有効な値: GET、POST、PUT、HEAD、OPTIONS、PATCH、および DELETE。 | GET |
requestContext.http.path | リクエストパス。 たとえば、リクエスト URL が | /example |
requestContext.http.protocol | リクエストのプロトコル。 | HTTP/1.1 |
requestContext.http.sourceIp | リクエストを行う直接 TCP 接続の送信元 IP アドレス。 この IP アドレスは、接続を直接確立するピア IP アドレス (RemoteAddr) を指します。具体的には、サーバーに直接接続するクライアントのアドレス、またはクライアントが使用する最後のプロキシのアドレスです。
| 11.11.XX.XX |
requestContext.http.userAgent | user-agent リクエストヘッダーの値。 | PostmanRuntime/7.32.3 |
requestContext.requestId | リクエスト ID。 この ID を使用して、関数に関連する呼び出しログを追跡できます。 | 1-64f6cd87-************* |
requestContext.time | リクエストのタイムスタンプ。 | 2023-09-05T06:41:11Z |
requestContext.timeEpoch | リクエストのタイムスタンプ (UNIX 時間)。 | 1693896071895 |
リクエストマッピングロジック
Function Compute は、受信 HTTP リクエストをイベントオブジェクトにマッピングしてから、そのイベントオブジェクトを関数のハンドラに渡します。マッピングロジックは次のとおりです。
HTTP リクエストのヘッダーは、
eventheadersにマッピングされます。HTTP リクエストのクエリ文字列パラメーターは、
queryParametersにマッピングされます。HTTP リクエストのコンテキスト情報は、
requestContextにマッピングされます。POST リクエストのリクエスト本文は、
bodyにマッピングされます。
Base64 エンコーディングメカニズム
Function Compute が HTTP リクエストをイベントオブジェクト(event)にマッピングする場合、リクエストヘッダーの Content-Type の値をチェックして、Base64 エンコードを実行する必要があるかどうかを判断します。
Content-Typeの値がテキスト表現を示している場合、関数コンピューティングは Base64 エンコーディングを実行せず、isBase64Encodedパラメーターはeventでfalseに設定されます。それ以外の場合、リクエスト本文は Base64 エンコーディングを使用してテキスト形式に変換され、
isBase64Encodedパラメーターはtrueに設定されます。
次の Content-Type 値は、テキスト表現を示しています。
text/*
application/json
application/ld+json
application/xhtml+xml
application/xml
application/atom+xml
application/javascript
リクエストマッピングの例
GET
HTTP リクエスト | イベントオブジェクト |
| |
CLI に次のコマンドを入力して、上記の HTTP リクエストを送信できます。 https://example.cn-hangzhou.fcapp.run を関数の実際の URL に置き換えてください。
curl -v "https://example.cn-hangzhou.fcapp.run?parameter1=value1¶meter2=value2"POST
HTTP リクエスト | イベントオブジェクト |
| |
CLI に次のコマンドを入力して、上記の HTTP リクエストを送信できます。
https://example.cn-hangzhou.fcapp.runを関数の実際の URL に置き換えてください。curl -v -H "Content-Type: application/json" -d '{"message": "Hello"}' "https://example.cn-hangzhou.fcapp.run"リクエストを Base64 形式にエンコードする場合は、リクエストヘッダーの
Content-Typeをapplication/x-www-form-urlencodedに設定するだけです。
レスポンス構造体
レスポンス構造体のフォーマット
レスポンス構造体のフォーマットは次のとおりです。Function Compute は関数の出力を解析し、レスポンス構造体に変換し、この構造体を HTTP レスポンスにマッピングします。
{
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Custom-Header-1": "Custom Value" // カスタムヘッダー
},
"isBase64Encoded": false,
"body": "{\"message\":\"Hello FC!\"}"
}レスポンスマッピングロジック
関数出力を解析した後、Function Compute はレスポンス構造体を HTTP レスポンスにマッピングします。
関数が
statusCodeを含む有効な JSON を返す場合、マッピングプロセスは次のルールによって制御されます。JSON の
statusCodeは、HTTP レスポンスのstatusCodeにマッピングされます。JSON の
Content-Typeは、HTTP レスポンスのContent-Typeにマッピングされます。 JSON にContent-Typeパラメーターが含まれていない場合は、デフォルト値application/jsonが使用されます。JSON の
body(関数出力)は、HTTP レスポンスbodyにマッピングされます。JSON の
isBase64Encodedパラメーターは、HTTP レスポンスのisBase64Encodedパラメーターにマッピングされます。 JSON にisBase64Encodedパラメーターが含まれていない場合は、デフォルト値「false」が使用されます。
関数が
statusCodeを含まない有効な JSON を返す場合、または JSON 以外の形式でデータを返す場合、Function Compute は HTTP レスポンスを構築するために次の仮定を行います。statusCodeは 200 です。Content-Typeはapplication/jsonです。bodyは関数出力です。isBase64Encodedは false です。
結論として、Function Compute は関数から返されたデータを HTTP レスポンスに変換し、クライアントに返送します。
statusCodeは、HTTP レスポンスのステータスコードにマッピングされます。headersは、HTTP レスポンスヘッダーにマッピングされます。bodyは、HTTP レスポンス本文にマッピングされます。isBase64Encodedパラメーターが存在し、その値が true の場合、bodyデータは HTTP レスポンス本文にマッピングされる前にバイナリ形式にデコードされます。
レスポンスマッピングの例
このセクションでは、関数出力がレスポンス構造体にどのように解析され、その構造体がクライアントの HTTP レスポンスにどのようにマッピングされるかを示します。 クライアントが HTTP(S) エンドポイントを介して関数を呼び出すと、HTTP レスポンスを受信します。
文字列レスポンスの出力
関数出力 | 解析された関数出力 | HTTP レスポンス(クライアントへ) |
| | |
JSON レスポンスの出力
関数出力 | 解析された関数出力 | HTTP レスポンス(クライアントへ) |
| | |
カスタムレスポンスの出力
関数出力 | 解析された関数出力 | HTTP レスポンス(クライアントへ) |
| | |
Base64 デコードメカニズム
関数が isBase64Encoded パラメーターの値が true である有効な JSON を返す場合、Function Compute は JSON body に対して Base64 デコードを実行し、デコードされたデータを HTTP 応答本文にマッピングします。
JSON body のデコードに失敗した場合、Function Compute はエラーを報告しません。代わりに、JSON body の値をクライアントに直接返します。
HTTP 応答ヘッダー
関数 URL の呼び出しでは、Function Compute によって自動的に追加される応答ヘッダー X-Fc-Request-Id は、関数呼び出しをトリガーしたリクエストを一意に識別します。Function Compute は、他の応答ヘッダーを自動的に追加しません。
関数からカスタムヘッダーを返すことができます。X-Fc- で始まるカスタムヘッダーはサポートされていないことに注意してください。さらに、次の応答ヘッダーは Function Compute によって予約されているため、カスタムヘッダーとして使用できません。
connection
content-length
date
keep-alive
server
content-disposition
これらの予約済みヘッダーのいずれかがカスタムヘッダーとして使用されている場合、Function Compute はそれを単に無視します。
エラー処理
API 経由で呼び出された関数がエラーに遭遇した場合、エラーメッセージはレスポンスの一部として返され、HTTP 200 ステータスコードが返されます。たとえば、次のサンプルコードは、Python での ModuleNotFound エラーへの応答を示しています。
{
"errorMessage": "Unable to import module 'index'", // モジュール 'index' をインポートできません
"errorType": "ImportModuleError", // モジュールのインポートエラー
"stackTrace": [
"ModuleNotFoundError: No module named 'not_exist_module'" // モジュール not_exist_module という名前のモジュールが見つかりません
]
}ただし、関数 URL 呼び出しの場合、Function Compute はエラーメッセージを非表示にし、Internal Server Error のみを返します。HTTP ステータスコードは 502 です。次のサンプルコードは例を示しています。
HTTP/1.1 502 Bad Gateway
Content-Disposition: attachment // 添付ファイル
Content-Type: application/json // アプリケーション/json
X-Fc-Request-Id: 1-64f6df91-fe144d52e4fd27afe3d8dd6f
Date: Tue, 05 Sep 2023 07:58:09 GMT
Content-Length: 21
Internal Server Error // 内部サーバーエラーX-Fc-Request-Id レスポンスヘッダーを使用すると、関連するログを効率的に特定し、リクエストに関連付けられたエラーメッセージを識別できます。
参照資料
Function Compute 3.0 の組み込みランタイムでコードを記述している場合は、ハンドラに関する以下のトピックが役立つ場合があります。