このトピックでは、カスタムランタイムにおけるウェブ関数の呼び出しメソッド、制限事項、およびコード例について説明します。
背景情報
カスタムランタイムは、HTTP サーバーをホストできます。Function Compute は、関数呼び出しリクエストを HTTP リクエストに変換してサーバーに送信します。その後、サーバーのレスポンスを関数呼び出しレスポンスに変換し、クライアントに返します。
関数は、次の 2 つの方法で呼び出すことができます。
HTTP 呼び出し (推奨):HTTP トリガーまたはカスタムドメイン名を使用して、HTTP 経由で関数を呼び出します。
API 呼び出し:SDK またはイベントソースを使用して、InvokeFunction API で関数を呼び出します。
HTTP サーバーのリクエストとレスポンスのフォーマットは、呼び出しメソッドによって異なります。
制限事項
各関数バージョンまたはエイリアスに対して作成できる HTTP トリガーは 1 つだけです。詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
HTTP リクエストの制限
リクエストヘッダーには、x-fc- で始まるカスタムフィールドや、以下の予約済みフィールドを含めることはできません。
connection
keep-alive
リクエストが以下の制限を超えた場合、Function Compute はステータスコード
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 が提供するデフォルトの `aliyuncs.com` ドメインを使用する場合、サービスは自動的に content-disposition: attachment ヘッダーをレスポンスに追加します。これにより、ブラウザではレスポンスが添付ファイルとしてダウンロードされます。この制限を解除するには、カスタムドメイン名を設定する必要があります。
レスポンスが以下の制限を超えた場合、Function Compute はステータスコード
502とエラーコードBadResponseを返します。ヘッダーサイズ:ヘッダー内のすべてのキーと値の合計サイズは 8 KB を超えることはできません。
補足情報
カスタムドメイン名に関数をバインドすることで、さまざまな HTTP アクセスパスを関数にマッピングできます。詳細については、「カスタムドメイン名を設定する」をご参照ください。
HTTP 呼び出し (推奨)
HTTP 呼び出しの場合、Function Compute はパススルーモードを使用します。クライアントからの HTTP リクエストを HTTP サーバーに転送し、サーバーのレスポンスをクライアントに返します。一部のシステム予約済みフィールドはパススルーされません。詳細については、「制限事項」をご参照ください。
リクエストヘッダー
HTTP トリガーまたはカスタムドメイン名を使用して関数を呼び出す際に、リクエストヘッダーを設定してリクエストの動作をコントロールできます。以下の表に、これらのリクエストヘッダーを説明します。
パラメーター | タイプ | 必須 | 例 | 説明 |
X-Fc-Invocation-Type | String | いいえ | Sync | 呼び出しメソッド。詳細については、「呼び出しメソッド」をご参照ください。有効値:
|
X-Fc-Log-Type | String | いいえ | Tail | レスポンスに実行ログを含めるかどうかを指定します。有効値:
|
レスポンスヘッダー
HTTP トリガーまたはカスタムドメイン名を使用して関数を呼び出すと、レスポンスには Function Compute によって追加されたヘッダーが含まれます。以下の表に、これらのレスポンスヘッダーを説明します。
パラメーター | 説明 | 例 |
X-Fc-Request-Id | 関数呼び出しの一意のリクエスト ID。 | dab25e58-9356-4e3f-97d6-f044c4**** |
API 呼び出し
InvokeFunction API を使用する API 呼び出しの場合、Function Compute は API リクエストを HTTP リクエストに変換し、HTTP サーバーに転送します。変換は以下のルールに従います。
InvokeFunction リクエストの `event` パラメーターは、HTTP リクエストのボディに変換されます。
pathは/invokeに設定されます。methodはPOSTに設定されます。Content-Typeヘッダーはapplication/octet-streamに設定されます。
その後、Function Compute は HTTP サーバーからのレスポンスを InvokeFunction レスポンスに変換し、クライアントに返します。変換は以下のルールに従います。
HTTP レスポンスボディは InvokeFunction レスポンスボディに変換されます。
変換時に HTTP レスポンスヘッダーとステータスコードは破棄されます。
InvokeFunction リクエストの変換
InvokeFunction リクエスト | 受信した HTTP リクエスト |
InvokeFunction リクエストのコンテンツ: | |
Invoke API レスポンスの例
HTTP レスポンス | Invoke レスポンス |
| |
| |
Function Compute のレスポンスコードとヘッダー
カスタムランタイムは、ユーザーが実装する HTTP サーバーです。各関数呼び出しは HTTP リクエストであるため、すべてのレスポンスにはレスポンスコードとレスポンスヘッダーが含まれます。
レスポンスコード
StatusCode200:成功を示します。404:失敗を示します。
レスポンスヘッダー
x-fc-status200:成功を示します。404:失敗を示します。
x-fc-status レスポンスヘッダーを使用して、ローカル関数が正常に実行されたかどうかを Function Compute にレポートします。
x-fc-statusが設定されていない場合:Function Compute はデフォルトで呼び出しが成功したと見なします。関数で例外が発生してもそれがレポートされない場合、Function Compute は実行が成功したと判断します。これはビジネスロジックに影響しないかもしれませんが、以下の図に示すように、モニタリングと可観測性に影響します。
x-fc-statusが設定されている場合:関数で例外が発生した場合、x-fc-statusレスポンスを使用して実行の失敗を Function Compute にレポートします。これにより、以下の図に示すように、エラースタックトレースもログに出力されます。
返される HTTP レスポンスでは、StatusCode と x-fc-status の両方を設定してください。
コード例
関数にトリガーを設定した後、任意の言語で HTTP サーバーを実装できます。次の例では Python を使用します。
このサンプルコードは、Python 環境と Flask ライブラリに依存します。このコードを実行するには、Web 関数を作成し、ランタイムとして 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 引数として hello_world 関数に渡されます。rid = request.headers.get(REQUEST_ID_HEADER):リクエストヘッダーからx-fc-request-idフィールドの値を取得します。data = request.stream.read():リクエストコンテンツを読み取り、data 変数に割り当てます。return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]:"Hello, World!" を含むレスポンスボディを返し、ステータスコードを 200 に設定し、Function-Nameヘッダーを持つタプルを含みます。