AI 推論、オンラインゲーム、マルチテナント SaaS (Software as a Service) などのステートフルなシナリオでは、永続的な状態の管理とマルチテナントデータの分離が中心的な課題となります。Function Compute は、セッションを明示的なリソースとして扱い、包括的なライフサイクル管理 API セットを提供します。これにより、インスタンスのプリフェッチと詳細なリソース制御が可能になります。マルチテナントシナリオでは、セッション作成時に専用の永続ストレージを動的にマウントすることもでき、ファイルシステムレベルで厳密なデータ分離を保証します。
利用シーン
利用シーン 1: AI Sandbox インテリジェントコンピューティングサービス
モデルとデータのプリロード:
CreateSessionAPI を使用してセッションを作成し、インスタンスをプリフェッチできます。これにより、初期化フェーズで大規模なモデルの重みをロードでき、最初の推論の応答速度が大幅に向上します。安全なデータ分離とマウント: セッション作成時に、テナントごとに専用の NAS ディレクトリを動的にマウントし、各ディレクトリに独立した POSIX ユーザー ID (UID/GID) を指定できます。これにより、物理的に共有されたストレージ上で異なるテナントのデータセットとモデルシャードが論理的に分離され、オンデマンドで安全にロードされることが保証されます。
自律的なライフサイクルコントロール: API を使用してアイドル状態のセッションを破棄し、計算能力リソースを解放できます。また、優先度の高いタスクに対してセッションの TTL (生存時間) を延長し、コストとパフォーマンスのバランスを取ることも可能です。
利用シーン 2: オンラインゲームサービス
セッション状態の永続化: セッション保持を使用して、プレイヤーの位置や装備などのリアルタイム状態を特定のインスタンスにキャッシュできます。これにより、高頻度のインタラクションにおける低レイテンシーが保証されます。セッション固有の永続ストレージを使用して、重要なゲームアーカイブを確実に保存できます。
正確な TTL 管理: マッチメイキングキューやバトルルームなど、さまざまなシナリオのプレイヤーセッションに対して、独立したアイドルタイムアウト (TTL) ポリシーを設定できます。これにより、ゾンビセッションが継続的にリソースを占有するのを防ぎます。
適用範囲
リージョン制限: この機能は、中国 (フフホト) リージョンではサポートされていません。動的 NAS マウント機能は、米国 (シリコンバレー) リージョンでのみ利用可能です。他のリージョンでのサポートをリクエストする場合は、チケットを送信する際に指定できます。
仕組み: セッションの状態遷移とライフサイクル
セッションの作成
手動作成: CreateSession - セッションリソースの作成 API を呼び出すことができます。呼び出しが成功すると、セッションのステータスは「アクティブ」に変わります。
受動的作成: カスタム SessionID を指定して InvokeFunction 操作を呼び出し、初めて関数を正常に呼び出したときに、セッションが「アクティブ」ステータスで自動的に作成されます。
セッションの破棄
受動的破棄: セッションの TTL またはアイドルタイムアウトに達すると、システムは自動的にそのステータスを「期限切れ」に変更します。
能動的削除: DeleteSession - セッションリソースの削除 API を呼び出し、成功するとセッションのステータスは「削除済み」になります。
隔離モード: セッションは削除され、リクエストは終了し、関連するリソースは自動的に解放されます。
非隔離モード: セッションは削除され、実行中のリクエストは正常に終了します。このプロセスには、以下のケースが含まれます:
リソースが解放されます。
リソースは、期限切れになっていない、または削除されていない他のセッションの処理を継続します。
リソースは新しいセッションにバインドされ、再利用されます。
状態遷移は一方向で不可逆です: アクティブ → 期限切れ / 削除済み。「期限切れ」と「削除済み」のステータスは相互に変換できません。
操作手順
コアフローの概要
関数を作成し、セッション保持機能を有効にします。
CreateSessionAPI を呼び出してセッションを作成します。セッションに永続ストレージをマウントするには、リクエストにnas_configパラメーターを追加します。InvokeFunctionを呼び出す際に、sessionIdを含めて、リクエストをバインドされたストレージを持つセッションインスタンスにルーティングします。必要に応じて、
UpdateSessionまたはDeleteSessionを呼び出してセッションのライフサイクルを管理します。
ステップ 1: セッション保持の有効化
関数を作成するか、関数の設定を更新する際に、セッション保持の設定を有効にします。HeaderField アフィニティの場合、SessionID を渡すために、x-affinity-header-v1 のようなヘッダーキーを指定する必要があります。以下の例では、既存の関数設定を更新する方法を説明します:
Function Compute コンソールにログオンし、[関数管理] > [関数一覧] を選択します。
[関数リスト] ページで、設定する関数の名前をクリックします。 関数の詳細ページが表示されます。
[設定] ページの [詳細設定] で、
をクリックします。[セッションアフィニティ] を有効にして、[ヘッダーフィールドアフィニティ] を選択し、[ヘッダー名] を
x-affinity-header-v1などに設定します。説明ヘッダー名は
x-fc-で始めることはできません。文字で始まり、その後に文字、数字、ハイフン (-)、またはアンダースコア (_) を続けることができます。名前の長さは 5~40 文字である必要があります。[デプロイ] をクリックして構成を適用します。
ステップ 2: セッションリソースの作成
このセクションでは、Python SDK を例として、CreateSession - セッションリソースの作成 API を呼び出してセッションを作成する方法を示します。
SDK の依存関係をインストールします。
macOS / Linux
# pip3 を使用してインストール pip3 install alibabacloud_fc20230330 alibabacloud_credentials alibabacloud_tea_openapi alibabacloud_tea_util # 権限の問題が発生した場合は、--user パラメーターを使用 pip3 install --user alibabacloud_fc20230330 alibabacloud_credentials alibabacloud_tea_openapi alibabacloud_tea_util # macOS Homebrew Python 環境では、--break-system-packages を使用 pip3 install --break-system-packages alibabacloud_fc20230330 alibabacloud_credentials alibabacloud_tea_openapi alibabacloud_tea_utilWindows
# pip を使用してインストール pip install alibabacloud_fc20230330 alibabacloud_credentials alibabacloud_tea_openapi alibabacloud_tea_util # または Python 3 を指定 py -3 -m pip install alibabacloud_fc20230330 alibabacloud_credentials alibabacloud_tea_openapi alibabacloud_tea_utilセッションを作成するためのコアコードを記述します。
createSession.pyのような Python コードファイルを作成します。以下のコードをファイルにコピーし、コアパラメーターを置き換えます。コアメソッドとパラメーター:
config.endpoint:<ご利用の Alibaba Cloud アカウント ID>: これを ご利用の Alibaba Cloud アカウント ID に置き換えます。
<エンドポイント>: 詳細については、「Function Compute 3.0 サービスエリアリスト」をご参照ください。フォーマットは
fcv3.[region_id].aliyuns.comです。
CreateSessionInput:session_ttlin_seconds: セッションの合計 TTL (生存時間) (秒単位)。
session_idle_timeout_in_seconds: セッションのアイドルタイムアウト期間 (秒単位)。
client.create_session_with_options: <ご利用の関数名> を、セッションを作成したい関数の名前に置き換えます。
# -*- coding: utf-8 -*- from alibabacloud_fc20230330.client import Client as FC20230330Client from alibabacloud_credentials.client import Client as CredentialClient from alibabacloud_tea_openapi import models as open_api_models from alibabacloud_fc20230330 import models as fc20230330_models from alibabacloud_tea_util import models as util_models # 1. アカウントクライアントを作成します。 credential = CredentialClient() config = open_api_models.Config(credential=credential) config.endpoint = f'<ご利用の Alibaba Cloud アカウント ID>.<エンドポイント>' client = FC20230330Client(config) # 2. CreateSession リクエストを構築します。 create_session_input = fc20230330_models.CreateSessionInput( session_ttlin_seconds=3600, session_idle_timeout_in_seconds=600 ) create_session_request = fc20230330_models.CreateSessionRequest( body=create_session_input ) # 3. リクエストを送信します。 runtime = util_models.RuntimeOptions() response = client.create_session_with_options('<ご利用の関数名>', create_session_request, {}, runtime) # 4. 応答から sessionId を取得します。 print(response.body.to_map()) session_id = response.body.session_id print(f"Session created successfully. Session ID: {session_id}")
ステップ 3: (オプション) 動的ストレージの設定
関数の設定: セッションに動的ストレージを設定するには、関数を次のように設定する必要があります:
インスタンスフェンシング: [設定] > [詳細設定] > [インスタンスフェンシング] に移動して [セッションフェンシング] を選択します。
VPC アクセスを許可:
[設定] > [詳細設定] > [ネットワーク] で [VPC アクセスを許可] を有効にします。
[設定方法] を [カスタム設定] に設定します。
VPC: マウントポイントを含む VPC を選択します。
nas_config設定の追加: ステップ 2: セッションリソースの作成 のコードで、以下のコードを参照してnas_configオブジェクトを追加します。このオブジェクトは、マウント情報とユーザー ID を指定します。コアメソッドとパラメーター:
重要セッションの動的 NAS マウントと関数の NAS マウントを、[設定] > [詳細設定] > [ストレージ] 設定で同時に設定できますが、次の点にご注意ください。
以下の
NASConfigで定義されたユーザー ID/グループ IDは、関数のマウント設定で使用されるユーザー (ユーザー ID) およびユーザーグループ (グループ ID) と一致する必要があります。同じマウントパス (
mount_dir) を動的セッションマウントと関数マウントの両方で使用することはできません。
NASConfig: NAS ファイルシステムとユーザー ID を設定します。たとえば、テナント A に独立した UID/GID を割り当てることができます。NASMountConfig: NAS マウント設定。mount_dir: インスタンス内のマウントパス。例:/home/test。server_addr: NAS ファイルシステムのアドレスとテナント固有のサブディレクトリ。
user_id: このセッションに独立した POSIX ユーザー ID を指定します。group_id: このセッションに独立した POSIX グループ ID を指定します。
# -*- coding: utf-8 -*-
from alibabacloud_fc20230330.client import Client as FC20230330Client
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_fc20230330 import models as fc20230330_models
from alibabacloud_tea_util import models as util_models
# 1. アカウントクライアントを作成します。
credential = CredentialClient()
config = open_api_models.Config(credential=credential)
config.endpoint = f'<ご利用の Alibaba Cloud アカウント ID>.<エンドポイント>'
client = FC20230330Client(config)
# 2. NAS マウント設定を準備します。
nas_mount_config = fc20230330_models.NASMountConfig(
mount_dir='/mnt/data', # インスタンス内のマウントパス
server_addr='<ご利用の NAS サーバーアドレス>:/<テナント A のパス>' # NAS ファイルシステムのアドレスとテナント固有のサブディレクトリ
)
# 3. NAS ファイルシステムとユーザー ID を設定します。たとえば、テナント A に独立した UID/GID を割り当てます。
nas_config = fc20230330_models.NASConfig(
mount_points=[nas_mount_config],
user_id=1001, # このセッションに独立した POSIX ユーザー ID を指定します。
group_id=1001 # このセッションに独立した POSIX グループ ID を指定します。
)
# 4. CreateSession リクエストを構築します。
create_session_input = fc20230330_models.CreateSessionInput(
nas_config=nas_config,
session_ttlin_seconds=3600,
session_idle_timeout_in_seconds=600
)
create_session_request = fc20230330_models.CreateSessionRequest(
body=create_session_input
)
# 5. リクエストを送信します。
runtime = util_models.RuntimeOptions()
response = client.create_session_with_options('<ご利用の関数名>', create_session_request, {}, runtime)
# 6. 応答から sessionId を取得します。
print(response.body.to_map())
session_id = response.body.session_id
print(f"Session created successfully. Session ID: {session_id}")
ステップ 4: コードを実行してセッションを作成
次のコマンドを実行してコードを実行します:
export ALIBABA_CLOUD_ACCESS_KEY_ID=LTAI**************** export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<yourAccessKeySecret> python3 createSession.pyパラメーター:
ALIBABA_CLOUD_ACCESS_KEY_ID: ご利用の Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。
ALIBABA_CLOUD_ACCESS_KEY_SECRET: ご利用の Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。
結果を表示します。
コンソール出力:
{ 'containerId': 'c-********-********-************', 'createdTime': '2025-10-30T06:38:10Z', 'functionName': '****', 'lastModifiedTime': '2025-10-30T06:38:10Z', 'nasConfig': { 'groupId': 0, 'mountPoints': [ { 'enableTLS': False, 'mountDir': '/home/test', 'serverAddr': '*-*.*.nas.aliyuncs.com:/test' } ], 'userId': 0 }, 'qualifier': 'LATEST', 'sessionAffinityType': 'HEADER_FIELD', 'sessionId': '******************', 'sessionIdleTimeoutInSeconds': 600, 'sessionStatus': 'Active', 'sessionTTLInSeconds': 3600 } Session created successfully. Session ID: ************
ステップ 5: セッションを使用して関数を呼び出す
InvokeFunction - 関数の呼び出し API を呼び出して、セッションを使用して関数を呼び出します。
コアコードと説明:
InvokeFunctionHeaders: 前のステップで返された sessionId を含むようにリクエストヘッダーを構築します。ヘッダーキー の値は、ステップ 1: セッション保持の有効化 で設定した値 (例: x-affinity-header-v1) と一致している必要があります。これにより、セッションにバインドされたルーティングが実装されます。
# -*- coding: utf-8 -*-
from alibabacloud_fc20230330.client import Client as FC20230330Client
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_fc20230330 import models as fc20230330_models
from alibabacloud_tea_util import models as util_models
# 1. アカウントクライアントを作成します。
credential = CredentialClient()
config = open_api_models.Config(credential=credential)
config.endpoint = f'<ご利用の Alibaba Cloud アカウント ID>.<エンドポイント>'
client = FC20230330Client(config)
# 2. リクエストヘッダーを構築します。ヘッダーキー ("x-affinity-header-v1") は、関数に設定されたセッション保持キーと同じでなければなりません。
headers = fc20230330_models.InvokeFunctionHeaders(
common_headers={
"x-affinity-header-v1": 'session_id'
}
)
# 3. 呼び出しリクエストを構築します。必要に応じて本文を渡すことができます。
invoke_request = fc20230330_models.InvokeFunctionRequest(
body='your_request_payload'.encode('utf-8') # ペイロードの例
)
runtime = util_models.RuntimeOptions()
try:
# 4. 呼び出しリクエストを送信します。
invoke_response = client.invoke_function_with_options(
'your_function_name',
invoke_request,
headers,
runtime
)
# 5. 応答を処理します。
print(f"Status Code: {invoke_response.status_code}")
print(f"Response Body: {invoke_response.body.decode('utf-8')}")
except Exception as error:
print(error.message)
次のステップ: セッションの更新と削除
必要に応じて、UpdateSession - セッション設定の更新 を呼び出して、セッションの有効期間を延長したり、その他の更新を行ったりすることができます。
説明`CreateSession` 呼び出しで `nas_config` を渡した後、`UpdateSession` API を使用して設定を更新することはできません。
GetSession - セッション設定情報の取得 を呼び出して、現在のセッションの最新の設定情報を取得し、更新を確認できます。
タスクが完了したら、DeleteSession - セッションリソースの削除 を呼び出してセッションリソースを解放できます。
本番運用時の注意点
UID/GID 計画: 隔離を確実にするために、各テナントに一意の POSIX UID を割り当てる必要があります。
ディレクトリクォータ: 単一のテナントが共有ストレージスペースを使い果たすのを防ぐために、NAS 側で各テナントのルートディレクトリにディレクトリクォータを設定できます。
データガベージコレクション (GC):
<a baseurl="t3144757_v2_0_0.xdita" data-node="6117158" data-root="85749" data-tag="xref" href="t3144017.xdita#" id="3a76f76305rbs">DeleteSession - セッションリソースの削除</a>操作は、NAS 上のファイルデータを自動的に削除しません。ストレージスペースを再利用するために、孤立したファイルディレクトリを定期的にスキャンしてクリーンアップする、補助的な非同期ガベージコレクション (GC) メカニズムを設定する必要があります。
課金
CreateSession - セッションリソースの作成 操作が成功した後から課金が開始され、インスタンスの実行時間に基づいて請求されます。
セッションが期限切れになっていないか、削除されていない限り、アイドル状態であっても課金されます。
DeleteSession - セッションリソースの削除 API を呼び出した後、課金は次の 2 つの方法のいずれかで処理されます:
非隔離モードでは、`DeleteSession` は進行中の呼び出しを終了しません。セッションに関連付けられたインスタンスリソースは、実行が完了するまで課金されます。
隔離モードでは、`DeleteSession` は実行中のリクエストを終了し、バインドされたインスタンスリソースを破棄し、課金を停止します。
アクティブなセッション中にリクエストがある場合、アクティブなエラスティックインスタンスの単価に基づいて課金されます。リクエストがない場合、アイドル状態のエラスティックインスタンスの単価に基づいて課金されます。
その他の例
このトピックでは、Go SDK を使用した例を示します。その他の例については、OpenAPIExplorer をご参照ください。
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
fc20230330 "github.com/alibabacloud-go/fc-20230330/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func main() {
config := &openapi.Config{
AccessKeyId: tea.String("xxx"), // AccessKey ID を設定します。
AccessKeySecret: tea.String("xxx"), // AccessKey Secret を設定します。
Protocol: tea.String("http"),
Endpoint: tea.String("xxx"), // エンドポイントを設定します。
}
fcClient, err := fc20230330.NewClient(config)
if err != nil {
panic(err)
}
funcName := "test-session-function1"
qualifier := "LATEST"
sessionID, err := createSession(fcClient, funcName, qualifier)
if err != nil {
panic(err)
}
err = invokeFunctionWithSession(fcClient, funcName, qualifier, sessionID)
if err != nil {
panic(err)
}
err = updateSession(fcClient, funcName, sessionID, qualifier)
if err != nil {
panic(err)
}
err = getSession(fcClient, funcName, sessionID, qualifier)
if err != nil {
panic(err)
}
err = deleteSession(fcClient, funcName, sessionID, qualifier)
if err != nil {
panic(err)
}
return
}
// セッションリソースを作成します。
func createSession(fcClient *fc20230330.Client, functionName string, qualifier string) (string, error) {
body := fc20230330.CreateSessionInput{
SessionTTLInSeconds: tea.Int64(21500), // 時間はカスタマイズ可能です。
SessionIdleTimeoutInSeconds: tea.Int64(2000), // 時間はカスタマイズ可能です。
}
req := fc20230330.CreateSessionRequest{
Body: &body,
Qualifier: tea.String(qualifier),
}
resp, err := fcClient.CreateSession(&functionName, &req)
if err != nil {
return "", err
}
fmt.Printf("create session success %+v \n", resp.Body.String())
return *resp.Body.SessionId, nil
}
// セッションをリクエストします。
func invokeFunctionWithSession(fcClient *fc20230330.Client, functionName string, qualifier string, sessionId string) error {
commonHeaders := map[string]*string{
"x-affinity-header-v1": tea.String(sessionId), // キーは、関数作成時に指定したヘッダーフィールドと同じでなければなりません。
}
header := &fc20230330.InvokeFunctionHeaders{
CommonHeaders: commonHeaders,
}
invokeReq := &fc20230330.InvokeFunctionRequest{
Qualifier: tea.String(qualifier),
}
_, err := fcClient.InvokeFunctionWithOptions(tea.String(functionName), invokeReq, header, &util.RuntimeOptions{})
return err
}
// セッションリソースを更新します。
func updateSession(fcClient *fc20230330.Client, functionName string, sessionId string, qualifier string) error {
body := fc20230330.UpdateSessionInput{
SessionTTLInSeconds: tea.Int64(21501), // 時間は更新可能です。
SessionIdleTimeoutInSeconds: tea.Int64(2001), // 時間は更新可能です。
}
req := fc20230330.UpdateSessionRequest{
Body: &body,
Qualifier: tea.String(qualifier),
}
resp, err := fcClient.UpdateSession(&functionName, &sessionId, &req)
if err != nil {
return err
}
fmt.Printf("update session success %+v\n ", resp.Body.String())
return nil
}
// セッションリソースを取得します。
func getSession(fcClient *fc20230330.Client, functionName string, sessionId string, qualifier string) error {
req := &fc20230330.GetSessionRequest{}
if qualifier != "" {
req.Qualifier = tea.String(qualifier)
}
getSession, err := fcClient.GetSession(tea.String(functionName), tea.String(sessionId), req)
if err != nil {
return err
}
fmt.Printf("get session success %+v ", getSession.Body.String())
return nil
}
// セッションリソースを削除します。
func deleteSession(fcClient *fc20230330.Client, functionName string, sessionId string, qualifier string) error {
req := fc20230330.DeleteSessionRequest{
Qualifier: tea.String(qualifier),
}
resp, err := fcClient.DeleteSession(&functionName, &sessionId, &req)
if err != nil {
return err
}
fmt.Printf("delete session success %+v\n ", *resp.StatusCode)
return nil
}リファレンスと機能説明
機能 | 説明 |
| |
| |
指定された関数のセッションを一覧表示します。`qualifier`、ステータス、または `sessionID` でフィルタリングし、ページ分割クエリを使用できます。
| |
セッションの `SessionIdleTimeoutInSeconds` および `SessionTTLInSeconds` パラメーターを更新します。更新はすぐに有効になり、`lastModifiedTime` は自動的に更新されます。これを使用して、セッションの有効期間を動的に延長または短縮できます。 | |
|