💡 ヒント: Fork せずに Codespaces で開いてもハンズオンは問題なく実行できます。Codespaces の利用は開いたユーザー自身のアカウントに課金されます(GitHub 無料枠: 120コア時間/月)。このハンズオンは約30分なので無料枠で十分です。
📝 Fork した場合: 上記ボタンのURLを自分のリポジトリに変更するか、GitHub リポジトリページの「Code」→「Codespaces」から直接開いてください。
このハンズオンでは、Azure Container Apps の動的セッション を使用して、クラウド上で Python コードを実行する方法を学びます。
- 前提条件
- Step 1: 環境のセットアップ
- Step 2: セッションプールの作成
- Step 3: ロールの割り当て
- Step 4: Python コードの実行
- Step 5: REST API を使用した実行(オプション)
- Step 6: セッションの管理
- クリーンアップ
⏱️ 所要時間: 約30分
- Azure サブスクリプションを保有していること
- Azure CLI がインストールされていること
- チュートリアル: Azure Container Apps を使用してセッション プールでシェル コマンドを実行する (プレビュー) | Microsoft Learn
- az containerapp sessionpool | Microsoft Learn
az upgradeaz version✅ 期待される結果: azure-cli のバージョンが 2.60.0 以上であること
az provider register --namespace Microsoft.Appaz extension add --name containerapp --allow-preview true --upgradeバージョンを確認します:
az version✅ 期待される結果: extensions に containerapp が表示されること
{
"extensions": {
"containerapp": "1.x.x"
}
}az login💡 Codespaces / DevContainer で実行する場合: ブラウザが開けない環境ではデバイスコードフローを使用してください。
az login --use-device-code表示されるコードを控え、ホストマシンのブラウザで https://microsoft.com/devicelogin を開いてコードを入力するとログインできます。
このハンズオンで使用する変数を設定します:
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
RESOURCE_GROUP="rg-containerapps-sessions"
SESSION_POOL_NAME="my-session-pool"
LOCATION="eastus"az account set -s $SUBSCRIPTION_IDaz group create --name $RESOURCE_GROUP --location $LOCATION✅ 期待される結果: "provisioningState": "Succeeded" が表示されること
az containerapp sessionpool create \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--container-type PythonLTS \
--max-sessions 100 \
--cooldown-period 300 \
--network-status EgressEnabled💡 パラメータの説明:
--container-type PythonLTS: Python 環境を使用--max-sessions 100: 最大同時セッション数--cooldown-period 300: セッションが非アクティブ後に削除されるまでの秒数--network-status EgressEnabled: インターネットへのアクセスを許可
✅ 期待される結果: "provisioningState": "Succeeded" が表示されること(作成に1-2分かかります)
az containerapp sessionpool show \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--query "{name:name, state:properties.provisioningState, type:properties.containerType}"✅ 期待される結果:
{
"name": "my-session-pool",
"state": "Succeeded",
"type": "PythonLTS"
}セッションプールでコードを実行するには、Azure ContainerApps Session Executor ロールが必要です。
USER_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)
echo "User Object ID: $USER_OBJECT_ID"POOL_ID=$(az containerapp sessionpool show \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--query id -o tsv)
echo "Pool ID: $POOL_ID"az role assignment create \
--role "Azure ContainerApps Session Executor" \
--assignee-object-id "$USER_OBJECT_ID" \
--assignee-principal-type User \
--scope "$POOL_ID"✅ 期待される結果: "roleDefinitionName": "Azure ContainerApps Session Executor" が表示されること
⚠️ 注意: ロールの割り当てが反映されるまで 1〜5分 かかる場合があります。次のステップでエラーが出た場合は、少し待ってから再試行してください。
az containerapp session code-interpreter execute \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--code "print('Hello, Azure Container Apps Sessions')" \
--identifier my-session-001✅ 期待される結果:
{
"result": {
"stdout": "Hello, Azure Container Apps Sessions\n",
"stderr": "",
"executionTimeInMilliseconds": xx
},
"status": "Succeeded"
}❌ 401 エラーが出た場合: ロールの割り当てがまだ反映されていません。1-2分待ってから再試行してください。
az containerapp session code-interpreter execute \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--code "import sys; print(f'Python version: {sys.version}')" \
--identifier my-session-001✅ 期待される結果: Python 3.12.x が表示されること
az containerapp session code-interpreter execute \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--code "
import math
radius = 5
area = math.pi * radius ** 2
print(f'半径 {radius} の円の面積: {area:.2f}')
" \
--identifier my-session-001✅ 期待される結果: 半径 5 の円の面積: 78.54 が表示されること
az containerapp session code-interpreter execute \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--code "
import pandas as pd
data = {
'名前': ['田中', '鈴木', '佐藤'],
'年齢': [25, 30, 35],
'スコア': [85, 92, 78]
}
df = pd.DataFrame(data)
print(df)
print(f'\n平均スコア: {df[\"スコア\"].mean():.1f}')
" \
--identifier my-session-001✅ 期待される結果: DataFrame と平均スコア 85.0 が表示されること
同じ --identifier を使うと、セッションの状態(変数など)が保持されます。
ステップ1: 変数を設定
az containerapp session code-interpreter execute \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--code "x = 100; print(f'x = {x}')" \
--identifier state-testステップ2: 同じセッションで変数を参照
az containerapp session code-interpreter execute \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--code "x += 50; print(f'x = {x}')" \
--identifier state-test✅ 期待される結果: x = 150 が表示されること(前回の値 100 に 50 が加算された)
💡 ポイント: 異なる
--identifierを使用すると、新しいセッションが作成されます。
Azure CLI の代わりに REST API を直接呼び出すこともできます。
ACCESS_TOKEN=$(az account get-access-token --resource https://dynamicsessions.io --query accessToken -o tsv)POOL_ENDPOINT=$(az containerapp sessionpool show \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--query properties.poolManagementEndpoint -o tsv)
echo "Endpoint: $POOL_ENDPOINT"EXEC_ID="api-test-001"
API_VERSION="2025-10-02-preview"
URL="${POOL_ENDPOINT}/executions?identifier=${EXEC_ID}&api-version=${API_VERSION}"
curl --request POST \
--url "$URL" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header 'content-type: application/json' \
--data '{
"codeInputType": "inline",
"executionType": "synchronous",
"code": "print(\"Hello from REST API\")",
"timeoutInSeconds": 60
}'✅ 期待される結果:
{
"identifier": "api-test-001",
"status": "Succeeded",
"result": {
"stdout": "Hello from REST API\n"
}
}Azure CLI を使用する場合:
az rest --method get \
--url "${POOL_ENDPOINT}/listSessions?api-version=2025-10-02-preview" \
--resource https://dynamicsessions.iocurl を使用する場合:
curl --request GET \
--url "${POOL_ENDPOINT}/listSessions?api-version=2025-10-02-preview" \
--header "Authorization: Bearer $ACCESS_TOKEN"✅ 期待される結果:
{
"sessions": [
{
"identifier": "my-session-001",
"createdAt": "2026-01-30T06:16:17.1402335Z",
"lastAccessedAt": "2026-01-30T06:16:17.1402335Z",
"expireAt": "2026-01-30T06:21:17.1400485Z"
}
]
}💡 注意: セッションは
cooldown-period(デフォルト300秒)経過後に自動的に削除されます。
最大セッション数を変更する例:
az containerapp sessionpool update \
--name $SESSION_POOL_NAME \
--resource-group $RESOURCE_GROUP \
--max-sessions 50ハンズオンが完了したら、作成したリソースを削除してコストを節約しましょう。
az group delete --resource-group $RESOURCE_GROUP --yes --no-wait💡 ヒント:
--no-waitオプションを使用すると、削除処理がバックグラウンドで実行されます。
Azure Container Apps 動的セッションのハンズオンを完了しました。
- ✅ セッションプールの作成と管理
- ✅ Azure CLI を使用した Python コードの実行
- ✅ REST API を使用したコード実行
- ✅ セッションの状態保持
- ✅ アクティブセッションの一覧取得
| サンプル | 説明 |
|---|---|
| code-interpreter | Python で Dynamic Sessions REST API を呼び出すサンプル |
| gpt-code-interpreter | Azure OpenAI の Function Calling で Dynamic Sessions をコード実行ツールとして利用するハンズオン |
| dynamic-sessions-mcp | Dynamic Sessions を MCP サーバーとして利用するハンズオン |
| gpt-mcp-interpreter | Azure OpenAI の Responses API + MCP で Dynamic Sessions をコード実行ツールとして利用するハンズオン |