すべてのプロダクト
Search
ドキュメントセンター

Function Compute:Web関数

最終更新日:Jul 17, 2024

このトピックでは、カスタムランタイムでの関数呼び出しのメソッド、制限、およびサンプルコードについて説明します。

背景

カスタムランタイムでは、HTTPサーバーをホストできます。 関数呼び出しは、HTTPリクエストに変換してHTTPサーバーに送信できます。 HTTPサーバの応答は、関数呼び出しの応答としてクライアントに送信することができる。 次の図にプロセスを示します。

image

関数は、次のいずれかのメソッドを使用して呼び出すことができます。

  • 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

呼び出しメソッド。 詳細については、「呼び出しメソッド」をご参照ください。 有効な値:

  • 同期: 同期呼び出し

  • Async: 非同期呼び出し

X-Fc-Log-Type

String

任意

Tail

ログを返すために使用されるメソッド。 有効な値:

  • テール: 現在のリクエストに対して生成された最後の4 KBのログを返します。

  • なし: 現在のリクエストのログは返されません。 デフォルト値です。

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に設定されます。

  • methodPOSTに設定されています。

  • Content-Typeapplication/octe-streamに設定されます。

Function Computeは、HTTPサーバーの応答をInvokeFunctionの応答に変換し、クライアントに応答を返します。 次の変換ルールが適用されます。

  • HTTPレスポンスボディはInvokeFunctionのレスポンスボディに変換されます。

  • HTTP応答ヘッダーとステータスコード情報は変換中に失われます。

InvokeFunctionリクエストの変換例

InvokeFunctionリクエスト

HTTPサーバが受信したHTTPリクエスト

InvokeFunctionリクエストコンテンツ:

"hello world"
> POST /invoke HTTP/1.1
> Host: 21.0.0.3
> Content-Length: 11
> Content-Type: application/octet-stream

hello world

InvokeFunctionレスポンスのサンプル出力

HTTPレスポンス

InvokeFunctionの応答

< HTTP/1.1 200 OK
< Date: Mon, 10 Jul 2023 07:02:15 GMT
< Content-Type: application/json
< Content-Length: 11
< Connection: keep-alive

hello world

hello world
< HTTP/1.1 400 Bad Request
< Date: Mon, 10 Jul 2023 07:02:15 GMT
< Content-Type: application/json
< Content-Length: 28
< Connection: keep-alive

{"errorMessage":"exception"}
{"errorMessage":"exception"}

サンプルコード

任意の言語で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ヘッダーを含むタプルを設定します。