[Azure] Application Gateway v1 で構築検証してみる（E2E TLS/パスベース規則）④

Application Gatewayの構築検証記事③です。
第2回までで、Application Gatewayの作成とルール①の設定について記載しました。
　[1回目：構築する構成図と事前準備](https://qiita.com/ninob/items/e8d883a69cb4069abee1)
　[2回目：Application Gatewayの作成とエンドツーエンドTLSの設定](https://qiita.com/ninob/items/0d1f681f4edfce5bf882)
　[3回目：パスベース規則の設定](https://qiita.com/ninob/items/167beb82fff74f7f6b0d)

第4回の今回は、運用上のTIPSとして以下をご紹介します。
・Application Gatewayの起動/停止
・診断設定（アクセスログ等のログ収集設定）
・証明書の更新
・ルーティング規則の優先度設定

## Application Gatewayの起動/停止

:::note info
Application Gatewayを停止すると、課金も停止されます。
:::
検証用のApplication Gatewayは、使うときだけ起動することで、コスト削減が可能です。

Azureポータルからは起動/停止できないため、Azure PowerShellやAzure CLIを使用して実行します。
下記にAzure PowerShellのコマンド例を記載します。

```
# Application Gateway Restart PowerShell
# APGW Parameter
$ResourceGroupName = <Resource Group>
$APGWName = <Application Gateway Name>
$ag = Get-AzApplicationGateway -Name $APGWName -ResourceGroupName $ResourceGroupName

# APGW Stop
Stop-AzApplicationGateway -ApplicationGateway $ag

# APGW Start
Start-AzApplicationGateway -ApplicationGateway $ag
```
実行結果として、対象のAppication Gatewayの情報が返るため、`OperationState : Stopped`になっていれば停止完了、
`OperationState : Runnning`になっていれば起動完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/28888c2b-808d-c3c1-dc0a-503f22b5c00a.png)
起動状態はポータルからも確認可能です。（設定⇒プロパティメニューから確認可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/fc954050-43d1-23ad-92a8-5eea25a36ca2.png)
なお、Application Gatewayの停止中にバックエンドのVMも停止しようとしたらエラーが発生がしました。
Application Gatewayの停止/起動運用をする場合、VMの起動/停止タイミングと調整した方がよさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/f4747418-117c-f976-9138-cba5a0f713c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/0ff0339f-c608-1b79-69f6-e9963008303a.png)

## 診断設定
診断設定を有効化することで、Application Gatewayのアクセスログ等を収集可能です。
以下に設定手順と診断情報の確認手順を記載します。
#### ■ 診断設定有効化手順
監視⇒診断設定メニューを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/319e5b4e-1aea-b1f8-08c3-8d23b9315983.png)
「診断設定を追加する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/1cf4e355-e932-5c0f-335e-9d0171d72b06.png)
収集するログの種類と保存先を指定し「保存」をクリックします。
今回はストレージアカウントに出力する設定としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/6788fd79-e399-f265-2ff1-4b11f05b28dd.png)
#### ■ 診断情報確認手順
ログ収集までしばらく待ち、監視⇒ログメニューを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/6b10303c-3f2b-2e1d-fe09-139443e392d9.png)
試しにアクセスログを確認してみるため、以下のクエリを実行します。
`AzureDiagnostics
| where Category == "ApplicationGatewayAccessLog"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/c1b7461a-23f9-06ba-4081-1fd978f3ca32.png)
クエリの実行結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/8c681e38-d605-24f4-1abf-9bdb727b4382.png)
CSVでダウンロードする場合、エクスポート⇒CSVへのエクスポート-すべての列を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/c3a3f06f-1ed5-c9ca-6bc2-e3f3b6494f61.png)
CSVファイルでダウンロード可能です。（下図は参考になる列をサンプルで表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/21bb61b2-e95f-bd4d-eb98-95396bfca7b1.png)
例えば、 "clientIP_s"列 に接続元クライアントIP、
"requestQuery_s" 列の "SERVER-ROUTED" に接続しているバックエンドサーバのIPが表示されるので、
どのセッションがどのサーバに、どのような情報（Cookie等）で接続しているか確認できます。

## 証明書の更新
#### ■ リスナーのPFX証明書更新
設定⇒リスナーより、HTTPSプロトコルを設定しているリスナーを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/0726c5b2-5d58-70e2-b5ab-c0875d251411.png)
以下を設定し、画面下部の「保存」をクリックします。
・証明書の選択：　　　　　　　　　　既存のものを選択
・選択した証明書の更新または編集：　☑
・PFX証明書ファイル：　　　　　　　（新しいPFX証明書をアップロード）
・パスワード：　　　　　　　　　　 （PFX証明書生成時に設定したパスワード）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/41558de6-d56d-5a24-c8c0-71fe98922d77.png)
画面右上の通知にて、更新が完了したメッセージが表示されるまで待機します。※20分程度かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/9a0e8af0-f70e-f9e2-e87d-cfb95c89b424.png)

#### ■ HTTP設定のCER証明書更新
HTTP設定より、HTTPSプロトコルを設定している設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/b8fa67c0-ba80-4b6f-8a65-57b5c7b02f10.png)
証明書欄で「証明書の追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/b4623fd4-eaa2-96f7-4040-1ff443ed566c.png)
以下の設定を行い、もう一度「証明書の追加」をクリックします。
・証明書の選択：　新規作成
・CER証明書：　　 （新しいCER証明書をアップロード）
・証明書名：　　　（任意。**既存と重複しないように設定**）
※古いCER証明書と同じ名前を設定すると、保存時にエラーとなります。証明書のファイル名は同じでもOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/b54f491c-9e11-a548-397a-f7b8b48e950e.png)
古い証明書の右にある「・・・」をクリックし、「削除」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/47906b5d-5d12-773e-662e-e5646c30434b.png)
古い証明書が削除されたことを確認し、画面下部の「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/8a31429e-705c-c848-0464-9002bb36bf65.png)
画面右上の通知にて、更新が完了したメッセージが表示されるまで待機します。
※20分程度かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/9a0e8af0-f70e-f9e2-e87d-cfb95c89b424.png)
ポータル上では古い証明書が非表示になりましたが、まだ内部で情報を持っているためコマンドで削除します。
サポートに確認したところ、古い証明書を削除しなくとも、なにか問題が起きることはなさそうだが、
ポータルから見えない情報になるため、管理面から削除推奨とのこと。

Cloud Shellを起動します。今回はPowerShellを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/2c2b55eb-9523-2f27-7a54-e98306e47377.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/b025c609-ccc3-d80e-9294-d3d2cb877343.png)
登録されているCER証明書を確認します。

```
$appgw = Get-AzApplicationGateway -Name "<Application Gateway名>" -ResourceGroupName "<リソースグループ名>"
Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $appgw | Select-Object Name,ProvisioningState
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/61610483-1a94-f9b8-5262-2b15c28479d4.png)

古いCER証明書を削除します。今回は「server_cer_old」を削除します。
※20分程度かかります。

```
Remove-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $appgw -Name "<古いCER証明書名>" | Select-Object ProvisioningState
Set-AzApplicationGateway -ApplicationGateway $appgw | Select-Object ProvisioningState
```

古いCER証明書が存在しないことを確認します。

```
Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $appgw | Select-Object Name,ProvisioningState
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/58c54f07-0a88-57a2-c99b-0e97b0b377cc.png)


## ルーティング規則の優先度設定

:::note warn
Standard V2 SKUの場合、ルールの優先度を設定可能ですが、
Standard V1 SKUの場合、ポータルに表示される順序で、上から順に処理されます。
:::
すべてFQDN指定のルールであれば考慮不要ですが、IPアドレス指定のルールを設定する場合は、注意が必要です。
Application GatewayではプライベートIPは1つのみ付与可能なため、IPアドレスのルールが上位にあると、
プロトコルが同じすべてのアクセスが該当してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/23cc7e55-8266-9044-a082-d223ce9fb133.png)
そのため、IP指定のルールが一番最後になるように設定する必要があります。

ただし、ルールを更新すると順序も更新されるようで、IP指定のルールが上位になった場合は一度削除→再作成が必要です。
(何も変更せず保存しても順序は変わりませんでした。。)


以上です。