Configurar a ferramenta de dimensionamento usando a Automação do Azure e os Aplicativos Lógicos do Azure para Área de Trabalho Virtual do Azure

Neste artigo, você aprenderá sobre a ferramenta de dimensionamento que usa um runbook de Automação do Azure e o Aplicativo Lógico do Azure para dimensionar automaticamente VMs de host de sessão em seu ambiente de Área de Trabalho Virtual do Azure. Para saber mais sobre a ferramenta de dimensionamento, consulte Dimensionar hosts de sessão usando a Automação do Azure e os Aplicativos Lógicos do Azure.

Nota

  • A solução de Autoscale nativa da Área de Trabalho Virtual do Azure está geralmente disponível para pool(s) e pool(s) de host pessoal e dimensionará automaticamente VMs de host de sessão com base no agendamento de escala. Recomendamos o uso do Autoscale para facilitar a configuração. Para obter mais informações, consulte Planos de dimensionamento automático.

  • Não é possível dimensionar hosts de sessão usando a Automação do Azure e os Aplicativos Lógicos do Azure junto com o dimensionamento automático no mesmo pool de hosts. Você deve usar um ou outro.

Pré-requisitos

Antes de começar a configurar a ferramenta de dimensionamento, verifique se você tem as seguintes coisas prontas:

  • Um pool de hosts da Área de Trabalho Virtual do Azure.
  • VMs do pool de hosts de sessão configuradas e registradas no serviço de Área de Trabalho Virtual do Azure.
  • Um usuário com a função RBAC (controle de acesso baseado na função de Colaborador ) atribuída na assinatura do Azure para criar os recursos. Você também precisará da função de administrador de aplicativo e/ou RBAC de proprietário para criar uma identidade gerenciada.
  • Um espaço de trabalho do Log Analytics (opcional).

A máquina que você usa para implantar a ferramenta deve ter:

Se você tem tudo pronto, vamos começar.

Criar ou atualizar uma conta de Automação do Azure

Nota

Se você já tiver uma conta de Automação do Azure com um runbook executando uma versão mais antiga do script de dimensionamento, tudo o que você precisa fazer é seguir as instruções abaixo para garantir que ele seja atualizado.

Primeiro, você precisará de uma conta de Automação do Azure para executar o runbook do PowerShell. O processo descrito nesta seção é válido mesmo se você tiver uma conta de Automação do Azure existente que deseja usar para configurar o runbook do PowerShell. Veja como configurá-lo:

  1. Abra o PowerShell.

  2. Execute o cmdlet a seguir para entrar em sua conta do Azure.

    Login-AzAccount
    

    Nota

    Sua conta deve ter direitos de colaborador na assinatura do Azure onde você deseja implantar a ferramenta de dimensionamento.

  3. Execute o seguinte cmdlet para baixar o script para criar a conta de Automação do 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. Execute o cmdlet a seguir para executar o script e criar a conta de Automação do Azure. Você pode preencher valores para os parâmetros ou comentá-los para usar seus padrões.

    $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
    

    Nota

    Se sua política não permitir que você crie recursos de script de dimensionamento em uma região específica, atualize a atribuição de política e adicione a região desejada à lista de regiões permitidas.

  5. Se você não tiver criado uma conta de automação antes, a saída do cmdlet incluirá um URI de webhook criptografado na variável de conta de automação. Certifique-se de manter um registro do URI porque você o usará como um parâmetro ao configurar o cronograma de execução para o Aplicativo Lógico do Azure. Se você estiver atualizando uma conta de automação existente, poderá recuperar o URI do webhook usando o PowerShell para acessar variáveis.

  6. Se você especificou o parâmetro WorkspaceName for Log Analytics, a saída do cmdlet também incluirá o ID do Espaço de Trabalho do Log Analytics e sua Chave Primária. Anote a ID do Espaço de Trabalho e a Chave Primária porque você precisará usá-los novamente mais tarde com parâmetros ao configurar o cronograma de execução para o Aplicativo Lógico do Azure.

  7. Depois de configurar sua conta de Automação do Azure, entre em sua assinatura do Azure e verifique se sua conta de Automação do Azure e o runbook relevante apareceram em seu grupo de recursos especificado, conforme mostrado na imagem a seguir:

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

    Para verificar se o seu webhook está onde deveria estar, selecione o nome do seu runbook. Em seguida, vá para a seção Recursos do seu runbook e selecione Webhooks.

Criar uma identidade gerenciada

Agora que você tem uma conta de Automação do Azure, também precisará configurar uma identidade gerenciada, caso ainda não o tenha feito. As identidades gerenciadas ajudarão seu runbook a acessar outros recursos relacionados ao Microsoft Entra, bem como autenticar processos de automação importantes.

Para configurar uma identidade gerenciada, siga as instruções em Usando uma identidade gerenciada atribuída ao sistema para uma conta de Automação do Azure. Depois de criar uma identidade gerenciada, atribua-a com as permissões de colaborador apropriadas aos recursos da Área de Trabalho Virtual do Azure, como pools de hosts, VMs, etc. Quando terminar, volte a este artigo e Crie o Aplicativo Lógico do Azure e o cronograma de execução para concluir o processo de configuração inicial.

Criar o Aplicativo Lógico do Azure e o cronograma de execução

Por fim, você precisará criar o Aplicativo Lógico do Azure e configurar um cronograma de execução para sua nova ferramenta de dimensionamento. Primeiro, baixe e importe o módulo PowerShell de virtualização de área de trabalho para usar em sua sessão do PowerShell, caso ainda não o tenha feito.

  1. Abra o PowerShell.

  2. Execute o cmdlet a seguir para entrar em sua conta do Azure.

    Login-AzAccount
    
  3. Execute o cmdlet a seguir para baixar o script para criar o Aplicativo Lógico do 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. Execute o seguinte script do PowerShell para criar o Aplicativo Lógico do Azure e o agendamento de execução para seu pool de hosts

    Nota

    Você precisará executar esse script para cada pool de hosts que deseja dimensionar automaticamente, mas precisa apenas de uma conta de Automação do 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
    

    Depois de executar o script, o Aplicativo Lógico do Azure deve aparecer em um grupo de recursos, conforme mostrado na imagem a seguir.

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

    Para fazer alterações na agenda de execução, como alterar o intervalo de recorrência ou o fuso horário, vá para o agendador de dimensionamento automático do Aplicativo Lógico do Azure e selecione Editar para ir para o Designer de Aplicativo Lógico do 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.

Gerencie sua ferramenta de dimensionamento

Agora que você criou sua ferramenta de dimensionamento, você pode acessar sua saída. Esta seção descreve alguns recursos que você pode achar úteis.

Ver o estado de tarefa

Você pode exibir um status resumido de todos os trabalhos de runbook ou exibir um status mais detalhado de um trabalho de runbook específico no portal do Azure.

À direita da sua conta de Automação do Azure selecionada, em "Estatísticas de Trabalho", você pode exibir uma lista de resumos de todos os trabalhos de runbook. Abrir a página Trabalhos no lado esquerdo da janela mostra os status atuais do trabalho, as horas de início e as horas de conclusão.

A screenshot of the job status page.

Exibir logs e saída da ferramenta de dimensionamento

Você pode exibir os logs de operações de expansão e expansão abrindo seu runbook e selecionando o trabalho.

Navegue até o runbook em seu grupo de recursos que hospeda a conta de Automação do Azure e selecione Visão geral. Na página de visão geral, selecione um trabalho em Trabalhos recentes para exibir a saída da ferramenta de dimensionamento, conforme mostrado na imagem a seguir.

An image of the output window for the scaling tool.

Verifique o número da versão do script runbook

Você pode verificar qual versão do script runbook está usando abrindo o arquivo runbook em sua conta de Automação do Azure e selecionando Exibir. Um script para o runbook aparecerá no lado direito da tela. No script, você verá o número da versão no formato v#.#.# abaixo da SYNOPSIS seção . Pode encontrar o número da versão mais recente aqui. Se você não vir um número de versão em seu script de runbook, isso significa que você está executando uma versão anterior do script e deve atualizá-lo imediatamente. Se você precisar atualizar seu script de runbook, siga as instruções em Criar ou atualizar uma conta de Automação do Azure.

Comunicar problemas

Quando comunicar um problema, terá de fornecer as seguintes informações para nos ajudar a resolver problemas:

  • Um log completo da guia Todos os logs no trabalho que causou o problema. Para saber como obter o log, siga as instruções em Exibir logs e saída da ferramenta de dimensionamento. Se houver alguma informação sensível ou privada no registro, você pode removê-la antes de enviar o problema para nós.

  • A versão do script runbook que você está usando. Para saber como obter o número da versão, consulte Verificar o número da versão do script runbook

  • O número da versão de cada um dos seguintes módulos do PowerShell instalados em sua conta de Automação do Azure. Para localizar esses módulos, abra a conta de Automação do Azure, selecione Módulos na seção Recursos Compartilhados no painel do lado esquerdo da janela e procure o nome do módulo.

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

Log Analytics

Se você decidiu usar o Log Analytics, poderá visualizar todos os dados de log em um log personalizado chamado WVDTenantScale_CL em Logs personalizados na visualização Logs do seu espaço de trabalho do Log Analytics. Listamos alguns exemplos de consultas que você pode achar úteis.

  • Para ver todos os logs de um pool de hosts, insira a seguinte consulta:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Para exibir o número total de VMs de host de sessão em execução e sessões de usuário ativas em seu pool de hosts, insira a seguinte consulta:

    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
    
  • Para exibir o status de todas as VMs de host de sessão em um pool de hosts, insira a seguinte consulta:

    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
    
  • Para visualizar quaisquer erros e avisos, introduza a seguinte consulta:

    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
    

Limitações

Aqui estão algumas limitações com o dimensionamento de VMs de host de sessão com esse script de dimensionamento:

  • O script de dimensionamento não considera as alterações de horário entre o horário padrão e o horário de verão.