Azure PaaSサービスも使わない時は停止しよう

## はじめに
Azureでシステム構築やPoCを行う中で、知らず知らずに利用料が高額になっていて、気付いた時には手遅れ、、なんてことを経験したことがあると思います。コスト管理という点では、以下のような対策を行うことが大事です。
1) 予算アラートを設定する
2) 不要になったリソースはこまめに削除する
3) 使わない時間帯はVMを落としておく

3.ついてはVMの自動シャットダウンがデフォルトで設定可能ですし、自動起動についてもAutomationのスケジュール実行で「毎日8:00に対象VMを起動する」といったプログラムを動かしている方も多いかと思います。Microsoftからも同様のソリューションが紹介されています。

https://docs.microsoft.com/ja-jp/azure/automation/automation-solution-vm-management

しかし、PaaS中心で利用している方にとってはVMなんてごく少数（場合によっては使ってないこともある）であり、あまりコスト抑制効果は期待できません。PaaSの場合、デプロイしたらずっと課金が行われるのが基本なので、ある程度コストが掛かるのは仕方ない所があります。ただ、PaaS系サービスでも停止/起動ができるものがあります。一部のサービスについてはAzureポータルからは操作できず、CUIからのみ実行可能というものもありますが、コスト抑制に効きますのでこの点については押さえておくのがよいです。

## 停止できるAzureサービス
私が普段よく使っているサービスで、停止/起動ができるサービスを2つ紹介します。

### Application Gateway
Application Gateway は一番使ってるサービスです。SKUによりますが月額数万円レベルでコストが掛かるものなので、特に夜間帯など使っていない時は停止しています。停止/起動はAzureポータルから行うことができずCUI実行のみになります。PowerShellだとこんな感じです(ログイン処理は割愛してます)。超簡単ですね。

```PowerShell
# Application Gateway停止
$ag = Get-AzApplicationGateway -Name "Application Gateway名" -ResourceGroupName "リソースグループ名"
Stop-AzApplicationGateway -ApplicationGateway $ag

# Application Gateway起動
$ag = Get-AzApplicationGateway -Name "Application Gateway名" -ResourceGroupName "リソースグループ名"
Start-AzApplicationGateway -ApplicationGateway $ag
```
実行時間は大体5~15分程度です。Application Gatewayの状態を確認したい場合は、Azureポータルからプロパティ画面を開きます。すると、状態によって　「動作状態」の項目が変化します。
|状態|キャプチャ|
|---|---|
|起動状態|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/2156ee3f-cab3-7054-9f88-69e4bda868a6.png)|
|停止コマンド投入中|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/07726545-a360-e1cf-ad97-d48b401bc6c0.png)|
|停止コマンド完了|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/a0a370d6-04cc-bd60-0014-6fee89221f42.png)|

注意点として、Application Gateway のSKUがStandard_v1の場合、付与できるPublic IPが「動的」となるため、再起動するとIPアドレスが変わる可能性があります。FQDNは変わりませんが、NSGなどIPアドレスで何等か制御している場合は影響が出ますのでご注意ください。

### Azure Firewall
Azure Fiewall も最近よく使います。このサービスはかなりの金食い虫で月額10万円掛かります。こいつも未使用時は停止しておきたいですね。Azure FirewallはApplicationGatewayと同じく、CUI実行のみです。PowerShellだとこんな感じです(ログイン処理は割愛してます)。

```PowerShell
# Azure Firewall停止
$afw = Get-AzFirewall -Name "Azure Firewall名" -ResourceGroupName "リソースグループ名"
$afw.Deallocate()
Set-AzFirewall -AzureFirewall $afw

# Azure Firewall起動
$afw = Get-AzFirewall -Name "Azure Firewall名" -ResourceGroupName "リソースグループ名"
$vnet = Get-AzVirtualNetwork -Name "Azure FirewallがデプロイされているVNET名" -ResourceGroupName "リソースグループ名"
$pip = Get-AzPublicIpAddress -Name "Azure Firewallに付与されているPublicIP名" -ResourceGroupName "リソースグループ名"
$afw.Allocate($vnet, $pip)
Set-AzFirewall -AzureFirewall $afw
```
実行時間は大体10~20分程度です。Azure Firewallの場合、Azureポータルにも明確な状態を示す項目がありません。概要画面からネットワーク関連の設定が解除されていることを確認することになります。(下表の「停止コマンド完了」の赤枠部分)
|状態|キャプチャ|
|---|---|
|起動状態|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/288c32de-a30c-eed6-76a0-c7ac49395152.png)|
|停止コマンド投入中|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/74de7129-edc4-d940-ea36-57f1defae211.png)|
|停止コマンド完了|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/4bab739c-4e20-8d42-b747-30650c3321b3.png)|
|起動コマンド投入中|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/4cf82b56-8b81-2a55-4a93-6fa60f1761c4.png)|
|起動コマンド完了|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/26bd32ec-92f0-b086-4ab2-20809058f603.png)|

Azure Firewallの場合は再起動後に少々構成が変わる所がありますので注意してください。
※起動スクリプトの中で設定すれば回避可能と思いますが、そこまで調査が至ってないのでご容赦ください。

##### プライベートIP範囲を設定している場合はデフォルトに戻ってしまう
概要画面の右下にある「プライベートIP範囲」はSNATを有効範囲を設定したい場合に利用します。常にSNATさせたい場合は「255.255.255.255/32」を設定します。この設定が再起動後はデフォルト設定「IANA RFC 1918」に戻ってしまいます。その為、本設定を利用している場合は再起動手順の中に忘れず記載しておきましょう。


##### パブリックIP構成 の名前が変わってしまう
こちらは致命的な問題ではありませんが、当該設定の「名前」部分について、リソース作成直後はPublicIP名がついているのですが、再起動後は「AzureFirewallIpConfiguration0」に代わっていました。IPアドレス自体が変わる訳ではないので実害はないですが、パラメータシートなんか作成している場合はご注意ください。
__再起動前__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/5c75c754-92b9-a1e6-577e-57667970b1a0.png)
__再起動後__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/ba19bb7f-7b18-30fb-c411-547e7d5412e6.png)

## おわりに
今回は、Application Gateway と Azure Firewall の停止/起動手順について紹介しました。開発環境やPoC環境など利用時間が限定されている環境についてはリソースの停止/起動運用をご検討ください。今回は割愛しましたが、Automationを使えば「毎日朝8:00に自動起動して、夜20:00に自動停止する」といった運用も可能になります。また、今回は2サービスだけでしたが、それ以外にAKSやSynapse Analytics(こちらは一時停止)についても停止/起動運用が可能です。ただ、これらサービスについても考慮点がありますので、また時間ができたらご紹介したいと思います。
今回はここまで・・ありがとうございました！