このトピックでは、カスタムランタイムでの関数呼び出しの方法と制限について説明し、サンプルコードを提供します。
背景情報
カスタムランタイムでは、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 のデフォルトドメイン名 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 関数] を選択し、ランタイムとして [Python 3.10] を使用することをお勧めします。
import os
from flask import Flask
from flask import request
# リクエストIDヘッダー
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):
# リクエストヘッダーから x-fc-request-id フィールドの値を取得します。
rid = request.headers.get(REQUEST_ID_HEADER)
# リクエストのコンテンツを読み取り、data 変数に割り当てます。
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
# "Hello, World!" を含むレスポンス本文を返し、状態コードを 200 に設定し、Function-Name ヘッダーを含むタプルを設定します。
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']):path パラメーターを含む動的ルート。 GET、POST、PUT、および DELETE リクエストを処理できます。 path パラメーターの値は、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ヘッダーを含むタプルを設定します。