Azure Application Gateway のパスベースルーティングを試してみる

Azure Application Gateway のパスベースのルーティングが Azure Portal から GUI ベースでサクッと構築できるという情報を聞いたので、使用感などさっそく試してみたいと思います。
本日参考にするのはこちら => [チュートリアル:Azure Portal を使用してパス ベースのルーティング規則のあるアプリケーション ゲートウェイを作成する](https://docs.microsoft.com/ja-jp/azure/application-gateway/create-url-route-portal)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/f97ff526-6e24-8213-84ab-648e49e39819.png)


#バックエンドサーバーの仮想マシン作成
まずはバックエンドの IIS サーバーを 3つ作成します。
※チュートリアルでは IaaS サーバー作ってそこに IIS インストールする感じですが、バックエンドターゲットにアプリのサービスポイントを追加できたりするので、IIS にこだわらなくても大丈夫です。(IISインストールめんどくさい、、、笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/5b81c3e4-359a-96ef-445b-f17effccb872.png)

作成した VM に IIS を Azure CLI を使ってインストールします。少しめんどくさいですが、myVM1 / myVM2 / myVM3 の 3つすべての VM に対して実行します。
チュートリアルにあるコマンドが少し間違っていました。こちらを実行すれば IIS はインストールされます。

```ps
Set-AzVMExtension -ResourceGroupName "APGWValRG" `
    -ExtensionName "IIS" `
    -VMName "myVM1" `
    -Location "japaneast" `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.8 `
    -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"}'

Set-AzVMExtension -ResourceGroupName "APGWValRG" `
    -ExtensionName "IIS" `
    -VMName "myVM2" `
    -Location "japaneast" `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.8 `
    -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"}'

Set-AzVMExtension -ResourceGroupName "APGWValRG" `
    -ExtensionName "IIS" `
    -VMName "myVM3" `
    -Location "japaneast" `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.8 `
    -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"}'
```
これでVMは完成です。

#アプリケーションゲートウェイの作成
Azure Portal から Application Gateway のデプロイをします。今回はとりあえず `Standard V2` プランを選択しました。仮想ネットワークは `myVNet`、サブネットは APGW 用に作成した `myAGSubnet` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/2c15ad90-da21-4f4e-04b1-905d16630fde.png)
次にフロントエンドの設定をします。パブリック IP アドレスを新規追加します。名前は適当に `myAGPublicIPAddress` としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/04a9a9b6-467f-16b1-ec3a-c5d065c7fe91.png)
次にバックエンドプールの追加をします。新しく `myBackendPool` という名前のバックエンドプールを追加します。ターゲットの種類で作成した仮想マシンの VM1 を選択します。
この手順と同様に、`ImagesBackendpool`、`VideoBackendpool` を作成し、それぞれターゲットを `myVM2`、 `myVM3` とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/cc284302-dbaa-6c56-2d10-a4695f8d6d31.png)
次にルーティング規則を設定します。リスナーを作成し、`8080` ポートを指定。
タブの `バックエンドターゲット`からパスベースのルーティング規則を設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/fb6aa16b-4805-e83a-8828-64c431d3a09b.png)
こんな感じで `/images`、`/video` パスの際にどのバックエンドプールにルーティングするかを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/a6910079-3124-d729-9adc-7f6362e76c3f.png)
検証してデプロイが完了すると、こんな感じで同じリソースグループに作成した VM と Application Gateway、パブリックIP が作成されていることがわかります。
※アプリケーションゲートウェイはロードバランサーと同様で作成に少し時間がかかります。私の環境では10分程度かかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/23bf3212-c2ff-0f96-178d-9d3259031cfa.png)

#試してみる
実際に試してみましょう。パブリックIPアドレス + Http 設定であけたポート 8080 を入れるとまずは VM1 に飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8bf37a4c-49c8-dfb5-817b-f0eb56e803c0.png)
ルーティング規則を設定した /image/test.htm、並びに /video/test.htm にアクセスするとそれぞれルールを設定したバックエンドプールにルーティングされ、バックエンドVMで指定されている myVM2, myVM3 にルーティングされていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/38bcfd55-9c56-b6b5-0ea7-6a58d07bd50a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8910703e-6f15-0c4f-3266-7f182e558092.png)

デプロイに時間がかかったり少し設定がめんどくさかったですが、これで自動スケールなどもやってくれるので、開発者はより開発に注力できるという点では便利なサービスではないでしょうか。

#所感
試してみる中で感じたことをメモ代わりに書いておきます。

- ルーティング規則を設定するのが簡単で便利。ただ少しインターフェスがわかりにくい。バックエンドプールとルーティングをもう少し図で分かりやすいインターフェイスがあるとより便利かと思いました。
- チュートリアルは IIS インストールですが、それが思いのほか時間がかかります。バックエンドプールのターゲットには仮想マシンのほかにも、IPアドレス、FQDN、仮想マシンスケールセットIP、アプリのサービスポイントが追加できるので、PaaSサービスをサービスポイントでルーティングする方が試しやすいのではないかと思います。
- 価格形式がわかりにくい。Standard/WAF で価格が変わったり、価格算出の内部の構成がデプロイする際には少しわかりにくいと感じました。次の記事では APGW の価格構成についてまとめたいと思います。

#参考
チュートリアル:Azure Portal を使用してパス ベースのルーティング規則のあるアプリケーション ゲートウェイを作成する
https://docs.microsoft.com/ja-jp/azure/application-gateway/create-url-route-portal

クイック スタート:PowerShell を使用して Azure に Windows 仮想マシンを作成する
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/quick-create-powershell#view-the-web-server-in-action

クイック スタート:Azure Application Gateway による Web トラフィックのルーティング - Azure portal
https://docs.microsoft.com/ja-jp/azure/application-gateway/quick-create-portal#add-backend-targets

Azure Application Gateway とは
https://docs.microsoft.com/ja-jp/azure/application-gateway/overview