透過 PowerShell 設定自動調整

自動調整設定可協助您確保執行中的資源數量正確,能夠處理變動的應用程式負載。 您可以使用 Azure 入口網站、Azure CLI、PowerShell、ARM 或 Bicep 範本來設定自動調整。

本文說明如何使用下列步驟,透過 PowerShell 為虛擬機擴展集設定自動調整:

  • 建立可以自動調整的擴展集
  • 建立縮減和擴增的規則
  • 建立使用規則的設定檔
  • 套用自動調整設定
  • 使用通知更新自動調整設定

必要條件

若要使用 PowerShell 設定自動調整,您需要具有有效訂用帳戶的 Azure 帳戶。 您可以免費建立帳戶

設定您的環境

#Set the subscription Id, VMSS name, and resource group name
$subscriptionId = (Get-AzContext).Subscription.Id
$resourceGroupName="rg-powershell-autoscale"
$vmssName="vmss-001"

建立虛擬機器擴展集

使用下列 Cmdlet建立擴展集。 設定 $resourceGroupName$vmssName 變數,以適合您的環境。

# create a new resource group
New-AzResourceGroup -ResourceGroupName $resourceGroupName -Location "EastUS"

# Create login credentials for the VMSS
$Cred = Get-Credential
$vmCred = New-Object System.Management.Automation.PSCredential($Cred.UserName, $Cred.Password)


New-AzVmss `
 -ResourceGroupName $resourceGroupName `
 -Location "EastUS" `
 -VMScaleSetName $vmssName `
 -Credential $vmCred `
 -VirtualNetworkName "myVnet" `
 -SubnetName "mySubnet" `
 -PublicIpAddressName "myPublicIPAddress" `
 -LoadBalancerName "myLoadBalancer" `
 -OrchestrationMode "Flexible"

建立自動調整設定

若要使用 PowerShell 建立自動調整設定,請遵循下列順序:

  1. 使用 New-AzAutoscaleScaleRuleObject 建立規則
  2. 使用 New-AzAutoscaleProfileObject 建立設定檔
  3. 使用 New-AzAutoscaleSetting 建立自動調整設定
  4. 使用 Update-AzAutoscaleSetting 更新設定

建立規則

建立縮減和擴增的規則,然後將其與設定檔相關聯。 規則是使用 New-AzAutoscaleScaleRuleObject 建立的。

下列 PowerShell 指令碼建立兩個規則。

  • 當 CPU 百分比超過 70% 時則擴增
  • 當 CPU 百分比小於 30% 時則縮減

$rule1=New-AzAutoscaleScaleRuleObject `
    -MetricTriggerMetricName "Percentage CPU" `
    -MetricTriggerMetricResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  `
    -MetricTriggerTimeGrain ([System.TimeSpan]::New(0,1,0)) `
    -MetricTriggerStatistic "Average" `
    -MetricTriggerTimeWindow ([System.TimeSpan]::New(0,5,0)) `
    -MetricTriggerTimeAggregation "Average" `
    -MetricTriggerOperator "GreaterThan" `
    -MetricTriggerThreshold 70 `
    -MetricTriggerDividePerInstance $false `
    -ScaleActionDirection "Increase" `
    -ScaleActionType "ChangeCount" `
    -ScaleActionValue 1 `
    -ScaleActionCooldown ([System.TimeSpan]::New(0,5,0))


$rule2=New-AzAutoscaleScaleRuleObject `
    -MetricTriggerMetricName "Percentage CPU" `
    -MetricTriggerMetricResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  `
    -MetricTriggerTimeGrain ([System.TimeSpan]::New(0,1,0)) `
    -MetricTriggerStatistic "Average" `
    -MetricTriggerTimeWindow ([System.TimeSpan]::New(0,5,0)) `
    -MetricTriggerTimeAggregation "Average" `
    -MetricTriggerOperator "LessThan" `
    -MetricTriggerThreshold 30 `
    -MetricTriggerDividePerInstance $false `
    -ScaleActionDirection "Decrease" `
    -ScaleActionType "ChangeCount" `
    -ScaleActionValue 1 `
    -ScaleActionCooldown ([System.TimeSpan]::New(0,5,0))

下表說明了 New-AzAutoscaleScaleRuleObject Cmdlet 中使用的參數。

參數 描述
MetricTriggerMetricName 設定自動調整觸發程序計量
MetricTriggerMetricResourceUri 指定 MetricTriggerMetricName 計量所屬的資源。 MetricTriggerMetricResourceUri 可以是任何資源,而不僅僅是正在調整的資源。 例如,您可以根據負載平衡器、資料庫或擴展集本身所建立的計量來調整虛擬機器擴展集。 對於指定的 MetricTriggerMetricResourceUriMetricTriggerMetricName 必須存在。
MetricTriggerTimeGrain 規則監視的計量的取樣頻率。 MetricTriggerTimeGrain 必須是指定計量的其中一個預先定義值,且必須介於 12 小時到 1 分鐘之間。 例如,MetricTriggerTimeGrain = PT1M"* 表示計量每 1 分鐘採樣一次,並使用 MetricTriggerStatistic 中指定的彙總方法進行彙總。
MetricTriggerTimeAggregation timeGrain 期間內的彙總方法。 例如,statistic = "Average" 和 timeGrain = "PT1M" 表示每隔 1 分鐘計算平均值來彙總計量。
MetricTriggerStatistic 用來彙總所取樣計量的彙總方法。 例如,TimeAggregation = "Average" 會計算平均值來彙總取樣的計量。
MetricTriggerTimeWindow 自動調整引擎回溯以匯總計量的時間長度。 此值必須大於指標集合中的延遲 (該延遲可能會因資源而有所不同)。 其值必須介於 5 分鐘到 12 小時之間。 例如,10 分鐘表示每次執行自動調整時,都會查詢過去 10 分鐘的計量。 使用此功能可讓您的計量穩定化,而避免對暫時性峰值做出反應。
MetricTriggerThreshold 定義觸發調整事件的計量值。
MetricTriggerOperator 指定評估計量值時要使用的邏輯比較作業。
MetricTriggerDividePerInstance 如果設定為 true,則會將觸發程式計量除以執行個體總數。 例如,如果訊息計數為 300,而且有 5 個執行個體正在執行,則計算的計量值是每個執行個體 60 條訊息。 此屬性並非適用於所有計量。
ScaleActionDirection 指定縮減或擴增。有效值為 IncreaseDecrease
ScaleActionType 依特定的執行個體數目調整、調整為特定執行個體計數,或依目前執行個體計數的百分比進行調整。 有效值包括 ChangeCountExactCountPercentChangeCount
ScaleActionCooldown 調整作業之間等候的最短時間。 此等候時間讓計量能夠穩定並避免擺盪。 例如,如果 ScaleActionCooldown 為 10 分鐘且剛剛發生調整作業,則自動調整在 10 分鐘內不會再次嘗試調整。

建立預設的自動調整設定檔並與規則相關聯

定義調整規則之後,請建立一個設定檔。 該設定檔會指定預設的執行個體計數的上限和下限,以及可以套用相關聯規則的時間。 使用 New-AzAutoscaleProfileObject Cmdlet 來建立新的自動調整設定檔。 由於這是預設設定檔,因此沒有任何排程參數。 在沒有任何其他設定檔處於作用中時,預設設定檔會處於作用中狀態

$defaultProfile=New-AzAutoscaleProfileObject `
    -Name "default" `
    -CapacityDefault 1 `
    -CapacityMaximum 10 `
    -CapacityMinimum 1 `
    -Rule $rule1, $rule2

下表說明了 New-AzAutoscaleProfileObject Cmdlet 中使用的參數。

參數 描述
CapacityDefault 計量無法用於評估的執行個體數。 只有當目前的執行個體計數低於預設值時,才會使用預設值。
CapacityMaximum 資源的最大執行個體數。 最大執行個體數進一步受到訂用帳戶中可用的核心數限制。
CapacityMinimum 資源的最小執行個體數。
FixedDateEnd 設定檔的結束時間,採用 ISO 8601 格式。
FixedDateStart 設定檔的開始時間,採用 ISO 8601 格式。
Rule 當設定檔處於作用中狀態時,為調整動作提供觸發程序和參數的規則集合。 最多可指定 10 個以逗號分隔的規則。
RecurrenceFrequency 排程設定檔生效的頻率。 此值必須為 week
ScheduleDay 指定週期性排程時,設定檔生效的天數集合。 可能的值為 Sunday 到 Saturday。 如需週期性排程的詳細資訊,請參閱使用 CLI 新增週期性設定檔
ScheduleHour 設定檔生效的小時集合。 支援的值為 0 到 23。
ScheduleMinute 設定檔生效的分鐘集合。
ScheduleTimeZone 設定檔的小時時區。

套用自動調整設定

在調整規則和設定檔之後,使用 New-AzAutoscaleSetting 套用自動調整設定。 若要更新現有的自動調整設定,請使用 Update-AzAutoscaleSetting

New-AzAutoscaleSetting `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Location eastus `
    -Profile $defaultProfile `
    -Enabled `
    -PropertiesName "vmss-autoscalesetting1" `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"

在自動調整設定上新增通知

在銷售設定上新增通知,以在發生調整事件時觸發 Webhook 或傳送電子郵件通知。 如需 Webhook 通知的詳細資訊,請參閱 New-AzAutoscaleWebhookNotificationObject

使用下列 Cmdlet 設定 Webhook:


  $webhook1=New-AzAutoscaleWebhookNotificationObject -Property @{} -ServiceUri "http://contoso.com/webhook1"

使用 webhook 設定通知,並使用 New-AzAutoscaleNotificationObject Cmdlet 設定電子郵件通知:


    $notification1=New-AzAutoscaleNotificationObject `
    -EmailCustomEmail "jason@contoso.com" `
    -EmailSendToSubscriptionAdministrator $true `
    -EmailSendToSubscriptionCoAdministrator $true `
    -Webhook $webhook1

更新自動調整設定以套用通知


Update-AzAutoscaleSetting  `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultProfile `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

檢閱自動調整設定

若要檢閱自動調整設定,請使用 Get-AzAutoscaleSetting 將設定載入變數,然後輸出如下所示的變數:

    $autoscaleSetting=Get-AzAutoscaleSetting  -ResourceGroupName $resourceGroupName -Name vmss-autoscalesetting1 
    $autoscaleSetting | Select-Object -Property *

使用 AzAutoscaleHistory 取得自動調整歷程記錄

Get-AzAutoscaleHistory -ResourceId  /subscriptions/<subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName

排程的設定檔和週期性設定檔

為特殊事件新增排程設定檔

設定自動調整設定檔,以便針對特定事件以不同的方式進行調整。 例如,對於需求比平常更高的某個日期,建立一個具有增加最大和最小執行個體限制的設定檔。

下列範例會使用與上述定義的預設設定檔相同的規則,但針對特定日期設定新的執行個體限制。 您也可以設定要與新設定檔搭配使用的不同規則。

$highDemandDay=New-AzAutoscaleProfileObject `
    -Name "High-demand-day" `
    -CapacityDefault 7 `
    -CapacityMaximum 30 `
    -CapacityMinimum 5 `
    -FixedDateEnd ([System.DateTime]::Parse("2023-12-31T14:00:00Z")) `
    -FixedDateStart ([System.DateTime]::Parse("2023-12-31T13:00:00Z")) `
    -FixedDateTimeZone "UTC" `
    -Rule $rule1, $rule2

Update-AzAutoscaleSetting  `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultProfile, $highDemandDay `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

新增週期性排程設定檔

週期性設定檔可讓您排程每週重複的調整設定檔。 例如,在週末 (星期五晚上到星期一早上) 調整為單一執行個體。

排程的設定檔有開始和結束日期,但週期性設定檔沒有結束時間。 設定檔會保持作用中,直到下一個設定檔的開始時間為止。 因此,在建立週期性設定檔時,必須建立週期性預設設定檔,該預設設定檔在前一個週期性設定檔完成時啟動。

例如,若要設定一個在星期五晚上啟動、在星期一早上結束的週末設定檔,請建立一個在星期五晚上啟動的設定檔,然後使用預設設定建立一個在星期一早上啟動的週期性設定檔。

下列指令碼會建立週末設定檔,並新增一個預設設定檔以結束週末設定檔。

$fridayProfile=New-AzAutoscaleProfileObject `
    -Name "Weekend" `
    -CapacityDefault 1 `
    -CapacityMaximum 1 `
    -CapacityMinimum 1 `
    -RecurrenceFrequency week  `
    -ScheduleDay "Friday" `
    -ScheduleHour 22  `
    -ScheduleMinute 00  `
    -ScheduleTimeZone  "Pacific Standard Time" `
    -Rule $rule1, $rule2


$defaultRecurringProfile=New-AzAutoscaleProfileObject `
    -Name "default recurring profile" `
    -CapacityDefault 2 `
    -CapacityMaximum 10 `
    -CapacityMinimum 2 `
    -RecurrenceFrequency week  `
    -ScheduleDay "Monday" `
    -ScheduleHour 00  `
    -ScheduleMinute 00  `
    -ScheduleTimeZone  "Pacific Standard Time" `
    -Rule $rule1, $rule2

New-AzAutoscaleSetting  `
    -Location eastus `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultRecurringProfile, $fridayProfile `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

如需排程設定檔的詳細資訊,請參閱使用多個設定檔進行自動調整

其他自動調整命令

如需自動調整的 PowerShell Cmdlet 完整清單,請參閱 PowerShell 模組瀏覽器

清除資源

若要清除在本教學課程中建立的資源,請刪除建立的資源群組。 以下 Cmdlet 會刪除資源群組及其所有資源。


Remove-AzResourceGroup -Name $resourceGroupName