共用方式為


使用適用於 Azure 虛擬桌面的 Azure 自動化和 Azure Logic Apps 來設定縮放工具

在本文中,您將了解使用 Azure 自動化 Runbook 和 Azure Logic Apps 的縮放工具,此工具會以上述兩者來自動縮放 Azure 虛擬桌面環境中的工作階段主機 VM。 若要深入了解調整工具,請參閱使用 Azure 自動化和 Azure Logic Apps 調整工作階段主機

注意

  • Azure 虛擬桌面的原生自動調整解決方案通常適用於集區式和個人主機集區,並根據調整排程自動縮減或擴增工作階段主機 VM。 建議您使用自動調整來簡化設定。 如需詳細資訊,請參閱自動調整縮放方案

  • 您無法使用 Azure 自動化和 Azure Logic Apps,連同自動調整,在相同的主機集區上調整工作階段主機。 您必須使用其中一個。

必要條件

開始設定調整工具之前,請先確定您已備妥下列項目:

  • Azure 虛擬桌面主機集區
  • 使用 Azure 虛擬桌面服務設定及註冊的工作階段主機集區 VM。
  • 已在 Azure 訂閱中獲指派「參與者」角色型存取控制 (RBAC) 角色的使用者,可以建立資源。 您也需要應用程式系統管理員和/或擁有者 RBAC 角色來建立受控識別。
  • Log Analytics 工作區 (選擇性)。

您用來部署工具的機器必須具備:

一切就緒後,就開始吧。

建立或更新 Azure 自動化帳戶

注意

如果您已有 Azure 自動化帳戶,還有一個 Runbook 執行舊版的縮放指令碼,則只需要遵循下列指示來確定更新版本即可。

首先,您需要 Azure 自動化帳戶來執行 PowerShell Runbook。 即使要以現有的 Azure 自動化帳戶來設定 PowerShell Runbook,本節所述的流程一樣適用。 以下是設定方式:

  1. 開啟 PowerShell。

  2. 執行下列 Cmdlet 來登入您的 Azure 帳戶。

    Login-AzAccount
    

    注意

    您的帳戶必須對想要部署調整工具的 Azure 訂閱具有參與者權限。

  3. 執行下列 Cmdlet 來下載用於建立 [Azure 自動化] 帳戶的指令碼:

    New-Item -ItemType Directory -Path "C:\Temp" -Force
    Set-Location -Path "C:\Temp"
    $Uri = "https://raw.githubusercontent.com/Azure/RDS-Templates/master/wvd-templates/wvd-scaling-script/CreateOrUpdateAzAutoAccount.ps1"
    # Download the script
    Invoke-WebRequest -Uri $Uri -OutFile ".\CreateOrUpdateAzAutoAccount.ps1"
    
  4. 執行下列 Cmdlet 來執行指令碼,並建立 Azure 自動化帳戶。 您可以填入參數的值,或將其標註以使用預設值。

    $Params = @{
         "AADTenantId"           = "<Azure_Active_Directory_tenant_ID>"   # Optional. If not specified, it will use the current Azure context
         "SubscriptionId"        = "<Azure_subscription_ID>"              # Optional. If not specified, it will use the current Azure context
         "UseARMAPI"             = $true
         "ResourceGroupName"     = "<Resource_group_name>"                # Optional. Default: "WVDAutoScaleResourceGroup"
         "AutomationAccountName" = "<Automation_account_name>"            # Optional. Default: "WVDAutoScaleAutomationAccount"
         "Location"              = "<Azure_region_for_deployment>"
         "WorkspaceName"         = "<Log_analytics_workspace_name>"       # Optional. If specified, Log Analytics will be used to configure the custom log table that the runbook PowerShell script can send logs to
    }
    
    .\CreateOrUpdateAzAutoAccount.ps1 @Params
    

    注意

    如果原則不允許您在特定區域中建立縮放指令碼資源,請更新原則指派,並將您要的區域新增至允許的區域清單。

  5. 如果您之前未建立自動化帳戶,則 Cmdlet 的輸出在自動化帳戶變數中會包含加密的 Webhook URI。 請務必保留 URI 的記錄,原因在於當您設定 Azure 邏輯應用程式的執行排程時,會使用該記錄作為參數。 如果要更新現有的自動化帳戶,您可以使用 PowerShell 來存取變數,以擷取 Webhook URI。

  6. 若您為 Log Analytics 指定 WorkspaceName 參數,則 Cmdlet 的輸出亦會包含 Log Analytics 工作區識別碼及其主索引鍵。 請記下工作區識別碼和主索引鍵,當您稍後設定 Azure 邏輯應用程式的執行排程時,必須再次搭配參數加以使用。

  7. 設定 [Azure 自動化] 帳戶之後,請登入您的 Azure 訂用帳戶,並檢查以確保您的 [Azure 自動化] 帳戶和相關的 Runbook 已出現在指定的資源群組中,如下圖所示:

    An image of the Azure overview page showing the newly created Azure Automation account and runbook.

    若要檢查您的 Webhook 是否位於其應有位置,請選取 Runbook 的名稱。 接下來,移至 Runbook 的 [資源] 區段,然後選取 [Webhook]。

建立受控識別

現在您已擁有 Azure 自動化帳戶,如果您尚未設定受控識別,您也必須進行設定。 受控識別將協助您的 Runbook 存取其他 Microsoft Entra 相關資源,以及對重要的自動化流程進行驗證。

若要設定受控識別,請遵循針對 Azure 自動化帳戶使用系統指派的受控識別中的指示。 建立受控識別之後,請為其指派適當的參與者權限,以管理 Azure 虛擬桌面資源 (例如主機集區、VM 等)。完成後,請回到本文並建立 Azure Logic 應用程式與執行排程以完成初始設定程序。

建立 Azure 邏輯應用程式與執行排程

最後,您必須建立 Azure Logic 應用程式,並為新的調整工具設定執行排程。 首先,下載並匯入虛擬桌面 PowerShell 模組,供您的 PowerShell 工作階段中使用 (如果還沒這麼做)。

  1. 開啟 PowerShell。

  2. 執行下列 Cmdlet 來登入您的 Azure 帳戶。

    Login-AzAccount
    
  3. 執行下列 Cmdlet 來下載用來建立 Azure 邏輯應用程式的指令碼。

    New-Item -ItemType Directory -Path "C:\Temp" -Force
    Set-Location -Path "C:\Temp"
    $Uri = "https://raw.githubusercontent.com/Azure/RDS-Templates/master/wvd-templates/wvd-scaling-script/CreateOrUpdateAzLogicApp.ps1"
    # Download the script
    Invoke-WebRequest -Uri $Uri -OutFile ".\CreateOrUpdateAzLogicApp.ps1"
    
  4. 執行下列 PowerShell 指令碼,為您的主機集區建立 Azure 邏輯應用程式和執行排程

    注意

    您必須針對想要自動調整的每個主機集區執行此指令碼,但只需要一個 Azure 自動化帳戶。

    $AADTenantId = (Get-AzContext).Tenant.Id
    
    $AzSubscription = Get-AzSubscription | Out-GridView -OutputMode:Single -Title "Select your Azure Subscription"
    Select-AzSubscription -Subscription $AzSubscription.Id
    
    $ResourceGroup = Get-AzResourceGroup | Out-GridView -OutputMode:Single -Title "Select the resource group for the new Azure Logic App"
    
    $WVDHostPool = Get-AzResource -ResourceType "Microsoft.DesktopVirtualization/hostpools" | Out-GridView -OutputMode:Single -Title "Select the host pool you'd like to scale"
    
    $LogAnalyticsWorkspaceId = Read-Host -Prompt "If you want to use Log Analytics, enter the Log Analytics Workspace ID returned by when you created the Azure Automation account, otherwise leave it blank"
    $LogAnalyticsPrimaryKey = Read-Host -Prompt "If you want to use Log Analytics, enter the Log Analytics Primary Key returned by when you created the Azure Automation account, otherwise leave it blank"
    $RecurrenceInterval = Read-Host -Prompt "Enter how often you'd like the job to run in minutes, e.g. '15'"
    $BeginPeakTime = Read-Host -Prompt "Enter the start time for peak hours in local time, e.g. 9:00"
    $EndPeakTime = Read-Host -Prompt "Enter the end time for peak hours in local time, e.g. 18:00"
    $TimeDifference = Read-Host -Prompt "Enter the time difference between local time and UTC in hours, e.g. +5:30"
    $SessionThresholdPerCPU = Read-Host -Prompt "Enter the maximum number of sessions per CPU that will be used as a threshold to determine when new session host VMs need to be started during peak hours"
    $MinimumNumberOfRDSH = Read-Host -Prompt "Enter the minimum number of session host VMs to keep running during off-peak hours"
    $MaintenanceTagName = Read-Host -Prompt "Enter the name of the Tag associated with VMs you don't want to be managed by this scaling tool"
    $LimitSecondsToForceLogOffUser = Read-Host -Prompt "Enter the number of seconds to wait before automatically signing out users. If set to 0, any session host VM that has user sessions, will be left untouched"
    $LogOffMessageTitle = Read-Host -Prompt "Enter the title of the message sent to the user before they are forced to sign out"
    $LogOffMessageBody = Read-Host -Prompt "Enter the body of the message sent to the user before they are forced to sign out"
    
    $WebhookURI = Read-Host -Prompt "Enter the webhook URI that has already been generated for this Azure Automation account. The URI is stored as encrypted in the above Automation Account variable. To retrieve the value, see https://learn.microsoft.com/azure/automation/shared-resources/variables?tabs=azure-powershell#powershell-cmdlets-to-access-variables"
    
    $Params = @{
         "AADTenantId"                   = $AADTenantId                             # Optional. If not specified, it will use the current Azure context
         "SubscriptionID"                = $AzSubscription.Id                       # Optional. If not specified, it will use the current Azure context
         "ResourceGroupName"             = $ResourceGroup.ResourceGroupName         # Optional. Default: "WVDAutoScaleResourceGroup"
         "Location"                      = $ResourceGroup.Location                  # Optional. Default: "West US2"
         "UseARMAPI"                     = $true
         "HostPoolName"                  = $WVDHostPool.Name
         "HostPoolResourceGroupName"     = $WVDHostPool.ResourceGroupName           # Optional. Default: same as ResourceGroupName param value
         "LogAnalyticsWorkspaceId"       = $LogAnalyticsWorkspaceId                 # Optional. If not specified, script will not log to the Log Analytics
         "LogAnalyticsPrimaryKey"        = $LogAnalyticsPrimaryKey                  # Optional. If not specified, script will not log to the Log Analytics
         "RecurrenceInterval"            = $RecurrenceInterval                      # Optional. Default: 15
         "BeginPeakTime"                 = $BeginPeakTime                           # Optional. Default: "09:00"
         "EndPeakTime"                   = $EndPeakTime                             # Optional. Default: "17:00"
         "TimeDifference"                = $TimeDifference                          # Optional. Default: "-7:00"
         "SessionThresholdPerCPU"        = $SessionThresholdPerCPU                  # Optional. Default: 1
         "MinimumNumberOfRDSH"           = $MinimumNumberOfRDSH                     # Optional. Default: 1
         "MaintenanceTagName"            = $MaintenanceTagName                      # Optional.
         "LimitSecondsToForceLogOffUser" = $LimitSecondsToForceLogOffUser           # Optional. Default: 1
         "LogOffMessageTitle"            = $LogOffMessageTitle                      # Optional. Default: "Machine is about to shutdown."
         "LogOffMessageBody"             = $LogOffMessageBody                       # Optional. Default: "Your session will be logged off. Please save and close everything."
         "WebhookURI"                    = $WebhookURI
    }
    
    .\CreateOrUpdateAzLogicApp.ps1 @Params
    

    執行指令碼之後,Azure 邏輯應用程式應該會出現在資源群組中,如下圖所示。

    An image of the overview page for an example Azure Logic App.

    若要變更執行排程,例如變更週期間隔或時區,請移至 Azure 邏輯應用程式自動調整排程器,然後選取 [編輯] 以移至 Azure 邏輯應用程式設計工具。

    An image of the Azure Logic App Designer. The Recurrence and webhook menus that let the user edit recurrence times and the webhook file are open.

管理調整工具

現在您已經建立調整工具,且可以存取其輸出。 本節說明一些可能有幫助的功能。

檢視作業狀態

您可以檢視所有 Runbook 作業的摘要狀態,或在 Azure 入口網站中檢視特定 Runbook 作業的深入狀態。

在選取的 Azure 自動化帳戶右邊,您可以在 [作業統計資料] 下方,看到所有 Runbook 作業摘要的清單。 開啟視窗左側的 [作業] 頁面,會顯示目前的工作狀態、開始時間和完成時間。

A screenshot of the job status page.

檢視記錄和調整工具輸出

您可以開啟 Runbook 並選取作業,以檢視擴增和縮減作業的記錄。

在裝載 Azure 自動化帳戶的資源群組中,巡覽至 Runbook,然後選取 [概觀]。 在概觀頁面上,在 [最近的工作] 下選取作業,以檢視其縮放工具輸出,如下圖所示。

An image of the output window for the scaling tool.

檢查 Runbook 指令碼版本號碼

您可以在 Azure 自動化帳戶中開啟 Runbook 檔案,然後選取 [檢視],以檢查您使用哪個版本的 Runbook 指令碼。 Runbook 的指令碼出現在畫面右側。 在指令碼中,您在 SYNOPSIS 區段下會看到 v#.#.# 格式的版本號碼。 您可以在這裡找到最新版本號碼。 如果您在 Runbook 指令碼中沒看到版本號碼,則表示您執行舊版的指令碼,應該立即更新。 如果您需要更新 Runbook 指令碼,請遵循建立或更新 Azure 自動化帳戶中的指示。

回報問題

回報問題時,您必須提供下列資訊,以協助我們進行疑難排解:

  • 在造成問題的作業中,來自 [所有記錄] 索引標籤的完整記錄。 若要了解如何取得記錄,請遵循檢視記錄和縮放工具輸出中的指示。 如果記錄中有任何敏感性或私人資訊,可以先移除,再將問題提交給我們。

  • 您使用的 Runbook 指令碼版本。 若要了解如何取得版本號碼,請參閱檢查 Runbook 指令碼版本號碼

  • Azure 自動化帳戶中安裝的以下每個 PowerShell 模組的版本號碼。 若要尋找這些模組,請開啟 Azure 自動化帳戶,在視窗左側窗格中的 [共用資源] 區段下選取 [模組],然後搜尋模組的名稱。

    • Az.Accounts
    • Az.Compute
    • Az.Resources
    • Az.Automation
    • OMSIngestionAPI
    • Az.DesktopVirtualization

Log Analytics

如果決定使用 Log Analytics,您可以在 Log Analytics 工作區的 [記錄] 檢視中,在 [自訂記錄] 下名為 WVDTenantScale_CL 的自訂記錄中,檢視所有記錄資料。 我們列出一些可能很有用的範例查詢。

  • 若要查看主機集區的所有記錄,請輸入下列查詢:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • 若要檢視主機集區中目前執行中的工作階段主機 VM 和作用中使用者工作階段總數,請輸入下列查詢:

    WVDTenantScale_CL
    | where logmessage_s contains "Number of running session hosts:"
         or logmessage_s contains "Number of user sessions:"
         or logmessage_s contains "Number of user sessions per Core:"
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • 若要檢視主機集區中所有工作階段主機 VM 的狀態,請輸入下列查詢:

    WVDTenantScale_CL
    | where logmessage_s contains "Session host:"
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • 若要檢視任何錯誤和警告,請輸入下列查詢:

    WVDTenantScale_CL
    | where logmessage_s contains "ERROR:" or logmessage_s contains "WARN:"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    

限制

以下是使用此縮放指令碼之縮放工作階段主機 VM 的一些限制:

  • 縮放指令碼不會考慮標準時間和日光節約時間的時間變更。