分散 Function Compute シナリオでは、リクエストが異なるインスタンスにルーティングされる可能性があり、セッション状態の維持が困難になる場合があります。Cookie アフィニティ機能は、サーバーサイドで Cookie を自動的に挿入することでセッションの一貫性を確保します。これにより、同じ Cookie 値を持つリクエストが同じ関数インスタンスにルーティングされます。
コア設定
関数の設定ページで、[詳細設定] > [分離とアフィニティ] に移動します。[セッション保持] スイッチをオンにし、[Cookie アフィニティ] を選択し、[インスタンスあたりの同時セッション数] と [セッションのライフサイクル] を設定してから、[デプロイ] をクリックしてこの機能を有効にします。
最初のリクエストに対して、システムは自動的にレスポンスヘッダーに Cookie を挿入します。以降、この Cookie を含むクライアントリクエストは同じインスタンスにルーティングされます。
適用範囲
一般的な制限:詳細については、「セッション保持の一般的な制限と原則」をご参照ください。
サーバーサイドでの Cookie 挿入のみ:クライアントが最初のリクエストを行うと、Function Compute は
Set-Cookieヘッダーを使用してレスポンスに Cookie を自動的に挿入します。クライアントは、この Cookie を解析して保存し、後続のリクエストに含める必要があります。リクエストの制限:
単一のインスタンスで複数のセッションを同時に処理できます。デフォルト値は 20 で、最大値は 200 です。単一のインスタンスにアタッチされたセッション数が上限に達すると、システムは自動的に新しいインスタンスを作成します。
複数のセッションは、インスタンスの同時実行クォータである 200 を共有します。
SessionAPI 管理のサポート:SessionAPI を使用して、セッションの作成、更新、クエリ、停止など、セッションのライフサイクルを管理できます。
Cookie アフィニティの設定
フローの概要
Cookie アフィニティの設定には、セッション保持の有効化、Cookie タイプの選択、パラメーターの設定と関数のデプロイの 3 つのステップが含まれます。これらの設定は、関数の作成時または既存の関数の更新時に行うことができます。
セッション保持の有効化
Function Compute コンソールにログインします。
関数リストに移動し、対象の関数を選択するか、「関数の作成」を行います。
関数の作成時に、[詳細設定] セクションで [分離とアフィニティ] の設定を見つけ、以下の設定手順を完了します。
関数の詳細ページで、[設定] タブをクリックします。
[詳細設定] セクションで、[アイソレーションとアフィニティ] 設定を確認できます。
[分離とアフィニティ] をクリックして設定パネルを展開します。
[セッション保持] を有効にします。
Cookie アフィニティタイプの選択
[セッション保持] セクションで、[Cookie アフィニティ] ラジオボタンを選択します。
Cookie アフィニティの設定オプションが自動的に表示されます。
セッションパラメーターの設定
目的:セッション数、ライフサイクル、アイドル期間を設定して、セッションのバインディングとリソース使用量を制御します。
手順:
インスタンスあたりの同時セッション数:単一のインスタンスが同時に処理できるセッションの最大数を指定します。
デフォルト値:20
有効値の範囲:1~200
推奨:ステージング環境では 10 などの小さい値を設定します。本番環境では必要に応じて値を調整してください。
単一セッションのライフサイクル:セッションが作成されてから破棄されるまでの最大期間を設定します。
デフォルト値:21,600 秒 (6 時間)
説明:この期間を過ぎると、システムはセッションを自動的に破棄し、アフィニティは保証されなくなります。
セッションのアイドル期間:セッションが自動的に破棄されるまでのアイドル状態の許容時間を指定します。
デフォルト値:1,800 秒 (30 分)
説明:セッションがこの期間リクエストを受信しない場合、アイドル状態になり、自動的に破棄されます。
[デプロイ] ボタンをクリックして設定を保存します。
重要:
セッション保持を有効にすると、システムは自動的に [インスタンスあたりの同時実行数] を 200 に設定します。これはシステムのデフォルト値であり、手動で調整することはできません。
関数の作成時にセッション保持を設定した場合、設定は関数とともに作成されます。既存の関数にセッション保持を設定した場合は、設定を別途デプロイする必要があります。
Cookie 名は、
x-fc-cookie-session-idのフォーマットでシステムによって自動的に生成されます。Cookie 値は、自動生成されたグローバル一意識別子 (GUID) です。Cookie の
Max-Ageは、デフォルトで 21,600 秒 (6 時間) であり、セッションのライフサイクルと一致します。
Cookie アフィニティ機能の検証
目的:同じ Cookie 値を持つリクエストが同じインスタンスにルーティングされること、および自動インスタンススケールアウトメカニズムが機能することを確認します。
同じ Cookie 値を持つリクエストは、同じインスタンスにルーティングされます。
インスタンスのセッション数が上限に達すると、システムは自動的に新しいインスタンスを作成します。
すべてのリクエストは成功のステータスコード (200) を返します。
インスタンスのスケールアウトの変更は、コンソールの関数の詳細ページで確認できます。
手順:
ステージング環境の準備
関数がデプロイされ、Cookie アフィニティが設定されていることを確認します。テストのために、[インスタンスあたりの同時セッション数] を 2 に設定することを推奨します。
関数の HTTP トリガーの URL を取得します。
テストのために、HTTP トリガーの認証方式を署名認証から匿名アクセスに変更できます:
関数の詳細ページの [トリガー] タブに移動します。
トリガーの [編集] ボタンをクリックします。
[認証方式] を [匿名アクセス] に設定します。
設定を保存します。
最初のリクエスト:Cookie がない場合、システムは自動的に Cookie を挿入
最初のリクエストを送信します:
curl -i http://your-function-url/関数の詳細ページで、HTTP トリガーをクリックして検証用の一時 URL を取得します。
例:
curl -i https://test-cookies-b*******v.cn-hangzhou.fcapp.run期待される結果:
Content-Length: 13 Content-Type: text/html; charset=utf-8 Set-Cookie: x-fc-cookie-session-id=3******a-c**5-4**0-a**4-e**********4; Max-Age=21600 X-Fc-Request-Id: 1-******e8-******c9-e**********8 Date: Tue, 30 Dec 2025 11:47:53 GMT Hello, World!%レスポンスヘッダーから、
Set-Cookieの Cookie 値 (x-fc-cookie-session-id) を抽出します。レスポンスから
X-Fc-Request-Idを記録します。これを使用してリクエストのルーティングを分析できます。
2 番目のリクエスト:抽出した Cookie 値でリクエストを送信
同じセッションが同じインスタンスにルーティングされることを確認します。
<first-x-fc-cookie-session-id>を、前のステップで抽出したSet-Cookieヘッダーのx-fc-cookie-session-idの値に置き換えます。curl -i -b "x-fc-cookie-session-id=<first-x-fc-cookie-session-id>" https://your-function-url/例:
curl -i -b "x-fc-cookie-session-id=3******a-c**5-4**0-a**4-e**********4" https://test-cookies-b********v.cn-hangzhou.fcapp.run期待される結果:
HTTP/1.1 200 OK Content-Length: 13 Content-Type: text/html; charset=utf-8 X-Fc-Request-Id: 1-******cb-******16-e**********2 Date: Tue, 30 Dec 2025 12:12:59 GMT Hello, World!%アフィニティの検証:コンソールの関数の詳細ページで、[インスタンス] > [インスタンスログ] をクリックします。ログには、両方のリクエストが同じインスタンスによって処理されたことが示されます。これは
X-Fc-Request-Idを確認することで検証できます。
3 番目のリクエスト:Cookie がない場合、システムは新しい Cookie を生成
新しいリクエストを送信します:
curl -i https://your-function-url/例:
curl -i http://test-cookies-o********j.cn-hangzhou.fcapp.run/期待される結果:システムは新しいセッションに対して異なる Cookie 値を生成します。
Access-Control-Expose-Headers: Date,x-fc-request-id Content-Disposition: attachment Content-Length: 13 Content-Type: text/html; charset=utf-8 Set-Cookie: x-fc-cookie-session-id=d******e-***3-4**5-a**2-3**********d; Max-Age=21600 X-Fc-Request-Id: 1-******cb-******16-1**********a Date: Tue, 30 Dec 2025 12:31:00 GMT Hello, World!%アフィニティの検証:[インスタンスあたりの同時セッション数] が 2 に設定されている場合、新しいセッションは同じインスタンスにアタッチされるはずです。これは、コンソールの関数の詳細ページで [インスタンス] > [インスタンスログ] をクリックして確認できます。
X-Fc-Request-Idを確認することで検証できます。
4 番目のリクエスト:Cookie がない場合、自動インスタンススケールアウトを検証
Cookie なしでリクエストを送信して新しいセッションを生成します。インスタンス上のセッション数が上限に達しているため、新しいセッションは新しく作成されたインスタンスにアタッチされます。
curl -i http://your-function-url/例:
curl -i http://test-cookies-o********j.cn-hangzhou.fcapp.run/期待される結果:
HTTP/1.1 200 OK Access-Control-Expose-Headers: Date,x-fc-request-id Content-Disposition: attachment Content-Length: 13 Content-Type: text/html; charset=utf-8 X-Fc-Request-Id: 1-6******c-1******2-**********5d Date: Tue, 30 Dec 2025 12:33:48 GMT Hello, World!%アフィニティの検証:コンソールの関数の詳細ページで、[インスタンス] をクリックします。新しいインスタンスが表示されます。
よくある質問
Cookie アフィニティが機能しない原因
考えられる原因:
クライアントが最初のリクエストの Set-Cookie ヘッダーからセッション ID を正しく解析せず、後続のリクエストにこの ID を含めていない。
セッションがライフサイクルまたはアイドル期間を超えたために破棄された。
セッション保持の設定が関数に正しくデプロイされていない。
トラブルシューティング手順:
最初のリクエストのレスポンスヘッダーに
Set-Cookieフィールドが含まれており、そのフィールドにセッション ID の値が含まれていることを確認します。後続のリクエストに Cookie ヘッダーが含まれていることを確認します。
関数の設定でセッション保持が有効化され、デプロイされていることを確認します。