PowerShell を使用して自動スケーリングを構成する

自動スケール設定を使用すると、アプリケーションの変動する負荷に対応するために適切な量のリソースを確実に実行できます。 自動スケーリングは、Azure portal、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"

仮想マシン スケール セットの作成

次のコマンドレットを使用してスケール セットを作成します。 環境に合わせて $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 スクリプトでは、2 つのルールを作成します。

  • 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 コマンドレットで使用されるパラメーターについて説明します。

パラメーター 説明
MetricTriggerMetricName 自動スケーリング トリガー メトリックを設定します
MetricTriggerMetricResourceUri MetricTriggerMetricName メトリックが属するリソースを指定します。 MetricTriggerMetricResourceUri は、スケーリングされるリソースだけでなく、任意のリソースにすることができます。 たとえば、ロード バランサー、データベース、またはスケール セット自体によって作成されたメトリックに基づいて、Virtual Machine Scale Sets をスケーリングできます。 MetricTriggerMetricName は、指定した MetricTriggerMetricResourceUri に存在する必要があります。
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 特定のインスタンス数でスケーリングするか、特定のインスタンス数にスケーリングするか、現在のインスタンス数の割合でスケーリングします。 有効な値には ChangeCountExactCount、および PercentChangeCount があります。
ScaleActionCooldown スケーリング操作の間に待機する最小時間。 これは、メトリックを安定させ、フラッピングを回避するためのものです。 たとえば、ScaleActionCooldown が 10 分でスケーリング操作が発生したばかりの場合、自動スケーリングの実行後 10 分間、スケーリングは再試行されません。

既定の自動スケーリング プロファイルを作成してルールを関連付ける

スケール ルールを定義したら、プロファイルを作成します。 このプロファイルでは、既定、上限、および下限のインスタンス数の制限と、関連付けられているルールを適用できる時間を指定します。 New-AzAutoscaleProfileObject コマンドレットを使用して、新しい自動スケーリング プロファイルを作成します。 これは既定のプロファイルであるため、スケジュール パラメーターはありません。 既定のプロファイルは、他のプロファイルがアクティブでない場合にアクティブになります

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

次の表では、New-AzAutoscaleProfileObject コマンドレットで使用されるパラメーターについて説明します。

パラメーター 説明
CapacityDefault メトリックが評価に利用できない場合のインスタンス数。 既定値は、現在のインスタンスの数が既定値より少ない場合にのみ使用されます。
CapacityMaximum リソースのインスタンスの最大数。 インスタンスの最大数は、サブスクリプションで使用できるコア数でさらに制限されます。
CapacityMinimum リソースのインスタンスの最小数。
FixedDateEnd ISO 8601 形式のプロファイルの終了時刻。
FixedDateStart ISO 8601 形式のプロファイルの開始時刻。
Rule このプロファイルがアクティブな場合のスケーリング処理のトリガーとパラメーターを提供するルールのコレクション。 最大 10 個のコンマ区切りのルールを指定できます。
RecurrenceFrequency スケジュールされたプロファイルが有効になる頻度。 この値は week にする必要があります。
ScheduleDay 定期的なスケジュールを指定する際にプロファイルが有効になる日数のコレクション。 日曜日から土曜日までの値を指定できます。 定期的なスケジュールの詳細については、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 を参照してください。

次のコマンドレットを使用して Webhook を設定します。


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

Webhook を使用して通知を構成し、New-AzAutoscaleNotificationObject コマンドレットを使用して電子メール通知を設定します。


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

定期的なスケジュール プロファイルを追加する

定期的なプロファイルでは、毎週繰り返されるスケーリング プロファイルをスケジュールできます。 たとえば、週末の金曜日の夜から月曜日の朝にかけて、1 つのインスタンスにスケーリングします。

スケジュールされたプロファイルには開始日と終了日が設定されていますが、定期的なプロファイルには終了時刻がありません。 プロファイルは、次のプロファイルの開始時刻までアクティブなままになります。 したがって、定期的なプロファイルを作成する場合は、前の定期的なプロファイルが完了すると開始する定期的な既定のプロファイルを作成する必要があります。

たとえば、金曜日の夜に始まり、月曜日の朝に終了する週末プロファイルを構成するには、金曜日の夜に始まるプロファイルを作成し、月曜日の朝に始まる既定の設定で定期的なプロファイルを作成します。

次のスクリプトでは、週末プロファイルと、週末プロファイルを終了させるための追加の既定のプロファイルを作成します。

$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 コマンドレットの完全な一覧については、「PowerShell モジュール ブラウザー」を参照してください。

リソースをクリーンアップする

このチュートリアルで作成したリソースをクリーンアップするには、作成したリソース グループを削除します。 次のコマンドレットは、リソース グループとそのすべてのリソースを削除します。


Remove-AzResourceGroup -Name $resourceGroupName