🥘

Azure Firewall Prescaling でピーク対策 と コスト最適化 を Automation Account で

に公開

こちらは Microsoft Azure Tech Advent Calendar 2025 10日目 の記事です。

Azure Firewall Prescaling とは

Azure Firewall は、負荷に応じて自動的にスケールアウト/スケールインをする、マネージド型のネットワークセキュリティサービスです。既定では、内部のインスタンス数は 最小 2 ~ 最大 20 の範囲でスケーリングします。

しかしながら、スケールアウトには 5 分程度かかることがあり、急激なトラフィック増が発生した場合などではスケールアウトが追い付かず、遅延や通信不可といったトラブルが生じる可能性があります。

Azure Firewall Prescaling (事前スケーリング)は、最小と最大のインスタンス数を設定しておくことができる機能です。あらかじめ最小インスタンス数を引き上げておくことで、スケールアウト時の課題を回避することができます。

Azure Firewall Prescaling の設定を有効化する - Azure Portal

Azure Firewall Prescaling の設定は、Azure Portal から簡単に有効化が可能です。

Azure Portal -> Azure Firewall -> [設定] -> [スケーリングオプション] と進みます。
既定では、 Default が選択されているはずです。
Prescaling に ☑ を入れ、最小インスタンス数と最大インスタンス数を設定します。

設定変更後、[メトリック] -> [Observed capacity Units] を表示して、インスタンス数を確認します。例えば以下は、最小インスタンス数を 4 に設定した場合の例です。設定後、インスタンス数が 4 まで引きあがっていることが確認できます。

なお、Azure Portal から Azure Firewall を新規作成する際には、今のところ Prescaling の設定箇所はありません。一度作成してから、上記の手順で設定を行えばよいかと思います。

PowerShell で Azure Firewall Prescaling の設定を変更する

さて、PowerShell であれば、新規作成時より設定ができそうです。
こちらのドキュメントに記載があります。

PowerShell で 新規作成
New-AzFirewall `
  -Name "MyFirewall" `
  -ResourceGroupName "MyResourceGroup" `
  -Location "centralus" `
  -VirtualNetwork (Get-AzVirtualNetwork -Name "MyVNet" -ResourceGroupName "MyResourceGroup") `
  -PublicIpAddress (Get-AzPublicIpAddress -Name "MyFW-PublicIP" -ResourceGroupName "MyResourceGroup") `
  -MinCapacity 4 `
  -MaxCapacity 10

既存の Azure Firewall の Prescaling 設定を変更する場合は、以下で設定変更できました。

PowerShell で 既存FWの設定変更
$ResourceGroupName = "MyResourceGroup"
$FirewallName = "MyFirewall"

$fw = Get-AzFirewall -Name $FirewallName -ResourceGroupName $ResourceGroupName
$fw.AutoscaleConfiguration.MinCapacity = 4
$fw.AutoscaleConfiguration.MaxCapacity = 10
$fw | Set-AzFirewall

Azure Firewall Prescaling の コスト と 価格試算

Azure Firewall Prescaling を利用する場合、通常の料金に追加して、設定した "最小インスタンス数" に応じた料金が発生します。

  • ただし、"最小インスタンス数" から、既定で動作している 2 つは差し引かれます。
  • そのため "最小インスタンス数" を 2 に設定した場合は、追加料金は発生しません。

2025/12 時点での Azure Firewall の価格 を確認すると、仮に "最小インスタンス数" が 10 場合、以下のような計算になります。

  • 仮に "最小インスタンス数" が 10 場合、追加料金は 8 インスタンス分発生
  • Standard SKU: ¥10.931 /時間/インスタンス
  • 720時間(1か月) で 約 ¥7,870/インスタンス
  • ¥7,870 x 8 インスタンス分 = 約 ¥62,960/月

課金は
トラフィックが多い時間帯の直前に "最小インスタンス数" を引き上げ、トラフィックが少なくなってくる時間帯からは "最小インスタンス数" を下げることで、コストを抑止する、といったことも可能です。

ただし、"最小インスタンス数"を下げた場合、当然ながらスケールインが発生する可能性があり、既存の TCP コネクションが切断される可能性があることに注意してください。

Automation Account で設定変更を自動化する

先ほど示した PowerShell スクリプトに少し手を加え、Azure Automation Account の Runbook に登録して、スケジュール実行するように構成してみます。

ちなみに、Automation Account もジョブの実行時間に応じた料金(¥0.313/分)が発生しますが、無料枠(500分)もあり、コストはほとんど発生しないかと思います。

Automation Account の作成

まずは Automation Account を作成します。
Azure Portal -> [Automation アカウント] から、新しい Automation Account を作成します。
リソースグループや名前等は適当に入力して作成します。
詳細設定で、 システム割り当てマネージド ID を有効化しておきます。


マネージド ID への権限付与

Automation Account の [アカウント設定] -> [ ID ] を開きます。
作成時に有効化したはずではありますが、もし有効化されていなければ、システム割り当てマネージド ID を有効化します。

[Azure ロールの割り当て] より、Azure Firewall が存在するリソースグループやサブスクリプションに対して、Azure Firewall の設定変更が可能なロールを割り当てておきます。
今回は、Azure Firewall のデプロイされているリソースグループに対して、共同作成者 ロールを割り当てました。

ランタイム環境の作成と設定

2025/12 月時点では、Automation Account 既定の Az.Network モジュールでは、Azure Firewall Prescaling の設定変更はうまく動作させられなかったため、最新の Az モジュールを利用するランタイム環境を作成します。
Runbook の作成前に、作成しておきましょう。

まずは、ランタイム環境 に切り替えます。Automation Account の 概要 より、ランタイム環境エクスペリエンスを試す をクリックします。

表示が切り替わったら、[プロセス オートメーション] -> [ランタイム環境] と進み、新しいランタイム環境を作成します。

言語として PowerShell を選択し、バージョンは 7.4 を選択します。既定で入っているモジュールに加え、 [+ギャラリーから追加] を選択して Az.Accounts モジュールと Az.Network モジュール を加えます。
ランタイム環境を作成します。




作成したランタイム環境が表示されます。
モジュールのインポートが進行しており、完了までは数分かかります。

Runbook の作成

[Runbooks] から、新しい Runbook を作成します。
ランタイム環境には、先ほど作成したランタイム環境を指定して、作成を行います。

Runbook の編集画面が表示されたら、以下のスクリプトを貼り付けて保存します。なお、ご紹介しているスクリプトは、あくまで参考となります。

Azure Automation Runbook
# Azure Firewall Prescaling の最小インスタンス数を変更するスクリプト例
param(
    [Parameter(Mandatory=$true)]
    [string]$SubscriptionId,
    [Parameter(Mandatory=$true)]
    [string]$ResourceGroupName,
    [Parameter(Mandatory=$true)]
    [string]$FirewallName,
    # 設定するキャパシティ(既定値を 2 と 50 で)
    [int]$MinCapacity = 2,
    [int]$MaxCapacity = 50
)

# 認証
# 現在の PowerShell プロセス内で、AzContext(サブスクリプションやテナント情報)の自動保存を無効化
Disable-AzContextAutosave -Scope Process
# システム割り当て(またはユーザー割り当て)マネージドIDを使って Azure にサインイン
Connect-AzAccount -Identity | Out-Null
Select-AzSubscription -SubscriptionId $SubscriptionId | Out-Null

# 現在のFW取得
$fw = Get-AzFirewall -Name $FirewallName -ResourceGroupName $ResourceGroupName
if (-not $fw) { throw "Firewall '$FirewallName' not found in RG '$ResourceGroupName'." }

# 更新(Set-AzFirewall)
try {
    $fw.AutoscaleConfiguration.MinCapacity = "$MinCapacity"
    $fw.AutoscaleConfiguration.MaxCapacity = "$MaxCapacity"
    $fw | Set-AzFirewall
    Write-Output "Prescaling updated successfully to Min=$MinCapacity Max=$MaxCapacity."
}
catch {
    Write-Error "Failed to update Prescaling: $($_.Exception.Message)"
    throw
}

[保存] します。
[テストウィンドウ]で動作確認を行い、[公開] します。

定期実行の設定

最後に、定期的に実行されるよう Runbook にスケジュールを紐づけます。
[スケジュールへのリンク] を選択します。

[スケジュール] を選び、スケジュールを新規作成します。

[+スケジュールの追加]より、スケジュールの設定画面が表示されるので、任意のスケジュールを作成します。例えば毎朝 Prescaling の最小インスタンス値を引き上げておくための、毎日朝7時実行のスケジュールを作成します。

スケジュールを選択したら、Runbook のパラメータを指定します。
例えば、朝7時に、最小インスタンス値を 6 まで引き上げておくように指定し、8時の始業に備えるようなイメージです。上限値はコストに関与しないため、最大値の 50 としています。


スケジュール と パラメータを設定したら作成しておきます。
作成が成功したら、 [スケジュール] 欄に表示されるはずです。実行タイミングやパラメーターが指定した通りであることを確認しておきます。

同様に、例えば毎晩20時に実行される、最小インスタンス値を下げる スケジュール、パラメータも作成します。

実行結果

指定した時刻に Runbook が実行され、[ジョブ] 欄で確認できます。

ジョブの詳細を開くと、指定したパラメータや、出力、ログなどが確認できます。
以下は試しに、最小インスタンス数を 4、最大 44 という適当な値でスケジュール設定したジョブの実行例ですが、実際に Azure Firewall の Prescaling 設定が変更されていることがわかります。

まとめ

Azure Firewall Prescaling の設定の紹介と、Automation Account の Runbook を利用した定期的な設定変更例を紹介しました。

これで朝晩の時間帯に応じて Azure Firewall Prescaling の最小インスタンス数を変更することが可能になりました。

Azure Firewall Prescaling は、どちらかといえば大規模な環境で利用されることが多いかと思います。スケールインに伴う影響などを考えると、多少コストをかけて安定を望む場合が多いかとは思いますが、コスト影響を抑える必要があるという場合には、 Automation Account を利用することで、コストを抑えつつトラフィック増加に備えることが可能になるかと思います。

参考URL

https://learn.microsoft.com/en-us/azure/firewall/Prescaling
https://learn.microsoft.com/ja-jp/azure/firewall/tcp-session-behavior#tcp-reset-behavior-during-scale-in-events
https://jpaztech.github.io/blog/network/fw-prescaling/

そもそも Azure Automation 初めて触るわ、という場合はこちらがわかりやすいです。
https://www.tama-negi.com/2019/09/07/automation/

Microsoft (有志)

Discussion