Configurar o dimensionamento automático com Azure PowerShell

O dimensionamento automático ajuda a garantir que você tenha a quantidade certa de recursos em execução para lidar com a carga flutuante do seu aplicativo. Você pode configurar o dimensionamento automático usando o portal Azure, CLI do Azure, Azure PowerShell ou modelos arm ou Bicep.

Este artigo mostra como configurar o dimensionamento automático para um Conjunto de Dimensionamento de Máquinas Virtuais com o PowerShell. As configurações usam as seguintes etapas:

  • Crie um conjunto de dimensionamento de máquinas virtuais que você possa dimensionar automaticamente.
  • Crie regras para reduzir e aumentar a escala.
  • Crie um perfil que use suas regras.
  • Aplique as configurações de dimensionamento automático.
  • Atualize as configurações de dimensionamento automático com notificações.

Pré-requisitos

Para configurar o dimensionamento automático usando o PowerShell, você precisa de uma conta do Azure com uma assinatura ativa. Você pode criar uma conta gratuitamente.

Configurar seu ambiente

Note

Execute os exemplos na mesma sessão do PowerShell com a assinatura desejada selecionada.

# Set variables
$resourceGroupName = "<ResourceGroupName>"
$vmssName = "<VirtualMachineScaleSetName>"
$autoscaleName = "<AutoscaleSettingName>"
$azureRegion = "<AzureRegion>"
$virtualNetworkName = "<VirtualNetworkName>"
$subnetName = "<SubnetName>"
$publicIpAddressName = "<PublicIpAddressName>"
$loadBalancerName = "<LoadBalancerName>"

# Get the subscription ID from the current Azure PowerShell context
$subscriptionId = (Get-AzContext).Subscription.Id

# Build virtual machine scale set resource ID
$vmssPath = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName"
$vmssProvider = "Microsoft.Compute/virtualMachineScaleSets/$vmssName"
$vmssResourceId = "$vmssPath/providers/$vmssProvider"

Crie um conjunto de dimensionamento de máquinas virtuais

O exemplo de Azure PowerShell a seguir usa os cmdlets New-AzVmss e New-AzResourceGroup.

Note

Use um grupo de recursos dedicado para este exemplo para que você possa excluir seus recursos quando terminar.

O exemplo cria um endereço IP público. Para acesso ao gerenciamento, use Azure Bastion em vez de expor portas RDP ou SSH à Internet.

# Create the resource group
New-AzResourceGroup -ResourceGroupName $resourceGroupName -Location $azureRegion

# Get credentials for the virtual machine scale set
$vmCredential = Get-Credential

# Define parameters for New-AzVmss
$newAzVmssParams = @{
    ResourceGroupName   = $resourceGroupName
    Location            = $azureRegion
    VMScaleSetName      = $vmssName
    Credential          = $vmCredential
    VirtualNetworkName  = $virtualNetworkName
    SubnetName          = $subnetName
    PublicIpAddressName = $publicIpAddressName
    LoadBalancerName   = $loadBalancerName
    OrchestrationMode  = "Flexible"
}

# Create the virtual machine scale set
New-AzVmss @newAzVmssParams

Crie configurações de dimensionamento automático

Para criar a configuração de dimensionamento automático usando o PowerShell, siga a sequência abaixo:

  1. Criar regras usando New-AzAutoscaleScaleRuleObject.
  2. Criar um perfil usando New-AzAutoscaleProfileObject.
  3. Crie as configurações de dimensionamento automático usando New-AzAutoscaleSetting.
  4. Atualize as configurações usando Update-AzAutoscaleSetting.

Criar regras

Crie regras de redução de escala e expansão de escala e associe-as a um perfil.

O exemplo de Azure PowerShell a seguir usa o New-AzAutoscaleScaleRuleObject cmdlet.

Note

Ele cria duas regras:

  • Expandir horizontalmente quando a CPU percentual exceder 70%.
  • Reduza a escala quando a CPU percentual for menor que 30%.
# Define parameters for New-AzAutoscaleScaleRuleObject
$newAzAutoscaleScaleRuleObjectParams = @{
    MetricTriggerMetricName        = "Percentage CPU"
    MetricTriggerMetricResourceUri  = $vmssResourceId
    MetricTriggerTimeGrain          = New-TimeSpan -Minutes 1
    MetricTriggerStatistic         = "Average"
    MetricTriggerTimeWindow         = New-TimeSpan -Minutes 5
    MetricTriggerTimeAggregation    = "Average"
    MetricTriggerOperator          = "GreaterThan"
    MetricTriggerThreshold         = 70
    MetricTriggerDividePerInstance = $false
    ScaleActionDirection           = "Increase"
    ScaleActionType                = "ChangeCount"
    ScaleActionValue               = "1"
    ScaleActionCooldown            = New-TimeSpan -Minutes 5
}
$scaleOutRule = New-AzAutoscaleScaleRuleObject @newAzAutoscaleScaleRuleObjectParams

# Define parameters for New-AzAutoscaleScaleRuleObject
$newAzAutoscaleScaleRuleObjectParams = @{
    MetricTriggerMetricName        = "Percentage CPU"
    MetricTriggerMetricResourceUri  = $vmssResourceId
    MetricTriggerTimeGrain          = New-TimeSpan -Minutes 1
    MetricTriggerStatistic         = "Average"
    MetricTriggerTimeWindow         = New-TimeSpan -Minutes 5
    MetricTriggerTimeAggregation    = "Average"
    MetricTriggerOperator          = "LessThan"
    MetricTriggerThreshold         = 30
    MetricTriggerDividePerInstance = $false
    ScaleActionDirection           = "Decrease"
    ScaleActionType                = "ChangeCount"
    ScaleActionValue               = "1"
    ScaleActionCooldown            = New-TimeSpan -Minutes 5
}
$scaleInRule = New-AzAutoscaleScaleRuleObject @newAzAutoscaleScaleRuleObjectParams

A tabela a seguir descreve os parâmetros usados no cmdlet New-AzAutoscaleScaleRuleObject.

Parâmetro Descrição
MetricTriggerMetricName Define a métrica de gatilho de dimensionamento automático
MetricTriggerMetricResourceUri Especifica o recurso ao qual a métrica MetricTriggerMetricName pertence. MetricTriggerMetricResourceUri pode ser qualquer recurso e não apenas o recurso que está sendo dimensionado. Por exemplo, você pode dimensionar seu Conjunto de Dimensionamento de Máquinas Virtuais com base nas métricas criadas por um balanceador de carga, um banco de dados ou o próprio conjunto de dimensionamento. O MetricTriggerMetricName deve existir para o MetricTriggerMetricResourceUri especificado.
MetricTriggerTimeGrain A frequência de amostragem da métrica que a regra monitora. MetricTriggerTimeGrain deve ser um dos valores predefinidos para a métrica especificada e deve estar entre 12 horas e 1 minuto. Por exemplo, MetricTriggerTimeGrain = PT1M"* significa que as métricas são amostradas a cada 1 minuto e agregadas usando o método de agregação especificado em MetricTriggerStatistic.
MetricTriggerTimeAggregation O método de agregação dentro do período de timeGrain. Por exemplo, statistic = “Average” e timeGrain = “PT1M” significa que as métricas são agregadas a cada 1 minuto, considerando a média.
MetricTriggerStatistic O método de agregação usado para agregar as métricas amostradas. Por exemplo, TimeAggregation = “Average” agrega as métricas amostradas obtendo a média.
MetricTriggerTimeWindow A quantidade de tempo que o mecanismo de dimensionamento automático procura para agregar a métrica. Esse valor deve ser maior que o atraso na coleção de métricas, que varia de recurso para recurso. Deve estar entre 5 minutos e 12 horas. Por exemplo, dez minutos de tempo significa que, sempre que o dimensionamento automático é executado, ele consulta as métricas dos últimos dez minutos. Esse recurso permite que as métricas sejam estabilizadas e evita uma reação a picos transitórios.
MetricTriggerThreshold Define o valor da métrica que dispara um evento de escala.
MetricTriggerOperator Especifica a operação comparativa lógica a ser usada ao avaliar o valor da métrica.
MetricTriggerDividePerInstance Quando definido como true divide a métrica de gatilho pelo número total de instâncias. Por exemplo, se a contagem de mensagens for 300 e houver 5 instâncias em execução, o valor da métrica calculada será 60 mensagens por instância. Essa propriedade não é aplicável a todas as métricas.
ScaleActionDirection Especifique se vai aumentar ou reduzir o dimensionamento. Os valores válidos são Increase e Decrease.
ScaleActionType Dimensione por um número específico de instâncias, dimensione para uma contagem de instâncias específica ou dimensione por percentual da contagem de instâncias atual. Os valores válidos incluem ChangeCount, ExactCount e PercentChangeCount.
ScaleActionCooldown O período mínimo que deve transcorrer após uma operação de escala para que essa regra se qualifique para iniciar outra ação de escala. Autoscale verifica o período de espera de cada regra de forma independente. O período de espera permite que as métricas se estabilizem e evita a oscilação.

Criar um perfil de dimensionamento automático padrão e associar as regras

Depois de definir as regras de escala, crie um perfil. O perfil especifica os limites de contagem de instâncias padrão, superior e inferior e os horários em que as regras associadas podem ser aplicadas.

O exemplo de Azure PowerShell a seguir usa o New-AzAutoscaleProfileObject cmdlet.

Note

Como esse perfil é um perfil padrão, ele não tem parâmetros de agendamento. O perfil padrão fica ativo nos momentos em que nenhum outro perfil está ativo.

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name            = "default"
    CapacityDefault = "1"
    CapacityMaximum = "10"
    CapacityMinimum = "1"
    Rule            = @($scaleOutRule, $scaleInRule)
}
$defaultProfile = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

A tabela a seguir descreve os parâmetros usados no cmdlet New-AzAutoscaleProfileObject.

Parâmetro Descrição
CapacityDefault O número de instâncias se as métricas não estiverem disponíveis para avaliação. O padrão é usado apenas se a contagem atual da instância for inferior ao padrão.
CapacityMaximum O número máximo de instâncias para o recurso. O número máximo de instâncias é limitado pelos núcleos que estão disponíveis na assinatura.
CapacityMinimum O número mínimo de instâncias para o recurso.
FixedDateEnd A hora de término do perfil no formato ISO 8601 para.
FixedDateStart A hora de início do perfil no formato ISO 8601.
Rule Uma coleção de regras que fornecem os gatilhos e parâmetros para a ação de dimensionamento quando esse perfil está ativo. No máximo 10 regras, separadas por vírgula, podem ser especificadas.
RecurrenceFrequency Com que frequência o perfil agendado entra em vigor. Esse valor precisa ser week.
ScheduleDay Uma coleção de dias em que o perfil entra em vigor ao especificar um agendamento recorrente. Os valores possíveis são Domingo a Sábado. Para obter mais informações sobre agendas recorrentes, consulte Perfis recorrentes usando o PowerShell.
ScheduleHour Uma coleção de horários nos quais o perfil entra em vigor. Os valores com suporte são de 0 a 23.
ScheduleMinute Uma coleção de minutos na qual o perfil entra em vigor.
ScheduleTimeZone O fuso horário das horas do perfil.

Aplique as configurações de dimensionamento automático

Depois de definir as regras e o perfil, aplique as configurações de dimensionamento automático. Para atualizar uma configuração de dimensionamento automático existente, use Update-AzAutoscaleSetting.

O exemplo de Azure PowerShell a seguir usa o New-AzAutoscaleSetting cmdlet.

# Define parameters for New-AzAutoscaleSetting
$newAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Location          = $azureRegion
    Profile           = @($defaultProfile)
    Enabled           = $true
    PropertiesName    = $autoscaleName
    TargetResourceUri = $vmssResourceId
}

# Create the autoscale setting
New-AzAutoscaleSetting @newAzAutoscaleSettingParams

Adicionar notificações às configurações de dimensionamento automático

Adicione notificações à configuração de dimensionamento automático para disparar um webhook ou enviar notificações por email quando ocorrer um evento de escala.

O exemplo de Azure PowerShell a seguir usa o New-AzAutoscaleWebhookNotificationObject cmdlet.

# Set variables
$webhookUri = "<WebhookUri>"

# Create the webhook notification
$webhook = New-AzAutoscaleWebhookNotificationObject -Property @{} -ServiceUri $webhookUri

O exemplo de Azure PowerShell a seguir usa o New-AzAutoscaleNotificationObject cmdlet para configurar notificações de webhook e email.

Note

Use um endpoint HTTPS para o webhook.

# Set variables
$notificationEmail = "<NotificationEmail>"

# Define parameters for New-AzAutoscaleNotificationObject
$newAzAutoscaleNotificationObjectParams = @{
    EmailCustomEmail                      = @($notificationEmail)
    EmailSendToSubscriptionAdministrator   = $true
    EmailSendToSubscriptionCoAdministrator = $true
    Webhook                               = @($webhook)
}
$notification = New-AzAutoscaleNotificationObject @newAzAutoscaleNotificationObjectParams

O exemplo de Azure PowerShell a seguir usa o Update-AzAutoscaleSetting cmdlet para aplicar a notificação.

# Define parameters for Update-AzAutoscaleSetting
$updateAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Notification      = @($notification)
}

# Update the autoscale notification
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Examine suas configurações de dimensionamento automático

O exemplo de Azure PowerShell a seguir usa o Get-AzAutoscaleSetting cmdlet para recuperar a configuração de dimensionamento automático.

# Define parameters for Get-AzAutoscaleSetting
$getAzAutoscaleSettingParams = @{
    ResourceGroupName = $resourceGroupName
    Name              = $autoscaleName
}
$autoscaleSetting = Get-AzAutoscaleSetting @getAzAutoscaleSettingParams
$autoscaleSetting | Select-Object -Property *

O exemplo de Azure PowerShell a seguir usa o Get-AzAutoscaleHistory cmdlet.

Note

Ele consulta o histórico da configuração de dimensionamento automático, não a ID de recurso do conjunto de dimensionamento.

# Build autoscale setting resource ID
$autoscalePath = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName"
$autoscaleProvider = "Microsoft.Insights/autoscaleSettings/$autoscaleName"
$autoscaleResourceId = "$autoscalePath/providers/$autoscaleProvider"

# Retrieve the autoscale history
Get-AzAutoscaleHistory -ResourceId $autoscaleResourceId

Perfis agendados e recorrentes

Note

Ao atualizar Profile, inclua todos os perfis que você deseja manter. Os exemplos a seguir adicionam perfis à configuração criada anteriormente neste artigo. Mantenha outros perfis ao adaptá-los a outra configuração de dimensionamento automático.

Adicione um perfil agendado para um evento especial

Configure perfis de dimensionamento automático para dimensionar de forma diferente para eventos específicos. Por exemplo, para um dia em que a demanda será maior do que o normal, crie um perfil com limites máximos e mínimos de instância aumentados.

O exemplo de Azure PowerShell a seguir usa os cmdlets Update-AzAutoscaleSetting e New-AzAutoscaleProfileObject.

Note

O exemplo a seguir usa as mesmas regras que o perfil padrão definido anteriormente, mas define novos limites de instância para uma data específica. Você também pode configurar regras diferentes para usar com o novo perfil. Os valores inicial e final usam carimbos de data/hora ISO 8601 em UTC.

# Set variables
$startTime = "<StartTime>"
$endTime = "<EndTime>"

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name              = "High-demand-day"
    CapacityDefault   = "7"
    CapacityMaximum   = "30"
    CapacityMinimum   = "5"
    FixedDateEnd      = [datetime]::Parse($endTime)
    FixedDateStart    = [datetime]::Parse($startTime)
    FixedDateTimeZone = "UTC"
    Rule              = @($scaleOutRule, $scaleInRule)
}
$highDemandDay = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

# Define parameters for Update-AzAutoscaleSetting
$updateAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Profile           = @($defaultProfile, $highDemandDay)
}

# Update the autoscale profiles
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Adicionar um perfil de agendamento recorrente

Perfis recorrentes permitem agendar um perfil de dimensionamento que se repete a cada semana.

Embora os perfis agendados tenham uma data de início e de término, os perfis recorrentes não têm uma hora de término. Um perfil permanece ativo até a hora de início do próximo perfil. Portanto, ao criar um perfil recorrente, você deve criar um perfil padrão recorrente que começa quando você deseja que o perfil recorrente anterior seja concluído.

O exemplo de Azure PowerShell a seguir usa os cmdlets Update-AzAutoscaleSetting e New-AzAutoscaleProfileObject.

Note

Por exemplo, escalone para apenas uma instância no fim de semana, de sexta-feira à noite até segunda-feira de manhã. Para configurar um perfil de fim de semana que começa nas noites de sexta-feira e termina nas manhãs de segunda-feira, crie um perfil que comece na sexta à noite e crie um perfil recorrente com suas configurações padrão que começa na segunda-feira de manhã.

Ele cria um perfil de fim de semana e um perfil padrão recorrente para encerrar o perfil de fim de semana, mantendo os perfis padrão e de data fixa das etapas anteriores.

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name                = "Weekend"
    CapacityDefault     = "1"
    CapacityMaximum     = "1"
    CapacityMinimum     = "1"
    RecurrenceFrequency = "Week"
    ScheduleDay         = @("Friday")
    ScheduleHour        = @(22)
    ScheduleMinute      = @(0)
    ScheduleTimeZone    = "Pacific Standard Time"
    Rule                = @($scaleOutRule, $scaleInRule)
}
$fridayProfile = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name                = "default recurring profile"
    CapacityDefault     = "2"
    CapacityMaximum     = "10"
    CapacityMinimum     = "2"
    RecurrenceFrequency = "Week"
    ScheduleDay         = @("Monday")
    ScheduleHour        = @(0)
    ScheduleMinute      = @(0)
    ScheduleTimeZone    = "Pacific Standard Time"
    Rule                = @($scaleOutRule, $scaleInRule)
}
$defaultRecurringProfile = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

# Define parameters for Update-AzAutoscaleSetting
$updateAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Profile           = @(
        $defaultProfile
        $highDemandDay
        $defaultRecurringProfile
        $fridayProfile
    )
}

# Update the autoscale profiles
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Para obter mais informações sobre perfis agendados, consulte Dimensionamento automático com vários perfis.

Outros comandos de dimensionamento automático

Para obter uma lista completa de cmdlets do PowerShell para dimensionamento automático, consulte o PowerShell Module Browser.

Limpar os recursos

Para limpar os recursos que você criou neste tutorial, exclua o grupo de recursos dedicado que você criou. O cmdlet a seguir exclui o grupo de recursos e todos os seus recursos.

O exemplo de Azure PowerShell a seguir usa o Remove-AzResourceGroup cmdlet.

# Delete the example resource group
Remove-AzResourceGroup -Name $resourceGroupName