Azure Application Gatewayマルチサイトを使ってメンテナンスモードを実現してみた

# やりたいこと
Azure Application Gatewayでの単一サイト構成では以下の図のような形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/09875b85-9cfa-9b40-0671-ebe014a6f3b1.png)

これをApplication Gatewayマルチサイト機能を使って、通常ルートとメンテナンス用ルートに分けることができないか検証してみたので書き残します。メンテナンスモードを作り出すイメージです。
図で表すと以下のような構成です。

## 通常時
* ユーザーもメンテナンスユーザーもBackendPoolにアクセス可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/24068881-53f5-3373-ba95-8d7ea7453d5d.png)

## メンテナンス時
* メンテナンスユーザーはBackendPoolにアクセスできるが、ユーザーはSorryPageにアクセスされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a7470cc0-ca55-d112-78f3-370bace7d8ed.png)

# カスタムエラーページ作成
* まずはSorryPage配置用のBlobを作成します。ストレージアカウント作成方法は割愛します。
* ストレージアカウント画面より、[Blob service]→[コンテナー]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e5e7009e-05e3-4f63-4f3c-e15c2833d953.png)

* [+ コンテナー]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/959d6132-3e99-1943-9388-8ac6d5e538e0.png)

* このときパブリックアクセスレベルを[Blob]もしくは[コンテナー]に設定します。SorryPage配置先はパブリックなBlobを指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4182ca2a-8593-d4e3-8294-4f120816f1b2.png)

* コンテナーが作成されたらその配下にSorryPageをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/cc7d91b1-8d5e-72cf-2be9-1c7753c9f25b.png)

* アップロードファイルを選択するとURLが表示されるためコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/16bbb41b-c3c8-bea2-1f7c-5c582fccd50a.png)

* ブラウザーを開いてアクセス可能であることを確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/98637075-935f-efff-866a-a31b774dd9b1.png)

* これでカスタムエラーページの準備は完了です。URLは後ほど使います。

# マルチサイトリスナー作成
## 通常ルート
* 単一サイトの場合、1つのApplication Gatewayの中では1つのプロトコルのリスナーしか作れませんが、マルチサイトの場合は複数のリスナーを作成できます。今回はhttpリスナーを2つ用意します。
* Application Gatewayの画面より[リスナーの追加]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b27d7cef-25cb-7630-37b2-29e31272f9cb.png)

* 以下のように入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/5161d1bb-c142-c875-85db-273645cd90ee.png)

* リスナーの種類を[マルチサイト]に設定し、このリスナーにアクセスするときのホスト名を入力します。今回はuserにしました。本来であればちゃんとしたドメインを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/155c98cb-6252-e422-2204-0b4d7424737a.png)

* エラーページのURLを[はい]に設定し、無効なゲートウェイにカスタムエラーページのURLを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bc7001fd-00b7-9cbd-2803-f3fc70c28434.png)

## メンテナンスルート
* 同じようにメンテナンス用のリスナーを作成します。今回はホスト名をmaintenanceにしています。エラーページの設定はしません。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/2aec233e-9f5e-479c-47ea-c3b019be0ebd.png)

# バックエンドプール作成
* 次にアクセス先のバックエンドプールを作成します。今回はIISをインストールしたWindows Serverを準備しました。
* Application Gatewayの画面より[バックエンドプール]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/19daee3d-2c1e-8850-a993-e4df6d8c995e.png)

* [追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f107c0f9-d399-4334-60ba-c4d6d8a8fae8.png)

* ターゲットに事前準備した仮想マシンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/349f585b-0835-ac9c-98f0-0118297b8e5e.png)

# HTTP設定
## 通常ルート
* Application Gateway画面より[HTTP設定]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/14f5fc55-f5e4-bf0d-c9a1-fe68c820ca07.png)

* [追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d8ca2973-44f7-5ea4-19de-b6eff3ffa357.png)

* HTTP設定名だけ入れてあとはデフォルトのまま作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9ea7c3a1-991e-a16f-8f93-66b91043f2b1.png)

## メンテナンスルート
* 同じようにもう1つHTTP設定を追加します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3eeb0a49-9056-a2d2-5f65-5f88819d4fe0.png)

# ルール設定
## 通常ルート
* Application Gateway画面より[ルール]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/87e15476-11a0-f7a6-94a5-8755f5a25740.png)

* [+ 要求ルーティングルール]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b9219ae0-87c5-c3e2-b483-20b42253fef9.png)

* リスナーは通常ルート用のものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b32b9c0e-c6dc-0880-ed63-7ed8403061f6.png)

* バックエンドは事前に作成したものを、HTTP設定は通常ルート用のものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/028b0645-6b32-17e6-124b-7b54d19009af.png)

## メンテナンスルート
* 同じようにメンテナンス用のルールを作成します。リスナー、HTTP設定はメンテナンス用に作成したものを指定します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/366cc041-31d2-a56e-ea75-78d6f9fffb5d.png)

# 正常性プローブ作成
## バックエンドにヘルスチェック用HTMLファイル準備
* Windows Serverにログインし以下のようにヘルスチェック用のHTMLファイルを準備します。通常ルート用、メンテナンスルート用で2つ準備しておきます。中身は空でよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bb16a701-3c93-d879-1bdf-af2ed1a8e70a.png)

## 通常ルート用正常性プローブ作成
* Application Gateway画面より[ルール]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/201397b7-9fad-c602-9dd4-7962752181bd.png)

* [追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8bc2a3d2-a2b5-dbc6-0e71-1a4e2351a95c.png)

* ホスト名はリスナーで設定したときと同じものを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c27018dc-a5e7-3d2f-7d94-935a6bd4d359.png)

* パスには先ほど配置したヘルスチェック用HTMLファイルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ae7566fd-f721-7a22-bdb4-e752d3c8342c.png)

* HTTP設定は通常ルート用のものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a341d884-3ff8-3af2-724c-018f02a34a29.png)

* バックエンド正常性テストが通ればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/354e5b53-bcb8-9ef3-e12b-7c6075e4056b.png)

## メンテナンスルート
* 同じようにメンテナンス用の正常性プローブを作成します。今回はホスト名をmaintenanceに、パス/HTTP設定をメンテナンス用のものにしています。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/07d848d9-0af6-b272-27aa-987f2da044f9.png)

# 自PCへのhosts設定
* 今回はテスト用なので名前解決にhostsを使ってます。以下のように設定してます。(実際はApplication GatewayのパブリックIPを記載します)  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/dcf2283d-0619-b02a-0b18-19db9b27c86d.png)

# テスト
* ブラウザに ```http://user/``` と入力して、IISにアクセスできていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e505d450-edf8-401e-d0e9-f6ad5af899f0.png)

* 同様に ```http://maintenance/``` でも確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/78baeab2-c0f9-b2f8-4fb6-1e21f52d49fe.png)

# メンテナンスモードにしてみる
* 本題の以下構成が動作するか試してみます。通常ユーザーはSorryPageが表示されて、メンテナンスユーザーはアクセス可能ならOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f7c1beb5-0b80-9abf-6b72-c6d6e8635a65.png)

* Windows Server上でヘルスチェックファイル（通常ルート用）をリネームします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/973d0684-10be-614e-43a2-52c9b22c5381.png)

* しばらくして ```http://user/``` にアクセスし、SorryPageに飛べばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e60b6728-a0e7-502a-3865-ddcbc531fc3a.png)

* ```http://maintenance/``` へのアクセスは問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a9336240-7405-b2cd-0b50-449d05ca7e8a.png)

* バックエンド正常性も想定通りの動きをしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8825594b-4cf8-9a5e-9e86-c39f41eb63e0.png)

以上