このエントリは2024/06/25現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。
Azure Container AppsにDynamic Sessions(動的セッション)がPreviewとして利用できるようになっている。これはLLMなどで生成されたコードをサンドボックスで実行できるようにしたもの。
Azure Container Apps dynamic sessions provide fast access to secure sandboxed environments that are ideal for running code or applications that require strong isolation from other workloads.
Azure Container Apps の動的セッションの概要 / Azure Container Apps dynamic sessions overview
Azure Container Apps の動的セッションを使用すると、セキュリティで保護されたサンドボックス環境にすばやくアクセスできます。これは、他のワークロードからの強力な分離を必要とするコードやアプリケーションの実行に最適です。
https://learn.microsoft.com/azure/container-apps/sessions
基本的なお作法はドキュメントにある通りなので、その通りに実施すれば問題なく動作する。GAのタイミングで変更が発生する可能性が大ではあるが、2024/06/25現在のはまりどころを備忘録として残しておく。
session poolの作成
以下のコマンドを使って、Code interpreter sessionpoolを作る。
az containerapp sessionpool create
https://learn.microsoft.com/cli/azure/containerapp/sessionpool?view=azure-cli-latest#az-containerapp-sessionpool-create
注意
- Portalからは作成できない
- Preview時点では、コンテナータイプはPythonのみをサポート
az containerapp sessionpool create \
--name my-session-pool \
--resource-group <RESOURCE_GROUP> \
--location eastus \
--container-type PythonLTS \
--max-sessions 100 \
--cooldown-period 300 \
--network-status EgressDisabled
作成後はAzure PortalのPlaygroundから動作確認できる。ファイルのアップロード、ダウンロードも可能。
![](https://logico-jp.io/wp-content/uploads/2024/06/image-8.png?w=1024)
管理APIエンドポイント
Session Pool作成時に出力されるが、以下のコマンドを実行して取得することもできる。
az containerapp sessionpool show \
--name my-session-pool \
--resource-group <RESOURCE_GROUP> \
--query 'properties.poolManagementEndpoint' -o tsv
az containerapp sessionpool show
https://learn.microsoft.com/cli/azure/containerapp/sessionpool?view=azure-cli-latest#az-containerapp-sessionpool-show
Endpointの形式は以下のよう。
https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>
管理 API エンドポイント / Management API endpoints
https://learn.microsoft.com/azure/container-apps/sessions-code-interpreter#management-api-endpoints
認証
注意
- Microsoft Entra ID認証のみ(Access tokenを利用)。
- Session Poolにアクセスするためには、Service Principal/User accountはSession Poolの
Azure ContainerApps Session Executor
ロールとContributor
ロールに属している必要がある。
もしクライアントアプリケーションでsystem assigned managed identityを利用可能なのであれば、いつものお作法通り、以下のようにしてAccess tokenを取得できる。ドキュメントにはJavaの例が無かったので以下に記載しておく。
// スコープは https://dynamicsessions.io/.default
DefaultAzureCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();
TokenRequestContext tokenRequestContext = new TokenRequestContext().addScopes("https://dynamicsessions.io/.default");
String accessToken = defaultAzureCredential.getToken(tokenRequestContext).map(AccessToken::getToken).block();
セッション管理
Endpointに投げ込む場合、Session IDをクライアント側で指定する必要がある。適当な値を利用者側で指定可能。使い回すこともできるが、衝突しないよう、漏えいしないように注意が必要。
セッション / Sessions
https://learn.microsoft.com/azure/container-apps/sessions?tabs=azure-cli#sessions
管理APIエンドポイントに対してコード実行リクエストを投げる
POSTで投げ込む。
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>
{
"properties": {
"codeInputType": "inline",
"executionType": "synchronous",
"code": "print('Hello, world!')"
}
}
ファイルのアップロード・ダウンロード、ファイルリスト取得も可能。
# Upload
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream
(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
# Download
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
# File listing
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>