このトピックでは、カスタムランタイムでの関数呼び出しのメソッド、制限、およびサンプルコードについて説明します。
背景
カスタムランタイムでは、HTTPサーバーをホストできます。 関数呼び出しは、HTTPリクエストに変換してHTTPサーバーに送信できます。 HTTPサーバの応答は、関数呼び出しの応答としてクライアントに送信することができる。 次の図にプロセスを示します。
関数は、次のいずれかのメソッドを使用して呼び出すことができます。
HTTP呼び出し (推奨): HTTP呼び出しを使用して関数を呼び出すことができます。 たとえば、HTTPトリガーまたはカスタムドメイン名を使用して関数を呼び出すことができます。
API呼び出し: InvokeFunction操作を呼び出して関数を呼び出すことができます。 たとえば、SDKを使用して関数を呼び出したり、イベントソースを使用して関数をトリガーしたりできます。
HTTPサーバーのリクエストとレスポンスの形式は、呼び出し方法によって異なります。
制限事項
各バージョンまたはエイリアスのHTTP関数に対して作成できるHTTPトリガーは1つだけです。 詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
HTTPリクエストの制限
リクエストヘッダーは、x-fc- で始まるカスタムフィールドまたは次のフィールドをサポートしません。
connection
keep-alive
リクエストが次のいずれかの制限を超えた場合、システムは
400
ステータスコードとInvalidArgument
エラーコードを返します。ヘッダーサイズ: ヘッダー内のすべてのキーと値の合計サイズは8 KBを超えることはできません。
パスサイズ: すべてのクエリパラメーターを含むパスの合計サイズは、4 KBを超えることはできません。
ボディサイズ: 同期呼び出しリクエストのボディの合計サイズは32 MBを超えることはできません。 非同期呼び出し要求の本体の合計サイズは128 KBを超えることはできません。
HTTP応答の制限
レスポンスヘッダーは、x-fc- で始まるカスタムフィールドまたは次のフィールドをサポートしていません。
connection
content-length
date
keep-alive
server
content-disposition:attachment
説明セキュリティ上の理由から、Function Computeのデフォルトのドメイン名e aliyuncs.comを使用すると、サーバーはcontent-disposition: attachmentレスポンスヘッダーを強制的に追加します。これは、ブラウザーから返された結果を添付ファイルとしてダウンロードするために使用されます。 この制限を解除するには、カスタムドメイン名を設定する必要があります。 詳細については、「カスタムドメイン名の設定」をご参照ください。
応答が次のいずれかの制限を超えると、システムはステータスコード
502
とエラーBadResponse
を返します。ヘッダーサイズ: ヘッダー内のすべてのキーと値の合計サイズは8 KBを超えることはできません。
その他
カスタムドメイン名をバインドすることで、関数の異なるHTTPパスをマップできます。 詳細については、「カスタムドメイン名の設定」をご参照ください。
HTTP呼び出し (推奨)
HTTP呼び出しの場合、Function Computeは、パススルーモードを使用して、クライアントのHTTPリクエストをHTTPサーバーに渡し、HTTPサーバーの応答をクライアントに渡します。 一部のシステム予約フィールドを渡すことができません。 詳細については、「制限事項」をご参照ください。
HTTPリクエストヘッダー
HTTPトリガーまたはカスタムドメイン名を使用して関数を呼び出す場合、リクエストヘッダーを使用してfunction Computeのリクエストの動作を制御できます。 次の表に、詳細を示します。
パラメーター | データ型 | 必須 | 例 | 説明 |
X-Fc-Invocation-Type | String | 任意 | Sync | 呼び出しメソッド。 詳細については、「呼び出しメソッド」をご参照ください。 有効な値:
|
X-Fc-Log-Type | String | 任意 | Tail | ログを返すために使用されるメソッド。 有効な値:
|
HTTPレスポンスヘッダー
HTTPトリガーまたはカスタムドメイン名を使用して関数を呼び出すと、レスポンスにはfunction Computeによって自動的に追加されるいくつかのレスポンスヘッダーが含まれます。 次の表に、詳細を示します。
パラメーター | 説明 | 例 |
X-Fc-Request-Id | 関数呼び出しのリクエストID。 | dab25e58-9356-4e3f-97d6-f044c4 **** |
API呼び出し
InvokeFunction操作によって開始される関数呼び出しの場合、function ComputeはInvokeFunction操作から送信されたリクエストをHTTPリクエストに変換し、リクエストをクライアントに渡します。 次の変換ルールが適用されます。
InvokeFunctionのeventパラメーターは、HTTPリクエストのメッセージボディに変換されます。
path
は/invoke
に設定されます。method
はPOST
に設定されています。Content-Type
はapplication/octe-stream
に設定されます。
Function Computeは、HTTPサーバーの応答をInvokeFunctionの応答に変換し、クライアントに応答を返します。 次の変換ルールが適用されます。
HTTPレスポンスボディはInvokeFunctionのレスポンスボディに変換されます。
HTTP応答ヘッダーとステータスコード情報は変換中に失われます。
InvokeFunctionリクエストの変換例
InvokeFunctionリクエスト | HTTPサーバが受信したHTTPリクエスト |
InvokeFunctionリクエストコンテンツ:
|
|
InvokeFunctionレスポンスのサンプル出力
HTTPレスポンス | InvokeFunctionの応答 |
|
|
|
|
サンプルコード
任意の言語でHTTPサーバーを実装できます。 このトピックでは、Pythonを例として使用します。
サンプルコードは、Python環境とFlaskライブラリによって異なります。 関数を作成するメソッドとしてWeb Functionを選択し、ランタイムとしてPython 3.10を使用することを推奨します。
import os
from flask import Flask
from flask import request
REQUEST_ID_HEADER = 'x-fc-request-id'
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get(REQUEST_ID_HEADER)
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
説明:
@ app.route('/', defaults={'path': ''})
: ルートディレクトリに対応するデフォルトルート。@ app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
: パスパラメーターを含む動的ルート。 GET、POST、PUT、およびDELETEリクエストを処理できます。 pathパラメーターの値は、pathパラメーターとしてhello_world関数に渡されます。rid = request.headers.get(REQUEST_ID_HEADER)
: リクエストヘッダーのx-fc-request-id
フィールドの値を取得します。data = request.stream.read()
: リクエストの内容を読み取り、データ変数に代入します。return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME '))]
: "Hello, World! ステータスコードを200に設定し、Function-Name
ヘッダーを含むタプルを設定します。