Azure PowershellでAzure Firewallの課金を止めてみた

AzurePowershell AzureFirewall

AzureFirewallは利用している状態では常時課金が発生し、Premiumを利用している場合にはFirewallだけで日本円換算で月に約17万円(1USD=130円のレート) 、そしてデータ処理量、ログのデータ量などを含めると 20~30万円 近くかかります。

なので、例えばDR環境などの「普段利用しないがデプロイはしておきたい」といった場合には存在するだけで課金がかかりコストが増えてしまいます

今回はそんな不要なコストを削減できるように、AzurePowershellを利用してAzureFirewallを停止して課金を止めてみました

広告

AzureFirewall停止のコマンド

AzureFirewallを停止するコマンドは以下の通りです。

$rg = <リソースグループ名>
$azfw_name = <AzureFirewall名>

$azfw = Get-AzFirewall -Name $azfw_name -ResourceGroupName $rg
$azfw.Deallocate()
Set-AzFirewall -AzureFirewall $azfw

・記載例

$rg = "RG-Test-AzureFW"
$azfw_name = "AzureFW-Test"

$azfw = Get-AzFirewall -Name $azfw_name -ResourceGroupName $rg
$azfw.Deallocate()
Set-AzFirewall -AzureFirewall $azfw

これでAzureFirewallは停止し、課金も止まります。

また、AzureFirewallの再開は記事の下部の「AzureFirwallの再開コマンド」にて記載しています。

[参考] AzureFirewall作成

もしAzureFirewallを新規作成したい場合には以下の記事を参考にしてください。

AzureCLIでAzureFirewallを作成してみた
AzureCLI でファイアウォールポリシーを利用するAzureFirewall(クラシックではないAzureFirewall)を作成してみました。 事前準備 AzureFirewallを作成するにあたって事前に作成が必要な以下のリソースを...

AzureFirewall停止と課金停止の確認

実際にAzureFirewallが停止されていて課金も停止されているかを確認します。

Firewallのポータル上での状態

Azureポータル上では「プロビジョニング状態」は [Succeeded] ですが、「ファイアウォールのプライベート IP」は null となっており停止しているように見られます。

・AzureFirewall停止後のAzureポータルの画面

AzureFirewall停止後のAzureポータルの画面

参考として停止前のAzureポータル画面は以下の通りです。

・AzureFirewall停止前のAzureポータルの画面

AzureFirewall停止前のAzureポータルの画面

AzurePowershell上での状態

AzurPowershellのコマンドでは以下のように見えます。

IpConfigurations」が null となっていて、IPが割り当てられていないことが分かります。

ただ、「ProvisioningState」が [Succeeded] となっており、且つ「deallocate」のような文言は見当たらないのが少しわかりづらい点です。

PS C:\> Set-AzFirewall -AzureFirewall $azfw


Name                        : AzureFW-Test
ResourceGroupName           : RG-Test-AzureFW
Location                    : japaneast
Id                          : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG-Test-AzureFW/provid
                              ers/Microsoft.Network/azureFirewalls/AzureFW-Test
Etag                        : W/"yyyyyyyy-5bcd-4a21-b291-7187c286bf0a"
ResourceGuid                :
ProvisioningState           : Succeeded
Tags                        :
IpConfigurations            : []
ApplicationRuleCollections  : []
NatRuleCollections          : []
NetworkRuleCollections      : []
ThreatIntelMode             : Alert
ThreatIntelWhitelist        : {
                                "FQDNs": null,
                                "IpAddresses": null
                              }
PrivateRange                : null
Sku                         : Microsoft.Azure.Commands.Network.Models.PSAzureFirewallSku
VirtualHub                  :
HubIPAddresses              :
FirewallPolicy              : Microsoft.Azure.Management.Network.Models.SubResource
IPv6CircuitConnectionConfig :

PS C:\>

実際に通信が通らないかを確認する

AzureFirewallが停止された状態で仮想マシンのデフォフォルトゲートウェイをAzureFirewallに向けた場合、インターネット向けに通信できなくなるのかを確認しました。

当たり前であり予想通りでしたが、以下のように通信はできませんでした。

コスト分析で課金状況を確認

これは即時に確認することができませんが、翌日などにコスト分析から利用金額を確認するとAzureFirewallの課金が停止していることが確認できます

以下は 2/15 にAzureFirewallをデプロイして1時間利用しないうちに「停止」した場合のコスト分析の結果です。
AzureFirewall自体はこのコスト分析を確認した 2/17 時点でもリソースとして存在している状態です。

2/15 には AzureFirewall を 145円分しか利用していないことが分かります。
 ※この時のレートではStandardで 1時間当たり162.469円 なのでその値を下回っています。

・コスト分析の結果

コスト分析の結果

またグラフを見ても分かる通り、2/16 のコストは累積コストと同じ 163.40円 なので、 2/15 から追加で 9円しか利用されておらず、2/15~2/16にかけてもAzureFirewallは課金されていないことが分かります。
なお 9円 はパブリックIPの利用料金です。

AzureFirwallの再開コマンド

停止後に再開するコマンドは以下の通りです。
仮想ネットワークとパブリックIPを紐づけることが必要となります。

$rg = <リソースグループ名>
$azfw_name = <AzureFirewall名>
$vnet_name = <仮想ネットワーク名>
$publicip_name = <PublicIPアドレス名>

$azfw = Get-AzFirewall -Name $azfw_name -ResourceGroupName $rg
$vnet = Get-AzVirtualNetwork -ResourceGroupName $rg -Name $vnet_name
$publicip = Get-AzPublicIpAddress -Name $publicip_name -ResourceGroupName $rg
$azfw.Allocate($vnet,@($publicip))
Set-AzFirewall -AzureFirewall $azfw

・記載例

$rg = "RG-Test-AzureFW"
$azfw_name = "AzureFW-Test"
$vnet_name = "Vnet-Test"
$publicip_name = "pip-Test-AzureFW"

$azfw = Get-AzFirewall -Name $azfw_name -ResourceGroupName $rg
$vnet = Get-AzVirtualNetwork -ResourceGroupName $rg -Name $vnet_name
$publicip = Get-AzPublicIpAddress -Name $publicip_name -ResourceGroupName $rg
$azfw.Allocate($vnet,@($publicip))
Set-AzFirewall -AzureFirewall $azfw

以下のようにコマンドの結果が返ってきたら完了です。
IpConfigurations」に値が入っていることが確認できます。

・実行結果

PS C:\> Set-AzFirewall -AzureFirewall $azfw


Name                        : AzureFW-Test
ResourceGroupName           : RG-Test-AzureFW
Location                    : japaneast
Id                          : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG-Test-AzureFW/provid
                              ers/Microsoft.Network/azureFirewalls/AzureFW-Test
Etag                        : W/"yyyyyyyy-15d5-467e-972f-a45174477c51"
ResourceGuid                :
ProvisioningState           : Succeeded
Tags                        :
IpConfigurations            : [
                                {
                                  "Name": "AzureFirewallIpConfiguration0",
                                  "Etag": "W/\"yyyyyyyy-15d5-467e-972f-a45174477c51\"",
                                  "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG-Test-Azu
                              reFW/providers/Microsoft.Network/azureFirewalls/AzureFW-Test/azureFirewallIpConfiguration
                              s/AzureFirewallIpConfiguration0",
                                  "PrivateIPAddress": "10.0.0.4",
                                  "Subnet": {
                                    "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG-Test-A
                              zureFW/providers/Microsoft.Network/virtualNetworks/Vnet-Test/subnets/AzureFirewallSubnet"
                                  },
                                  "PublicIpAddress": {
                                    "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG-Test-A
                              zureFW/providers/Microsoft.Network/publicIPAddresses/pip-Test-AzureFW"
                                  }
                                }
                              ]
ApplicationRuleCollections  : []
NatRuleCollections          : []
NetworkRuleCollections      : []
ThreatIntelMode             : Alert
ThreatIntelWhitelist        : {
                                "FQDNs": null,
                                "IpAddresses": null
                              }
PrivateRange                : null
Sku                         : Microsoft.Azure.Commands.Network.Models.PSAzureFirewallSku
VirtualHub                  :
HubIPAddresses              :
FirewallPolicy              : Microsoft.Azure.Management.Network.Models.SubResource
IPv6CircuitConnectionConfig :



PS C:\>

Allocate() メソッドには引数が必要

単に「$azfw.Allocate()」として引数を指定せずにメソッドを利用すると以下のようなエラーとなり利用できませんでした

PS C:\> $azfw = Get-AzFirewall -Name AzureFW-Test -ResourceGroupName RG-Test-AzureFW
PS C:\> $azfw.Allocate()
"Allocate" のオーバーロードで、引数の数が "0" であるものが見つかりません。
発生場所 行:1 文字:1
+ $azfw.Allocate()
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

PS C:\>

なので、このエラー結果からも改めてこの Allocate() メソッドを利用する際には必ず引数(仮想ネットワークとパブリックIPの情報)が必要ということが分かります。

タイトルとURLをコピーしました