Azure Application Gateway + Azure App Service 構成で App Service 証明書を使う

2022.09.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Azure Application Gateway + Azure App Service でカスタムドメインを APp Service 証明書で行う機会がありました。
当初ササッと終わるかなと思っていたのですが意外に戸惑いました。
設定方法など残しておきたいと思います。

きっかけ

カスタムドメインなしで Application Gateway をフロントに、バックエンドに App Service という構成を検証していました。
カスタムドメインなしでデフォルト設定で Application Gateway を構成すると、App Serivice へ転送される Host ヘッダーの問題でヘルスチェックに失敗しました。

App Service はリクエストヘッダーでルーティングされており、デフォルト構成だと Application Gateway のホストヘッダーが転送されるので App Service に対してフロントエンド IP を使ってルーティングされてしまいます。
そのせいでヘルスチェックにも失敗していました。

こちら対処方法として、Application Gateway のバックエンド設定内にホスト名をオーバーライドする設定が用意されています。
こちらを有効化すると、Application Gateway から App Service へリクエストが送信される際にホストヘッダーが指定した内容のものになります。

以下の例では「hoge0908app.azurewebsites.net」になり、デフォルト状態で App Service 側でリクエストが処理出来るようになってヘルスチェックに成功しました。

ただし、この構成でホストヘッダーをオーバーライドさせる構成は運用環境のシナリオでは推奨されていないとのこと。
副作用として Cookie やリダイレクト URL などが正しく動作しなくなる場合があるようです。なるほど、たしかに。

ホストヘッダーをオーバーライドしない構成でカスタムドメインを使う

そこで、Application Gateway にカスタムドメインでリクエストし、ホスト情報を意地したままで App Service へ転送させるようにしてみます。
ドキュメント確認した限りでは多くの場合はこの構成になりそうですが Location ヘッダーを使うという回避策もあるようですので以下の記事を紹介します。

さて、同一のカスタムドメインを App Service と Application Gateway で使用するにあたり、SSL 証明書のことも気にする必要があります。
いくつか方法があるようですが、先程のドキュメントで推奨されている以下の構成を取ってみます。

Manage traffic to App Service - Azure Application Gateway | Microsoft Docs より引用

ここでは、証明書を Key Vault で管理し App Service と Application Gateway 双方から参照しているようです。
ここでは、App Service 証明書を使って試してみました。

上記ドキュメントのとおりなのですが、Application Gateway からマネージド ID で Key Vault へアクセスする部分が少し混乱しました。

このキーコンテナーは、マネージド ID へのアクセスを許可しません。

マネージド ID を介してキーコンテナーにアクセスするのですが、キーコンテナーの IAM ではなくてアクセスポリシーを設定する必要があります。

こちらに対象マネージド ID が登録されていない時にこのエラーメッセージが表示されます。

キーコンテナーには、シークレットに対する GET アクセス許可が必要です

アクセスポリシーの許可対象として、「シークレットの取得」が許可されている必要があります。

リスナー作成後にホスト名オーバーライドを無効化

HTTPS リスナーが無事作成出来たら、バックエンド設定のホスト名オーバーライドを無効化します。

ちなみに、ドキュメントによるとデフォルトプローブでも動作しますが、カスタムプローブを使うことが推奨されています。

It will work with the default probe but for correctness we recommend using a custom probe with the correct domain name.)
Manage traffic to App Service - Azure Application Gateway | Microsoft Docs

最後に DNS の名前解決先を Application Gateway のフロントエンド IP にします。

% curl https://www.azure.tak1wa.com/
hoge index

ヘルスチェックも問題なく、アクセス出来ました。

さいごに

本日は Azure Application Gateway + Azure App Service 構成で App Service 証明書を使ってみました。

マネージド ID 周りや App Service 証明書など Azure 固有の要素が多くて慣れてない私は少し手間取りました。
全体を見てみるとリバースプロキシへのリクエストと、そこからバックエンドへのリクエストそれぞれに対してホストヘッダーがどのように設定されているのかというだけではあるのですが、カスタムドメイン構成前後で対処方法が少し違うので通しで改めて検証出来て色々整理出来ました。