PowerShellを使ったAzure Firewallの停止・起動方法

## はじめに
本記事は、2023/10/19 時点の内容をまとめたものである。

Azure Firewall（以下、AFW）は Azure Portal から停止することができない。
コスト節約のため、AFW を都度作成・削除する運用を行っていたが、Azure PowerShell を利用した AFW の停止・起動方法を知り、手順についてまとめた。

AFW を停止・起動できるツールは下記の通り。
|      | Azure Portal | Azure CLI |Azure PowerShell |
|:-:   |:-:           |:-:        |:-:              |
|停止  |×             |×          |○                |
|起動  |○             |×          |○                |

## 前提
* AFW、AFWポリシー、パブリックIPアドレス、仮想ネットワーク、サブネット、仮想マシンは作成済み
* 強制トンネリング用に構成されていない AFW とする
* ローカルPCは Windows

## 事前準備
#### 1. Windows に PowerShell をインストールする

ローカルPCで下記コマンドを実行し、最新バージョンの PowerShell を検索
```cmd:cmd
winget search Microsoft.PowerShell
```

```cmd:結果
Name               Id                           Version   Source
-----------------------------------------------------------------
PowerShell         Microsoft.PowerShell         7.3.8.0   winget
PowerShell Preview Microsoft.PowerShell.Preview 7.4.0.6   winget
```

実際の画面
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/0dd2041b-be70-2d10-12df-1bb1b2740298.png)

`id` パラメータを使用して PowerShell または PowerShell Preview をインストール
（今回はPowerShellを選択）
```cmd:cmd
winget install --id Microsoft.Powershell --source winget
```

実際の画面
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/5c814b0c-081b-d74e-63ca-4c0671a7c4ad.png)

#### 2. Azure PowerShell モジュールをインストールする
PowerShell で下記コマンドを実行し、Azure PowerShell モジュールをインストール
```powershell:PowerShell
if (Get-Module -Name AzureRM -ListAvailable) {
    Write-Warning -Message ('Az module not installed. Having both the AzureRM and ' +
      'Az modules installed at the same time is not supported.')
} else {
    Install-Module -Name Az -AllowClobber -Scope CurrentUser
}
```

実際の画面
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/d6e25470-1f22-7b9d-8a06-7d0bf17e3a03.png)

PSGallery の初回使用時には、以下のプロンプトが表示される。インストールを続行するには、「Yes」または「Yes to All」を選択
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/92b8f4ba-e41b-227e-f735-4f14b48c08e7.png)

NuGetプロバイダーとリポジトリの信頼が必要な場合の画面
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/73b74337-e00d-7b7c-c8a7-7ad42ac3a85c.png)

## AFW の停止手順
#### 1. Azure Account に接続する
PowerShell で下記コマンドを実行し、認証されたアカウントを使用して Azure 環境に接続
```powershell:PowerShell
Connect-AzAccount
```
実際の画面
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/6a2cd199-5f69-5ae2-e55a-085d386a98d2.png)

MFA認証が動作しなかった場合はテナントIDを指定
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/93aa656b-7c80-c981-e163-7ef65b9ac3a9.png)

#### 2. AFW を停止する
下記コマンドを実行し、AFW を停止
```powershell:PowerShell
$ResourceGroupName = "<リソースグループの名前>"
$AzureFirewallName = "<AFWの名前>"
$azfw = Get-AzFirewall -Name $AzureFirewallName -ResourceGroupName $ResourceGroupName
$azfw.Deallocate()
Set-AzFirewall -AzureFirewall $azfw
```

#### 3. Azure Portal から確認
* 停止前
    * AFW の画面
        * サブネット、パブリックIPアドレス、プライベートIPアドレスが表示されている
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/2cd506e2-b8fd-68de-6708-fe2e914f59e7.png)
    * パブリックIPアドレスの画面
        * 関連付け先に AFW が表示されている
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/d9bc4fc6-5341-2ee8-a6ae-57822fd3e26b.png)

* 停止後
    * AFW の画面
        * サブネット、パブリックIPアドレス、プライベートIPアドレスが表示されない
![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/d8fd179a-b44d-71aa-e286-3cea0592a0b6.png)
    * パブリックIPアドレスの画面
        * 関連付け先が表示されない
![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/313f27f3-8bd6-eed4-4de3-0fc334a4121d.png)

#### 4. AFW を経由した通信確認
仮想マシンから Google へアクセスする AFWポリシールールを作成。
仮想マシンにログインし、下記コマンドを実行してGoogleにアクセス
```cmd:cmd
curl -I http://www.google.com
```
* 停止前
    * アクセス成功
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/30e0fa05-2dd2-4505-7aad-5fd82c3674ca.png)
* 停止後
    * アクセス失敗
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/d7acbbde-7257-12f6-cfad-c7a6b69a3c1e.png)


## AFW の起動手順
#### 1. Azure Account に接続する
PowerShell で下記コマンドを実行し、認証されたアカウントを使用して Azure 環境に接続
```powershell:PowerShell
Connect-AzAccount
```

#### 2. AFW を起動する
下記コマンドを実行し、AFW を起動
```powershell:PowerShell
$ResourceGroupName = "<リソースグループの名前>"
$AzureFirewallName = "<AFWの名前>"
$VirtualNetworkName = "<仮想マシンの名前>"
$PublicIPName = "<パブリックIPアドレスの名前>"
$azfw = Get-AzFirewall -Name $AzureFirewallName -ResourceGroupName $ResourceGroupName
$vnet = Get-AzVirtualNetwork  -Name $VirtualNetworkName -ResourceGroupName $ResourceGroupName
$publicip = Get-AzPublicIpAddress -Name $PublicIPName -ResourceGroupName $ResourceGroupName
$azfw.Allocate($vnet, $publicip)
Set-AzFirewall -AzureFirewall $azfw
```
実際の画面
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/0dc6c98f-dfe6-aff6-f41f-2b6400763aa3.png)

#### 3. Azure Portal から確認
* 起動前
    * AFW の画面
        * サブネット、パブリックIPアドレス、プライベートIPアドレスが表示されない
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/85409b06-653c-3c9d-05ed-6b1b89efddf4.png)
    * パブリックIPアドレスの画面
        * 関連付け先が表示されない
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/65a9b3ca-ce9b-c811-d5b8-b838c0916672.png)

* 起動後
    * AFW の画面
        * サブネット、パブリックIPアドレス、プライベートIPアドレスが表示されている
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/2021d3ce-b60b-4eea-9d32-35b6bf139d54.png)
    * パブリックIPアドレスの画面
        * 関連付け先に AFW が表示されている
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/13e5d091-a04c-9f43-78e7-99e9a43fcffa.png)

#### 4. AFW を経由した通信確認
仮想マシンから Google へアクセスする AFWポリシールールを作成。
仮想マシンにログインし、下記コマンドを実行してGoogleにアクセス
```cmd:cmd
curl -I http://www.google.com
```
* 起動前
    * アクセス失敗
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/d7acbbde-7257-12f6-cfad-c7a6b69a3c1e.png)
* 起動後
    * アクセス成功
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/30e0fa05-2dd2-4505-7aad-5fd82c3674ca.png)

以上

## 参考
* https://learn.microsoft.com/ja-jp/azure/firewall/firewall-faq
* https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4#install-powershell-using-winget-recommended
* https://learn.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-0.10.0#install-the-azure-powershell-module
* https://stackoverflow.com/questions/67933679/get-azpostgresqlfirewallrule-is-not-recognized-as-a-name-of-a-cmdlet-function
* https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3#install-powershell-using-winget-recommended
* https://learn.microsoft.com/ja-jp/powershell/module/az.accounts/connect-azaccount?view=azps-10.4.1