Configuración de la herramienta de escalado mediante Azure Automation y Azure Logic Apps para Azure Virtual Desktop

En este artículo, obtendrá información sobre la herramienta de escalado que usa un runbook de Azure Automation y Azure Logic Apps para escalar automáticamente las máquinas virtuales del host de sesión en el entorno de Azure Virtual Desktop. Para más información sobre la herramienta de escalado, consulte Escalado de hosts de sesión mediante Azure Automation y Azure Logic Apps.

Nota:

  • La solución de escalabilidad automática nativa de Azure Virtual Desktop está disponible con carácter general para los grupos de hosts personales y agrupados, y escalará o reducirá verticalmente de forma automática las máquinas virtuales del host de sesión en función de la programación de escalado. Se recomienda usar la escalabilidad automática para facilitar la configuración. Para obtener más información, consulte Planes de escalado de la escalabilidad automática.

  • No puede escalar hosts de sesión mediante Azure Automation y Azure Logic Apps junto con la escalabilidad automática en el mismo grupo de hosts. Debe usar la una o los otros.

Requisitos previos

Antes de empezar a configurar la herramienta de escalado, asegúrese de tener preparado lo siguiente:

  • Un grupo de hosts de Azure Virtual Desktop.
  • Máquinas virtuales del grupo de hosts de sesión configuradas y registradas en el servicio Azure Virtual Desktop.
  • Un usuario con el rol de control de acceso basado en roles (RBAC) deColaborador asignado en la suscripción de Azure para crear los recursos. También necesitará el rol RBAC de Administrador de aplicaciones o Propietario para crear una identidad administrada.
  • Un área de trabajo de Log Analytics (opcional).

La máquina que se usa para implementar la herramienta debe tener:

Si tiene todo preparado, vamos a empezar.

Creación o actualización de una cuenta de Azure Automation

Nota

Si ya tiene una cuenta de Azure Automation con un runbook que ejecuta una versión anterior del script de escalado, solo debe seguir las instrucciones a continuación para asegurarse de que está actualizado.

En primer lugar, necesitará una cuenta de Azure Automation para ejecutar el runbook de PowerShell. El proceso que se describe en esta sección es válido incluso si tiene una cuenta de Azure Automation existente que quiera usar para configurar el runbook de PowerShell. Así es como se configura:

  1. Abra PowerShell.

  2. Ejecute el siguiente cmdlet para iniciar sesión en la cuenta de Azure.

    Login-AzAccount
    

    Nota

    La cuenta debe tener derechos de colaborador en la suscripción a Azure en la que quiere implementar la herramienta de escalado.

  3. Ejecute el siguiente cmdlet para descargar el script para crear la cuenta de Azure Automation:

    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. Ejecute el siguiente cmdlet para ejecutar el script y crear la cuenta de Azure Automation. Puede rellenar los valores de los parámetros o marcarlos como comentario para que se usen los valores predeterminados.

    $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:

    Si la directiva no le permite crear recursos de script de escalado en una región específica, actualice la asignación de directiva y agregue la región que desee a la lista de regiones permitidas.

  5. Si no ha creado una cuenta de Automation antes, la salida del cmdlet incluirá un URI de webhook cifrado en la variable de cuenta de Automation. Asegúrese de mantener un registro del URI porque lo usará como parámetro cuando configure la programación de ejecución para la aplicación lógica de Azure. Si va a actualizar una cuenta de Automation existente, puede recuperar el URI de webhook mediante PowerShell para acceder a las variables.

  6. Si especificó el parámetro WorkspaceName para Log Analytics, la salida del cmdlet también incluirá el id. del área de trabajo de Log Analytics y su clave principal. Anote el identificador del área de trabajo y la clave principal, ya que tendrá que usarlos de nuevo más adelante con parámetros al configurar la programación de ejecución de la aplicación lógica de Azure.

  7. Después de configurar la cuenta de Azure Automation, inicie sesión en la suscripción de Azure y asegúrese de que la cuenta de Azure Automation y el runbook correspondiente han aparecido en el grupo de recursos especificado, tal como se muestra en la siguiente imagen:

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

    Para comprobar si el webhook está donde debe estar, seleccione el nombre del runbook. A continuación, vaya a la sección Recursos del runbook y seleccione Webhooks.

Creación de una entidad administrada

Ahora que tienes una cuenta de Azure Automation, también deberás configurar una identidad administrada si aún no lo has hecho. Las identidades administradas ayudarán al runbook a acceder a otros recursos relacionados con Microsoft Entra, así como a autenticar procesos de automatización importantes.

Para configurar una identidad administrada, sigue las instrucciones de Uso de una identidad administrada asignada por el sistema para una cuenta de Azure Automation. Una vez que haya creado una identidad administrada, asígnela con los permisos de colaborador adecuados a recursos de Azure Virtual Desktop, como grupos de hosts, máquinas virtuales, etc. Una vez que hayas terminado, vuelve a este artículo y Crea la programación de ejecución y la aplicación lógica de Azure para finalizar el proceso de instalación inicial.

Creación de la aplicación lógica de Azure y la programación de ejecución

Por último, deberá crear la aplicación lógica de Azure y configurar una programación de ejecución para la nueva herramienta de escalado. En primer lugar y, si aún no lo ha hecho, descargue e importe el módulo de PowerShell para virtualización de Escritorio que se usará en la sesión de PowerShell.

  1. Abra PowerShell.

  2. Ejecute el siguiente cmdlet para iniciar sesión en la cuenta de Azure.

    Login-AzAccount
    
  3. Ejecute el siguiente cmdlet para descargar el script para crear la aplicación lógica de 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. Ejecute el siguiente script de PowerShell para crear la aplicación lógica de Azure y la programación de ejecución del grupo de hosts.

    Nota

    Tendrá que ejecutar este script en cada grupo de hosts que quiera escalar automáticamente, pero solo necesita una cuenta de Azure Automation.

    $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
    

    Después de ejecutar el script, la aplicación lógica de Azure debe aparecer en un grupo de recursos, como se muestra en la siguiente imagen.

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

    Para realizar cambios en la programación de ejecución, como cambiar el intervalo de periodicidad o la zona horaria, vaya al programador de escalabilidad automática de la aplicación lógica de Azure y seleccione Editar para ir al diseñador de aplicaciones lógicas de 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.

Administración de la herramienta de escalado

Ahora que ha creado la herramienta de escalado, puede acceder a su salida. En esta sección se describen algunas características que pueden resultarle útiles.

Ver estado del trabajo

Puede ver un resumen del estado de todos los trabajos del runbook o profundizar en el estado de un trabajo de runbook específico en Azure Portal.

A la derecha de la cuenta de Azure Automation seleccionada, en "Estadísticas del trabajo" puede ver una lista de los resúmenes de todos los trabajos de runbook. Al abrir la página Trabajos en el lado izquierdo de la ventana, se muestran los estados de trabajo actuales, las horas de inicio y las horas de finalización.

A screenshot of the job status page.

Visualización de registros y salida de la herramienta de escalado

Para ver los registros de las operaciones de escalabilidad y reducción horizontales, abra el runbook y seleccione el trabajo.

Vaya al runbook en el grupo de recursos que hospeda la cuenta de Azure Automation y seleccione Información general. En la página Información general, seleccione un trabajo en Trabajos recientes para ver la salida de la herramienta de escalado, tal como se muestra en la siguiente imagen.

An image of the output window for the scaling tool.

Comprobación del número de versión del script de runbook

Para comprobar qué versión del script de runbook está usando, abra el archivo de runbook en la cuenta de Azure Automation y seleccione Ver. Aparecerá un script para el runbook en el lado derecho de la pantalla. En el script, aparece el número de versión con el formato v#.#.# bajo la sección SYNOPSIS. Podrá encontrar el número de versión más reciente aquí. Si no ve un número de versión en el script del runbook, significará que está ejecutando una versión anterior del script y debe actualizarlo de inmediato. Si necesita actualizar el script de runbook, siga las instrucciones de la sección Creación o actualización de una cuenta de Azure Automation.

Información sobre los problemas

Al notificar un problema, deberá proporcionar la siguiente información para ayudarnos a solucionarlo:

  • Un registro completo de la pestaña Todos los registros del trabajo que causó el problema. Para obtener información sobre cómo obtener el registro, siga las instrucciones de la sección Visualización de registros y salida de la herramienta de escalado. Si hay información confidencial o privada en el registro, puede quitarla antes de informarnos sobre el problema.

  • La versión del script de runbook que está usando. Para saber cómo obtener el número de versión, consulte la sección Comprobación del número de versión del script de runbook.

  • El número de versión de cada uno de los siguientes módulos de PowerShell que están instalados en su cuenta de Azure Automation. Para buscar estos módulos, abra la cuenta de Azure Automation, seleccione Módulos en la sección Recursos compartidos en el panel del lado izquierdo de la ventana y, a continuación, busque el nombre del módulo.

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

Log Analytics

Si decidió usar Log Analytics, puede ver todos los datos de registros en un registro personalizado denominado WVDTenantScale_CL debajo de Registros personalizados en la vista Registros de su área de trabajo de Log Analytics. Hemos enumerado algunas consultas de ejemplo que pueden resultarle útiles.

  • Para ver todos los registros de un grupo hosts, escriba la siguiente consulta:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Para ver el número total de máquinas virtuales de host de sesión que se están ejecutando actualmente y las sesiones de usuario activas en el grupo de hosts, escriba la siguiente 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 ver el estado de todas las máquinas virtuales de host de sesión en un grupo de hosts, escriba la siguiente 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 ver los errores y advertencias, escriba la siguiente 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
    

Limitaciones

A continuación se indican algunas limitaciones en relación con el escalado de máquinas virtuales del host de sesión con este script de escalado:

  • El script de escalado no tiene en cuenta los cambios de hora entre el horario estándar y el horario de verano.