Azure Front Door のパスベースルーティングを App Services で試してみる

便利で安心安全な CDN である Azure Front Door の `パスベースルーティング機能` を試してみたいと思います。詳細な技術仕様は以下のドキュメントの通り。
参考ドキュメント => [ルーティング規則に対する要求の照合方法](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-route-matching)

今回作成するイメージとしては、東日本と中央アメリカの WebApp をバックエンドで起動させ、`/japan` というパスがリクエストされたら東日本のリソースへアクセス、`/us` というパスがリクエストされたら中央アメリカのリソースにアクセスするというものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/591262a6-2836-e49d-8d95-250387add7e7.png)


ではさっそく作成していきましょう。

#バックエンドの App Services の準備
東日本、中央アメリカのそれぞれに App Services をデプロイします。プランは最小のもので問題ありません。今回は B1 プランで二つの App Services をデプロイしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/5e9acd4d-d477-fe04-1641-85907ba185c3.png)
このままではどちらにアクセスしたか分からないので、それぞれの App Services にアクセスした際のホーム画面で表示されるページに、`東日本の WebApp`、`US の webApp` と HTML ベースで追加します。Web App の標準機能である App Services Editor(プレビュー) を使用すると便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/40b38f6f-b20d-7180-6c67-4c7dcc1578ed.png)
少し雑ですが、まぁ分かればよいので、hoststarting.html の中に以下のようにテキストを追加します。US の方も同じように編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/ebc937a7-31fc-9134-68ac-a982dc794b8c.png)
そうすると WebApp にアクセスした際にどちらの WebApps にアクセスしているのかが表示でわかるようになります。東日本の WebApps にアクセスした場合はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8ab51c4d-8bc4-1c36-808b-a3ab9a952547.png)
これで App Services の準備は完了です！

#Azure Front Door でルールを追加する
それでは Azure Front Door でルールを追加していきましょう。Front Door を作成する際には、Front、BackEnd、ルール、の3つを指定して作成することができます。最初の Front は適当な名前、BackEnd には作成した二つのバックエンドプールをまず追加します。ルールは以下のように設定します。
`/japan` の Path の場合は東日本リージョンの App Services が含まれているプールにルーティングします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/9dd6377f-51ca-83e3-feda-9d850d6f8f16.png)

`/us` の Path の場合は US のリージョンの App Services が含まれているプールにルーティングします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/92f2c405-09b6-7869-3403-b45ad47fbe2f.png)

これでルールの設定は完了です。ではさっそく作成した `Front Door のフロントエンドアドレス/path` にアクセスしてみましょう！

#エラーが発生するので Web.config を作成する
ここまでやるとうまくいくのでは？と思うかもしれませんが、こんな感じのエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/551c237c-2735-4379-7f80-a29387d36969.png)
エラーメッセージはこんな感じです。

```
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
```

このエラーメッセージは App Services から返されているもので、調べるとこんな感じの回避策が見つかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/d8019700-0705-e766-cbf9-0315575a025b.png)
参考URL => [Error : The resource you are looking for has been removed, had its name changed, or is temporarily unavailable](https://stackoverflow.com/questions/38019874/error-the-resource-you-are-looking-for-has-been-removed-had-its-name-changed)

先ほどの App Services Editor で `web.config` をディレクトリに追加し、以下のようなコードを追加します。

```html
<configuration>
<system.webServer>
    <rewrite>
      <rules>
        <rule name="Main Rule" stopProcessing="true">
                <match url=".*" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="/" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
</configuration>
```

これでもう一度アクセスしてみると、リクエストをした方の正しいリージョンにルーティングされるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/be511953-1c12-f38d-20c5-9b83e7ac78a0.png)

正しくルーティングされました。通常の IIS などで作成したすでに Web.config が構成されているアプリケーションにアクセスする際にはこのような手順はいらないですが、ありものの App Services のページを使おうとする場合はこのような工夫が必要です。

#使ってみた感想
- GUI ベースでサクサクルールが作成できるし、変更したときの反映スピードも早いので汎用的に使いやすいと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/eee958c9-e074-5ce1-c116-388c49d80a7b.png)
- Region 内の ロードバランシングツールである Application Gateway だと編集画面で分かりやすい絵がでてきますが、Front Door だとないため、複雑なルールを設定する場合は少し使いにくいかなと思います。これは Application Gateway の画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/4c619869-87c1-bf45-1aa8-4998050e7cbe.png)
- 同じサブスクに含まれる App Services ならばプルダウン式に選択できるのは便利。ルーティングルールをさくっと作成できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/44bd5148-a99b-ffe2-9e55-bff84a91dc48.png)
- パスごとにどれくらいのアクセスがあったかは Log Analytics にメトリックを投げてそこでクエリをかける必要がありそう。過去の膨大なログを見るとなるとそれなりに保管するデータの課金がかかりそう。単純な Health 系のログはデフォルトで抽出可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8763531b-beac-fb28-7ca6-33909389bfdc.png)

全体的に使いやすいですし、WAF機能やキャッシュ機能も付いているので、グローバルに負荷分散させたいアプリケーションを作成する際のフロントエンドには是非たててみたいサービスかと思いました！