このトピックでは、カスタムランタイムにおける関数の呼び出し方法、制限、およびコード例について説明します。
背景情報
カスタムランタイムは、HTTP サーバーをホストできます。Function Compute (FC) は、関数呼び出しリクエストを HTTP リクエストに変換し、HTTP サーバーに送信します。その後、FC は HTTP サーバーからのレスポンスを関数呼び出しのレスポンスに変換し、クライアントに返します。次の図に、そのプロセスを示します。
関数は、次の2つの方法で呼び出すことができます。
-
HTTP 呼び出し (推奨):HTTP トリガーやカスタムドメイン名などを使用して、HTTP 経由で関数を呼び出します。
-
API 呼び出し:SDK を使用して関数を呼び出したり、イベントソースを介して関数をトリガーしたりするなど、InvokeFunction API を呼び出して関数を実行します。
呼び出し方法によって、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 のデフォルトの aliyuncs.com ドメインを使用する場合、サーバーはレスポンスヘッダーに
content-disposition: attachmentヘッダーを強制的に追加します。このヘッダーがあると、レスポンスはブラウザで添付ファイルとしてダウンロードされるようになります。この制限を解除するには、カスタムドメイン名を設定してください。
-
-
レスポンスが次の制限を超えると、ステータスコード
502とエラーコードBadResponseが返されます。-
ヘッダーサイズ:ヘッダー内のすべてのキーと値の合計サイズは 8 KB を超えてはなりません。
-
-
-
その他の使用上の注意
カスタムドメイン名をバインドすることで、さまざまな HTTP アクセスパスを関数にマッピングできます。詳細については、「カスタムドメイン名の設定」をご参照ください。
HTTP 呼び出し (推奨)
HTTP 呼び出しの場合、FC はパススルーモードを使用します。クライアントの HTTP リクエストを HTTP サーバーに渡し、HTTP サーバーのレスポンスをクライアントに渡します。一部のシステム予約フィールドは渡されません。詳細については、「制限事項」をご参照ください。
リクエストヘッダー
HTTP トリガーまたはカスタムドメイン名を使用して関数を呼び出す場合、FC ではリクエストヘッダーを設定してリクエストの動作を制御できます。次の表に、サポートされているリクエストヘッダーを示します。
|
名前 |
タイプ |
必須 |
例 |
説明 |
|
X-Fc-Invocation-Type |
String |
任意 |
Sync |
呼び出しタイプ。詳細については、「呼び出しタイプ」をご参照ください。有効値:
|
|
X-Fc-Log-Type |
String |
任意 |
Tail |
レスポンスで返すログ。有効値:
|
レスポンスヘッダー
HTTP トリガーまたはカスタムドメイン名を使用して関数を呼び出す場合、レスポンスには FC がデフォルトで追加するいくつかのレスポンスヘッダーが含まれています。次の表に、レスポンスヘッダーを示します。
|
名前 |
説明 |
例 |
|
X-Fc-Request-Id |
関数呼び出しのリクエスト ID。 |
dab25e58-9356-4e3f-97d6-f044c4**** |
API 呼び出し
InvokeFunction API を使用した呼び出しの場合、FC は InvokeFunction リクエストを HTTP リクエストに変換し、HTTP サーバーに送信します。変換ルールは次のとおりです。
-
InvokeFunction の
eventパラメーターは、HTTP リクエストのメッセージ本文に変換されます。 -
pathは/invokeです。 -
methodはPOSTです。 -
Content-Typeメッセージヘッダーはapplication/octet-streamです。
FC は、HTTP サーバーのレスポンスを InvokeFunction のレスポンスに変換し、クライアントに返します。変換ルールは次のとおりです。
-
HTTP レスポンスボディは、InvokeFunction のレスポンスボディに変換されます。
-
HTTP レスポンスヘッダーとステータスコードは、変換中に失われます。
Invoke API リクエスト変換の例
|
Invokeリクエスト |
HTTP リクエスト (HTTP サーバーが受信するリクエスト) |
|
Invoke API リクエストの内容:
|
|
Invoke API レスポンス出力の例
|
HTTPレスポンス |
Invokeレスポンス |
|
|
|
|
Function Compute のレスポンスコードとレスポンスヘッダー
カスタムランタイムは、本質的にはユーザーが実装する HTTP サーバーです。したがって、各関数呼び出しは HTTP リクエストであり、各レスポンスにはレスポンスコードとレスポンスヘッダーが含まれます。
-
レスポンスコード
StatusCode-
200:成功。 -
404:失敗。
-
-
レスポンスヘッダー
x-fc-status-
200:成功。 -
404:失敗。
-
x-fc-status レスポンスヘッダーを使用して、関数が正常に実行されたかどうかを FC に報告できます。
-
x-fc-statusを設定しない場合:FC は、デフォルトで呼び出しが正常に実行されたと見なします。ただし、関数で例外が発生し、それが FC に報告されない場合があります。FC は実行をエラーなしと見なします。これはビジネスロジックに影響を与えないかもしれませんが、モニタリングとオブザーバビリティに影響します。コード例を次に示します。print("FC Invoke Start RequestId: " + rid) data = request.stream.read() print("Path: " + path) print("Data: " + str(data)) # 例外をシミュレートして実行時エラーをトリガー raise Exception("mock exception") print("FC Invoke End RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
x-fc-statusを設定する場合:関数で例外が発生した場合、x-fc-statusレスポンスヘッダーを使用して実行の失敗を FC に報告でき、エラースタック情報がログに出力されます。次の例に示すように、x-fc-statusレスポンスヘッダーを404に設定すると、FC は呼び出しを失敗した実行として識別します。エラータイプはInvocationErrorで、返される結果はmock exceptionです。app.py のサンプルコードは次のとおりです。@app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): rid = request.headers.get(REQUEST_ID_HEADER) print("FC Invoke Start RequestId: " + rid) try: raise Exception("mock exception") except Exception as e: print("FC Invoke End RequestId: " + rid + ", Error: Unhandled Exception") print(str(e)) return str(e), 404, [('x-fc-status', '404')]
返される 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ヘッダーを含めます。