本教學示範如何在 Azure 容器應用程式中部署 shell 會話池,並使用 Dynamic Sessions API 和 ARM 範本執行 shell 指令。
在本教學課程中,您會:
- 使用 ARM 範本部署 shell 會話池
- 建立一個由使用者指派且擁有適當權限的管理身份
- 透過動態會話 API 執行 shell 指令
先決條件
開始本教學課程之前,您需要下列資源。
| Requirement | Description |
|---|---|
| Azure 帳戶 | 您需要具有有效訂用帳戶的 Azure 帳戶。 如果您沒有帳戶,您可以 免費建立一個。 |
| Azure CLI | 安裝 Azure CLI。 |
設定
首先將 Azure CLI 更新到最新版本,然後登入 Azure。
將 Azure CLI 更新為最新版本。
az upgrade註冊
Microsoft.App資源提供者。az provider register --namespace Microsoft.App安裝最新版的 Azure 容器應用程式 CLI 延伸模組。
az extension add --name containerapp --allow-preview true --upgrade登入 Azure。
az login查詢您的 Azure 訂用帳戶識別碼,並將值設定為變數。
SUBSCRIPTION_ID=$(az account show --query id --output tsv)設定此程序中使用的變數。
執行下列命令之前,請務必將
<>所括住的預留位置以您自己的值取代。RESOURCE_GROUP=<RESOURCE_GROUP_NAME> SESSION_POOL_NAME=<SESSION_POOL_NAME> LOCATION=<LOCATION> API_VERSION="2025-10-02-preview"您可以使用這些變數,在下列步驟中建立資源。
設定你想用來建立資源群組的訂閱方式。
az account set -s $SUBSCRIPTION_ID建立資源群組。
az group create --name $RESOURCE_GROUP --location $LOCATION
建立 ARM 範本
建立一個名為 deploy.json ARM 的範本檔案來定義你的 shell 會話池。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"apiVersion": "2025-10-02-preview",
"name": "myshellpool",
"type": "Microsoft.App/sessionpools",
"location": "North Central US",
"properties": {
"poolManagementType": "Dynamic",
"containerType": "Shell", # Set the "containerType" property to "Shell"
"scaleConfiguration": {
"maxConcurrentSessions": 5
},
"dynamicPoolConfiguration": {
"lifecycleConfiguration": {
"lifecycleType": "Timed",
"cooldownPeriodInSeconds": 300
}
},
"sessionNetworkConfiguration": {
"status": "EgressEnabled"
}
}
}
]
}
部署 shell 會話池
使用 ARM 範本來部署你的 shell session 池。
az deployment group create --resource-group $RESOURCE_GROUP --template-file deploy.json
指派受控識別
建立一個使用者指派的受控識別,用於驗證 API 呼叫工作階段集區。
設定身份名稱和資源池 ID。
UAMI_NAME=${SESSION_POOL_NAME}-uami POOL_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionpools/$SESSION_POOL_NAME"建立使用者指派的受管理身分識別。
az identity create --resource-group $RESOURCE_GROUP --name $UAMI_NAME --location $LOCATION取得受控識別的主體識別碼。
UAMI_PRINCIPAL=$(az identity show --resource-group $RESOURCE_GROUP --name $UAMI_NAME --query principalId -o tsv)
將管理身份指派給你的 Azure 容器應用程式
建立或更新 Azure 容器應用程式時,請將使用者指定的管理身份指派給應用程式。 例如:
az containerapp update \
--name <CONTAINER_APP_NAME> \
--resource-group $RESOURCE_GROUP \
--user-assigned $UAMI_NAME
詳情請參閱 「為容器應用程式指派受管理身份 」。
為會話執行 API 設定角色指派
要與會話池的 API 互動,您必須將 Azure ContainerApps Session Executor 角色指派給您的管理身份。
等待身分識別傳播,然後將角色指派給受控識別。
az role assignment create --assignee $UAMI_PRINCIPAL --role "Azure ContainerApps Session Executor" --scope $POOL_ID
取得持有人權杖
要存取會話池的 API,你需要一個存取令牌。 方法取決於你執行程式碼的地點:
從您的 Azure 容器應用程式內部
從已指派使用者指派的受控識別的 Azure 容器應用程式執行時,請使用 Azure Instance Metadata Service (IMDS) 取得存取權杖:
ACCESS_TOKEN=$(curl -s -H "Metadata: true" \
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://dynamicsessions.io" \
| jq -r '.access_token')
此指令會取得令牌,並利用 access_token從 JSON 回應中提取jq值。
用於本地測試與開發
在本地或開發環境中測試時,您可以使用 Azure CLI 取得存取權杖(必須具備相應權限):
ACCESS_TOKEN=$(az account get-access-token --resource "https://dynamicsessions.io" --query accessToken --output tsv)
備註
為了讓本機測試正常運作,您的 Azure CLI 工作階段必須認證為擁有「Azure ContainerApps Session Executor」角色,並指派至工作階段集區的使用者或服務主體。 管理身份方法建議用於生產場景。
在您的工作階段中執行 shell 命令
現在您有持有人權杖可建立資訊安全內容,可以向工作階段集區傳送請求來執行 shell 命令。
建立 API 呼叫的請求主體。
EXEC_ID=$(uuidgen) BODY=$(cat <<EOF { "codeInputType": "inline", "executionType": "synchronous", "shellCommand": "echo Hello world!", "timeoutInSeconds": 600 } EOF )建構 API 端點的 URL。
URL="https://$LOCATION.dynamicsessions.io/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/sessionPools/$SESSION_POOL_NAME/executions?api-version=$API_VERSION&identifier=$EXEC_ID"執行 shell 指令。
在 Azure 容器應用程式內或進行本地測試時:
curl --request POST --url "$URL" --header "Authorization: Bearer $ACCESS_TOKEN" --header 'content-type: application/json' --data "$BODY"你應該會收到包含執行結果的 JSON 回應,包括 shell 指令(
hello world和hi)的輸出。
確認您的部署
您可以使用以下指令驗證您的資源是否已成功建立:
確認會話池的部署。
az resource show --ids "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionpools/$SESSION_POOL_NAME" --query '{name:name, location:location, provisioningState:properties.provisioningState}'確認角色分配。
az role assignment list --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionpools/$SESSION_POOL_NAME" --output table
清理資源
本教學課程中建立的資源會影響您的 Azure 帳單。 如果您不會長期使用這些服務,請執行下列命令來刪除本教學課程中建立的所有內容。
az group delete --resource-group $RESOURCE_GROUP