Azure Container Apps Dynamic Sessionを使ったコードインタープリタ (1) REST API

このエントリは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 の動的セッションの概要 / Azure Container Apps dynamic sessions overview
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から動作確認できる。ファイルのアップロード、ダウンロードも可能。

管理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>

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください