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

Function Compute:Web 関数

最終更新日:Apr 11, 2025

このトピックでは、カスタムランタイムでの関数呼び出しの方法と制限について説明し、サンプルコードを提供します。

背景情報

カスタムランタイムでは、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

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

  • Sync:同期呼び出し

  • Async:非同期呼び出し

X-Fc-Log-Type

String

いいえ

Tail

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

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

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

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.X.X
> Content-Length: 11
> Content-Type: application/octet-stream

hello world

InvokeFunction レスポンスの出力例

HTTP レスポンス

InvokeFunction のレスポンス

< HTTP/1.1 200 OK
< Date: Mon, 10 Jul 2025 10:37:15 GMT
< Content-Type: application/octet-stream
< Content-Length: 11
< Connection: keep-alive

hello world

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

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

サンプルコード

関数にトリガーを構成する場合、任意の言語で 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 ヘッダーを含むタプルを設定します。