本記事は GitHub Copilot を活用して作成しています。
Azure App Service は Application Gateway と組み合わせることで、WAF (Web Application Firewall) 機能や負荷分散、SSL オフロードなどの高度なネットワーク機能を利用できます。しかし、その連携方法にはいくつかのパターンがあり、それぞれに特徴と実装上の注意点があります。
本記事では、Microsoft Learn の技術ドキュメントで紹介されている理論的な内容を踏まえ、実際の実装観点から各連携パターンを整理し、検証を通じて実装のポイントをまとめます。
Azure App Service と Application Gateway 連携の概要
Azure App Service と Application Gateway の連携には、主に以下の観点での選択肢があります:
1. App Service のネットワーク制限
- 制限をかけない: パブリックアクセスを維持
- サービスエンドポイント: 特定の仮想ネットワークからのアクセスのみ許可
- Private Endpoint: [オススメ] プライベート IP 経由でのアクセスのみ許可
2. カスタムドメインの取り扱い
- ホスト名の保持: [オススメ] Application Gateway でカスタムドメインを終端し、バックエンドに転送
- ホスト名の変更: Application Gateway で別のホスト名に変換してバックエンドに転送
3. セキュリティレイヤーの追加
- Azure Firewall の統合: [オススメ] より包括的なネットワークセキュリティの実現
- WAF の利用: [オススメ] アプリケーション層のセキュリティ強化
architecture-beta
group internet[Internet]
service client(internet)[Client] in internet
group azure[Azure]
group vnet(azure:virtual-networks)[Vnet] in azure
group subnet_agw(azure:subnet)[AGW Subnet] in vnet
service agw(azure:application-gateways)[Application Gateway] in subnet_agw
service firewall(azure:firewalls)[Azure Firewall] in vnet
group subnet(azure:subnet)[PE subnet] in vnet
service pe(azure:private-endpoints) in subnet
service waf(azure:web-application-firewall-policieswaf)[WAF] in azure
service appservice(azure:app-services)[App Service] in azure
service dns(azure:dns-zones)[Private DNS Zone] in azure
service log(azure:log-analytics-workspaces) in azure
client:R -- L:agw
agw:R -- L:firewall
firewall:R -- L:pe
pe:R -- L:appservice
agw:T -- B:waf
dns:T -- B:agw{group}
連携パターン別の比較
各連携パターンの特徴を整理します:
パターン | セキュリティレベル | 主な用途 |
---|---|---|
制限なし + Application Gateway | 低 | 開発・テスト環境 |
サービスエンドポイント + Application Gateway | 中 | 本番環境(簡易) |
Private Endpoint + Application Gateway | 高 | エンタープライズ環境 |
Azure Firewall + Private Endpoint + Application Gateway | 最高 | エンタープライズ環境 |
ざっくり手順
全体の作業フロー
以下の手順で Azure App Service と Application Gateway の各連携パターンを実装・検証していきます:
-
基本環境の準備
- リソースグループの作成
- 仮想ネットワーク(VNet)とサブネットの作成
- App Service Plan と App Service の作成
- Log Analytics ワークスペースの作成
-
パターン1: 制限なし + Application Gateway
- Application Gateway の作成と基本設定
- 接続テストの実行
-
パターン2: サービスエンドポイント + Application Gateway
- App Service のアクセス制限設定
- 接続テストの実行
-
パターン3: Private Endpoint + Application Gateway
- Private Endpoint の作成
- Private DNS Zone の設定
- Application Gateway バックエンド設定の更新
- 接続テストの実行
-
パターン4: Azure Firewall + Private Endpoint + Application Gateway
- Azure Firewall の作成
- ルートテーブルの設定
- ファイアウォールルールの設定
- 接続テストの実行
-
高度な設定
- カスタムドメインとホスト名保持の設定
- SSL/TLS 設定の最適化
0. 基本環境の準備
まず、検証に必要な基本リソースを作成します。
好きなようにカスタマイズしてください
0-1. リソースグループの作成
Azure Portal でリソースグループを作成します:
- Azure Portal(https://portal.azure.com)にサインイン
- 「リソースグループ」を検索して選択
- 「+ 作成」をクリック
- 以下の設定を入力:
- サブスクリプション: 使用するサブスクリプションを選択
- リソースグループ名:
rg-appgw-demo
- リージョン:
Southeast Asia
- 「確認および作成」→「作成」をクリック
0-2. 仮想ネットワークの作成
Application Gateway とプライベートエンドポイント用のサブネットを含む仮想ネットワークを作成します。
-
Azure Portal で「仮想ネットワーク」を検索して選択
-
「+ 作成」をクリック
-
基本設定タブで以下を入力:
- サブスクリプション: 作成したサブスクリプションを選択
- リソースグループ:
rg-appgw-demo
- 名前:
vnet-appgw-demo
- リージョン:
Southeast Asia
-
IP アドレスタブで以下を設定:
-
IPv4 アドレス空間:
10.0.0.0/16
-
+ サブネットの追加をクリックして以下のサブネットを作成:
Application Gateway 用サブネット:
- サブネット名:
subnet-appgw
- サブネット アドレス範囲:
10.0.1.0/24
Private Endpoint 用サブネット:
- サブネット名:
subnet-private-endpoint
- サブネット アドレス範囲:
10.0.2.0/24
- サブネット名:
-
-
「確認および作成」→「作成」をクリック

0-3. App Service Plan と App Service の作成
-
Azure Portal で「App Services」を検索して選択
-
「+ 作成」をクリック
-
基本設定タブで以下を入力:
- サブスクリプション: 使用するサブスクリプションを選択
- リソースグループ:
rg-appgw-demo
- 名前:
app-appgw-demo-20250601
(グローバルで一意な名前に変更してください) - 公開:
コード
- ランタイム スタック:
.NET 9
- オペレーティング システム:
Linux
- リージョン:
Southeast Asia
-
App Service プランセクションで:
- 「新規作成」を選択
- 名前:
plan-appgw-demo
- 価格レベル:
Premium v3 P0V3
を選択
-
「確認および作成」→「作成」をクリック

0-4. Log Analytics ワークスペースの作成
- Azure Portal で「Log Analytics ワークスペース」を検索して選択
- 「+ 作成」をクリック
- 以下の設定を入力:
- サブスクリプション: 使用するサブスクリプションを選択
- リソースグループ:
rg-appgw-demo
- 名前:
log-appgw-demo
- リージョン:
Southeast Asia
- 「確認および作成」→「作成」をクリック
これらのリソースのリソース ログを Log Analytics ワークスペースに送信するため、各リソースの「診断設定」を適切に構成してください
本記事では、記載はしていませんが実際は各リソースの診断設定を有効化しています
1. パターン1: 制限なし + Application Gateway
最もシンプルな連携パターンから始めます。このパターンでは App Service への直接アクセスも可能な状態で Application Gateway を経由したアクセスを実現します。
パターン1 の構成図
architecture-beta
group internet[Internet]
service client(internet)[Client] in internet
group azure[Azure]
service pip(azure:public-ip-addresses)[Public IP] in azure
group vnet(azure:virtual-networks)[Azure VNet] in azure
group subnet_agw(azure:subnet)[AGW Subnet] in vnet
service agw(azure:application-gateways)[Application Gateway] in subnet_agw
service webapp(azure:app-services)[Web App] in azure
service log(azure:log-analytics-workspaces) in azure
client:R -- L:pip
pip:R -- L:agw
agw:R -- L:webapp
1-1. Application Gateway の作成
-
Azure Portal で「Application Gateway」を検索して選択
-
「+ 作成」をクリック
-
基本設定タブで以下を入力:
- サブスクリプション: 使用するサブスクリプション
- リソースグループ:
rg-appgw-demo
- Application Gateway 名:
appgw-demo
- リージョン:
Southeast Asia
- レベル:
Standard V2
- 自動スケーリング: はい
- 仮想ネットワーク:
vnet-appgw-demo
- サブネット:
subnet-appgw
-
フロントエンドタブで:
- フロントエンド IP アドレスの種類:
パブリック
- パブリック IP アドレス:
pip-appgw-demo
を新規追加
- フロントエンド IP アドレスの種類:
-
バックエンドタブで:
- 「バックエンド プールの追加」をクリック
- 名前:
backend-appservice
- ターゲットの種類:
App Service
- ターゲット:
app-appgw-demo-20250601
(作成した App Service)
-
構成タブで:
- 「ルーティング規則の追加」をクリック
- 規則名:
rule-basic
- 優先度:
100
リスナーセクション:
- リスナー名:
listener-http
- フロントエンド IP:
パブリック
- プロトコル:
HTTP
- ポート:
80
バックエンド ターゲットセクション:
- ターゲットの種類:
バックエンド プール
- バックエンド ターゲット:
backend-appservice
- 「新規追加」をクリックして HTTP 設定を作成:
- HTTP 設定名:
http-settings-appservice
- バックエンド プロトコル:
HTTPS
- バックエンド サーバーの証明書は既知の CA によって発行されます :
はい
- 新しいホスト名をオーバーライドする:
はい
- ホスト名をオーバーライドする:
バックエンド ターゲットからホスト名を選択する
- HTTP 設定名:
-
タグタブ(オプション)
-
確認および作成→「作成」をクリック

1-2. 動作確認とテスト
Application Gateway の作成が完了したら、以下の手順で動作を確認します:
手順1: Application Gateway の IP アドレス確認
- Application Gateway のリソースページを開く
- 「概要」セクションでフロントエンド パブリック IP アドレスを確認
- IP アドレスをメモする(例:
20.78.xxx.xxx
)
手順2: Application Gateway 経由でのアクセステスト
- ブラウザで Application Gateway の IP アドレスにアクセス
- App Service のデフォルトページが表示されることを確認
手順3: 直接アクセステスト
- ブラウザで App Service の URL(
https://app-appgw-demo-20250601.azurewebsites.net
)に直接アクセス - 同じページが表示されることを確認(制限なしパターンなので直接アクセス可能)

2. パターン2: サービスエンドポイント + Application Gateway
次に、サービスエンドポイントを使用してApp Service へのアクセスを特定の仮想ネットワークに制限します。
パターン2 の構成図
図としてはパターン1 と同じですが、クライアントから Application Gateway へのアクセスが制限され、App Service への直接アクセスは拒否されるようになります。
architecture-beta
group internet[Internet]
service client(internet)[Client] in internet
group azure[Azure]
service pip(azure:public-ip-addresses)[Public IP] in azure
group vnet(azure:virtual-networks)[Azure VNet] in azure
group subnet_agw(azure:subnet)[AGW Subnet] in vnet
service agw(azure:application-gateways)[Application Gateway] in subnet_agw
service webapp(azure:app-services)[Web App] in azure
service log(azure:log-analytics-workspaces) in azure
client:R -- L:pip
pip:R -- L:agw
agw:R -- L:webapp
2-1. App Service のアクセス制限設定
- 作成した App Service のリソースページを開く
- 「ネットワーク」メニューを選択
- 「公衆ネットワーク アクセス」で「アクセス制限なしで有効」をクリック
- 公衆ネットワーク アクセスを「選択した仮想ネットワークと IP アドレスから有効」に設定
- サイトのアクセスとツールのメイン サイトタブで:
- 一致しないルールのアクション:
拒否
- 「+ 追加」をクリック
- 以下の設定を入力:
- 名前:
AllowApplicationGateway
- アクション:
許可
- 優先度:
100
- 種類:
仮想ネットワーク
- 仮想ネットワーク:
vnet-appgw-demo
- サブネット:
subnet-appgw
- 名前:
- 一致しないルールのアクション:
- 「規則の追加」をクリック

2-2. 動作確認とテスト
アクセス制限設定が完了したら、以下の手順で動作を確認します:
手順1: Application Gateway 経由でのアクセステスト
- ブラウザで Application Gateway の IP アドレスにアクセス
- App Service のページが正常に表示されることを確認
手順2: 直接アクセスの制限確認
- ブラウザで App Service の URL(
https://app-appgw-demo-20250601.azurewebsites.net
)に直接アクセス - HTTP 403 Forbidden エラーが表示されることを確認
- アクセス制限が正しく動作していることを確認

3. パターン3: Private Endpoint + Application Gateway
よりセキュアな Private Endpoint を使用した連携パターンを実装します。
パターン3 の構成図
architecture-beta
group internet[Internet]
service client(internet)[Client] in internet
group azure
group vnet(azure:virtual-networks)[Azure VNet] in azure
service pip(azure:public-ip-addresses)[Public IP] in azure
group subnet_agw(azure:subnet)[AGW Subnet] in vnet
service agw(azure:application-gateways)[Application Gateway] in subnet_agw
group subnet_pe(azure:subnet)[Private Endpoint Subnet] in vnet
service pe(azure:private-endpoints)[Private Endpoint] in subnet_pe
service dns(azure:dns-zones)[Private DNS Zone] in azure
service webapp(azure:app-services)[Web App] in azure
service log(azure:log-analytics-workspaces) in azure
client:R -- L:pip
pip:R -- L:agw
agw:R -- L:pe
pe:R -- L:webapp
dns:T -- B:agw{group}
3-1. App Service でのパブリックアクセス無効化
まず、App Service のパブリックアクセスを無効にします:
- App Service のリソースページを開く
- 「ネットワーク」メニューを選択
- 「公衆ネットワーク アクセス」のメニューをクリック
- 公衆ネットワーク アクセスを「無効」に設定
- 「保存」をクリック
3-2. Private Endpoint の作成
- App Service のリソースページを開く
- 「ネットワーク」メニューを選択
- 「プライベート エンドポイント」メニューをクリック
- 「+ 追加」> 「簡易」をクリック
- 以下の設定を入力:
-
- 名前:
pe-appservice-demo
- サブスクリプション: 使用するサブスクリプション
- リージョン:
Southeast Asia
- 仮想ネットワーク:
vnet-appgw-demo
- サブネット:
subnet-private-endpoint
- プライベート DNS 統合: 「はい」
- 名前:
- 「OK」をクリック
3-3. Private DNS Zone の設定確認
Private Endpoint 作成後、DNS 設定を確認します:
- リソースグループ内の「プライベート DNS ゾーン」リソースを開く
privatelink.azurewebsites.net
ゾーンを選択- 「レコード セット」で A レコードが自動作成されていることを確認
- 「仮想ネットワーク リンク」で
vnet-appgw-demo
がリンクされていることを確認

3-4. Application Gateway の再起動
Application Gateway では DNS 情報をキャッシュしています
今回 DNS 情報を更新したので、Application Gateway を再起動して新しい DNS 情報を取得させます
|
|
3-5. 動作確認とテスト
Private Endpoint 設定が完了したら、以下の手順で動作を確認します:
手順1: Application Gateway 経由でのアクセステスト
- ブラウザで Application Gateway の IP アドレスにアクセス
- App Service のページが正常に表示されることを確認
手順2: 直接アクセスの完全遮断確認
- ブラウザで App Service の URL に直接アクセス
- 接続エラーまたは HTTP 403 エラーが表示されることを確認

4. パターン4: Azure Firewall + Application Gateway
ゼロトラストアーキテクチャを実現するため、Azure Firewall を追加して包括的なネットワークセキュリティを実装します。
パターン4 の構成図
architecture-beta
group internet[Internet]
service client(internet)[Client] in internet
group azure[Azure]
service pip_agw(azure:public-ip-addresses)[AGW Public IP] in azure
service pip_fw(azure:public-ip-addresses)[Firewall Public IP] in azure
group vnet(azure:virtual-networks) in azure
group subnet_agw(azure:subnet)[AGW Subnet] in vnet
service agw(azure:application-gateways)[Application Gateway] in subnet_agw
group subnet_fw(azure:subnet)[Firewall Subnet] in vnet
service firewall(azure:firewalls)[Azure Firewall] in subnet_fw
group subnet_pe(azure:private-endpoints)[Private Endpoint Subnet] in vnet
service pe(azure:private-endpoints)[Private Endpoint] in subnet_pe
service udr(azure:route-tables)[Route Table] in azure
service dns(azure:dns-zones)[Private DNS Zone] in azure
service webapp(azure:app-services)[Web App] in azure
service log(azure:log-analytics-workspaces) in azure
client:R -- L:pip_agw
pip_agw:B -- T:agw
agw{group}:B -- T:udr
firewall:T -- B:pip_fw
agw:R -- L:firewall
firewall:R -- L:pe
pe:R -- L:webapp
dns:T -- B:firewall{group}
4-1. Azure Firewall 用サブネットの作成
- 仮想ネットワーク
vnet-appgw-demo
のリソースページを開く - 「サブネット」メニューを選択
- 「+ サブネット」をクリック
- 以下の設定を入力:
- 名前:
AzureFirewallSubnet
(この名前は固定) - サブネット アドレス範囲:
10.0.3.0/24
- 名前:
- 「保存」をクリック
4-2. Azure Firewall の作成
- Azure Portal で「Firewall」を検索して選択
- 「+ 作成」をクリック
- 以下の設定を入力:
- サブスクリプション: 使用するサブスクリプション
- リソースグループ:
rg-appgw-demo
- 名前:
fw-demo
- リージョン:
Southeast Asia
- Firewall レベル:
Premium
- Firewall 管理:
ファイアウォール ポリシーを使用してこのファイアウォールを管理する
- Firewall policy: (新規作成)
fw-policy-demo
- 仮想ネットワーク: (既存のものを選択)
vnet-appgw-demo
- パブリック IP アドレス: (新規作成)
pip-firewall-demo
- Enable Firewall Management NIC: チェックを外す
- 「確認および作成」→「作成」をクリック
4-3. ルートテーブルの作成と設定
Application Gateway からの通信を Azure Firewall 経由にルーティングします:
- Azure Portal で「ルート テーブル」を検索して選択
- 「+ 作成」をクリック
- 以下の設定を入力:
- サブスクリプション: 使用するサブスクリプション
- リソースグループ:
rg-appgw-demo
- リージョン:
Southeast Asia
- 名前:
rt-appgw-to-firewall
- 「確認および作成」→「作成」をクリック
- 作成後、ルートテーブルのリソースページを開く
- 「ルート」メニューで「+ 追加」をクリック
- 以下のルートを追加:
- ルート名:
RouteToFirewall
- 宛先の種類:
IP アドレス
- アドレス プレフィックス:
10.0.2.4/32
(Private Endpoint) - 次ホップの種類:
仮想アプライアンス
- 次ホップ アドレス: Azure Firewall のプライベート IP(例:
10.0.3.4
)
- ルート名:
- 「追加」をクリック
- 「サブネット」メニューで「関連付け」をクリック
- Application Gateway のサブネット(
subnet-appgw
)を選択して関連付け
4-4 動作確認とテスト01
ここまでの設定で、Application Gateway を経由した App Service へのアクセスは Azure Firewall を経由するようになります
Azure Firewall の動作を確認するため、以下の手順でテストを行います:
手順1: Application Gateway -> Azure Firewall 経由でのアクセステスト
ブラウザで Application Gateway の IP アドレスにアクセス
Azure Firewall は既定はすべてのトラフィックを拒否するためアクセスに失敗します

手順2: Azure Firewall のログ確認
- Azure Firewall のリソースページを開く
- 「ログ」メニューを選択
AZFWApplicationRule
テーブルでトラフィックが拒否されていることを確認

4-5. ファイアウォール ポリシーの設定
正常に接続ができるように Firewall Policy に許可ルールを指定します
Firewall Policy でアプリケーションルールを設定します:
-
作成した fw-policy-demo のリソースページを開く
-
「ルール」メニューを選択
-
アプリケーション ルール コレクションタブで「アプリケーション ルール コレクションの追加」をクリック
-
以下の設定を入力:
- 名前:
AllowAppService
- 優先度:
100
- アクション:
許可
ルールセクション:
- 名前:
AllowHTTPS
- 送信元の種類:
IP アドレス
- 送信元:
10.0.1.0/24
(Application Gateway サブネット) - プロトコル:
HTTPS:443
- ターゲットの種類:
FQDN
- ターゲット: App Service の FQDN(例:
app-appgw-demo-20250601.azurewebsites.net
)
- 名前:
-
「追加」をクリック
アプリケーション規則で許可する場合とネットワーク規則で許可する場合では Azure Firewall の NAT の挙動が異なります
ネットワーク規則を使用すると、Azure Firewall は Private Endpoint 宛てのトラフィックに対して SNAT を実行しません
そのため、Private Endpoint 宛てのトラフィックを検査する場合は、フローの対称性が失われる可能性があります
フローの対称性を維持するために、プライベート エンドポイント宛てのトラフィックを検査する場合は、ネットワーク ルールよりもアプリケーション ルールを使用することをお勧めします。 アプリケーション規則は、プライベート エンドポイント宛てのトラフィックを検査する場合に、ネットワーク規則よりも優先されます。これは、Azure Firewall では常にアプリケーション規則を使用してトラフィックの SNAT を実行するためです。 ネットワーク ルールが使用されている場合、または Azure Firewall の代わりに NVA が使用されている場合は、フローの対称性を維持するためにプライベート エンドポイント宛てのトラフィックに対して SNAT を構成する必要があります。
プライベート エンドポイント宛てのトラフィックを検査する Azure Firewall シナリオ - Azure Private Link | Microsoft Learn
4-6. 動作確認とテスト02
Azure Firewall の設定が完了したら、以下の手順で動作を確認します:
手順1: Application Gateway 経由でのアクセステスト
- ブラウザで Application Gateway の IP アドレスにアクセス
- Azure Firewall 経由で App Service にアクセスできることを確認
- 接続が成功することを確認
手順2: ファイアウォールログの確認
- Azure Firewall のリソースページを開く
- 「ログ」メニューを選択
- アプリケーションルールログでトラフィックが許可されていることを確認
手順3: ルーティングの確認
- Application Gateway の「バックエンドの正常性」を確認
- Azure Firewall 経由でもバックエンドプールが「正常」状態であることを確認

また Application Gateway の WAF 機能を有効化して、セキュリティポリシーを適用することも重要です
5. 各パターンの比較と接続テスト結果
ここまでで実装した4つのパターンについて、接続テストの結果を比較します:
パターン別接続テスト結果
テスト項目 | パターン1 (制限なし) |
パターン2 (サービスエンドポイント) |
パターン3 (Private Endpoint) |
パターン4 (+ Azure Firewall) |
---|---|---|---|---|
App GW 経由アクセス | ✅ 成功 | ✅ 成功 | ✅ 成功 | ✅ 成功 |
直接アクセス | ✅ 成功 | ❌ 403 Forbidden | ❌ 403 Forbidden | ❌ 403 Forbidden |
セキュリティレベル | 低 | 中 | 高 | 最高 |
6. カスタムドメインとホスト名保持の設定
ここまでは App Service と Application Gateway の基本的な連携を実装しました
本番環境ではカスタムドメインを使用してホスト名を保持することが一般的です
ホスト名を維持しないことで発生する問題については ホスト名の保持 - Azure Architecture Center | Microsoft Learn を見てください
以下の手順でカスタムドメインを設定し、Application Gateway 経由でもホスト名を保持する方法を説明します
今回はパターン 3 の構成でカスタムドメインを設定し、ホスト名を保持する方法を説明します
※1つ前の構成図から UDR をサブネットから削除すれば、パターン3 の構成図と同じになります
今回は下記の手順に従って App Service 証明書を使用してみます
Application Gateway のリスナーに Key Vault に格納された App Service 証明書を表示させる方法 - Japan PaaS Support Team Blog
パターン3 の構成図
architecture-beta
group internet[Internet]
service client(internet)[Client] in internet
group azure
group vnet(azure:virtual-networks)[Azure VNet] in azure
service pip(azure:public-ip-addresses)[Public IP] in azure
group subnet_agw(azure:subnet)[AGW Subnet] in vnet
service agw(azure:application-gateways)[Application Gateway] in subnet_agw
group subnet_pe(azure:subnet)[Private Endpoint Subnet] in vnet
service pe(azure:private-endpoints)[Private Endpoint] in subnet_pe
service dns(azure:dns-zones)[Private DNS Zone] in azure
service webapp(azure:app-services)[Web App] in azure
service log(azure:log-analytics-workspaces) in azure
client:R -- L:pip
pip:R -- L:agw
agw:R -- L:pe
pe:R -- L:webapp
dns:T -- B:agw{group}
6-1. App Service 証明書の準備
- Azure Portal で「App Service 証明書」を検索して選択
- 「+ 作成」をクリック
- 以下の設定を入力:
- サブスクリプション: 使用するサブスクリプション
- リソースグループ:
rg-appgw-demo
- 証明書の SKU:
Standard
- ドメイン名:
demo.example.com
(所有するドメインに変更) - 名前:
asc-demo
- 証明書の有効期間:
1 年
- 「確認および作成」→「作成」をクリック

- 証明書の作成が完了したら、証明書のリソースページを開きます
- [証明書の構成] に移動し手順を進めます。
詳細は App Service証明書を利用してApplication GatewayのHTTPSリスナーを構成する で書かれているのでポイントだけ記載
- App Service 証明書で使う Key Vault は Key Vault アクセス ポリシーのみがサポート されています
- ドメインの検証では TXT レコードを使った方法出実施しました

6-2. カスタムドメインの準備
App Service にカスタムドメインを追加します:
- App Service のリソースページを開く
- 「証明書」メニューを選択
- 「Bring Your Own Certificate」をクリック
- 「+ 追加」をクリック
- 以下の設定を入力:
- ソース:
App Service 証明書のインポート
- App Service 証明書:
asc-demo
(先ほど作成した証明書) - 証明書のフレンドリ名: 自動入力のまま
- ソース:
- 「検証」> 「追加」をクリック

- App Service の「カスタム ドメイン」メニューを選択
- 「+ カスタム ドメインの追加」をクリック
- 以下の設定を入力:
- ドメイン名:
demo.example.com
(所有するドメインに変更) - TLS または SSL 証明書:
後で証明書を追加
- 画面に従ってドメインの検証を実施
- 最終的に Application Gateway で接続するためには CNAME は不要ですが、段階的に動作確認をするため CNAME レコードも追加しておきます
- ドメイン名:
- 「検証」> 「追加」をクリック

この状態では証明書バインドがないので、設定します
- 作成したカスタム ドメインから [バインドの追加] をクリック
- 前の手順で作成している証明書を選択
これで App Service 側のカスタムドメインと証明書の設定が完了しました
6-3. App Service カスタムドメインの検証
App Service のカスタムドメインが正しく設定されているか確認します
- App Service のリソースページを開く
- ネットワークメニューを選択
- 公衆ネットワーク アクセスを許可する
- ブラウザで
https://demo.example.com
にアクセス - App Service のページが表示されることを確認

- 再び公衆ネットワークアクセスを無効に戻しておきます
6-3. Application Gateway のリスナーに App Service 証明書を設定
Application Gateway のリスナーに先ほど作成した App Service 証明書を設定します:
スクショ付きの設定がここに書かれているので省略します
Application Gateway のリスナーに Key Vault に格納された App Service 証明書を表示させる方法 - Japan PaaS Support Team Blog
6-4. Application Gateway の HTTP リスナーを設定
Application Gateway の HTTP リスナーを設定します:
- Application Gateway のリソースページを開く
- 「リスナー」メニューを選択
- 「+ 追加」をクリック
- 以下の設定を入力:
- 名前:
listener-demo
- フロントエンド IP:
パブリック
- プロトコル:
HTTPS
- ポート:
443
- 証明書の選択: 既存のものを選択(先ほど作成した App Service 証明書
asc-demo
を選択)
- 名前:

6-5. Application Gateway の バックエンド設定の作成
Application Gateway のバックエンド設定を作成します:
- Application Gateway のリソースページを開く
- 「バックエンド設定」メニューを選択
- 「+ 追加」をクリック
- 以下の設定を入力:
- 名前:
https-settings-demo
- プロトコル:
HTTPS
- ポート:
443
- バックエンドのホスト名をオーバーライドする:
いいえ
- 名前:

6-6. Application Gateway の ルーティング規則の設定
Https リスナーを使用してルーティング規則を設定します:
- Application Gateway のリソースページを開く
- 「ルール」メニューを選択
- 「+ ルーティング規則」をクリック
- 以下の設定を入力:
- 名前:
rule-demo
- 優先度:
90
- リスナー:
listener-demo
(先ほど作成したリスナー) - バックエンド プール:
backend-appservice
(App Service のバックエンドプールを選択) - バックエンド設定:
https-settings-demo
(先ほど作成した設定を選択)
- 名前:
6-7. Vnet 内での名前解決
ここまでで Application Gateway の設定が完了しました
しかし、Application Gateway から App Service へのアクセスには Private Endpoint を使用するため、VNet 内での名前解決が必要です
現在構成されているのは App Service の既定のドメインに対する Private DNS ゾーンです
これをカスタム ドメイン demo.example.com
に対しても設定する必要があります
graph TD
%% Azure VNet 内のリソースをサブネットごとにグループ化
subgraph VNet["Azure Virtual Network"]
%% AGW 用サブネット
subgraph Subnet_AGW["AGW Subnet"]
AGW["Application Gateway"]
end
%% Private Endpoint 用サブネット
subgraph Subnet_PE["Private Endpoint Subnet"]
PE["Private Endpoint"]
end
end
%% App Service(PaaS)は VNet 外部リソースとして記載
AppService["App Service"]
%% インターネットからのクライアント
Client["Client"]
%% 接続関係
Client --> AGW
AGW -- "Private IP への名前解決が必要" --> PE
PE --> AppService
%% スタイル設定
%% ネットワーク系: 緑
style VNet stroke:#2ecc40,stroke-width:2px
style Subnet_AGW stroke:#2ecc40,stroke-width:1.5px
style Subnet_PE stroke:#2ecc40,stroke-width:1.5px
style AGW fill:#2ecc40,color:#fff,stroke:#27ae60
style PE fill:#2ecc40,color:#fff,stroke:#27ae60
%% PaaS系: オレンジ
style AppService fill:#ff9800,color:#fff,stroke:#e65100
%% クライアント: グレー
style Client fill:#bdbdbd,color:#222,stroke:#757575
%% コメント
%% - AGW: フロントエンドでWAFやSSL終端を担当
%% - PE: App Service へのプライベートアクセスを提供
%% - App Service: バックエンドWebアプリ
- Azure Portal で「プライベート DNS ゾーン」を検索して選択
- 「+ ゾーンの作成」をクリック
- 以下の設定を入力:
- サブスクリプション: 使用するサブスクリプション
- リソースグループ:
rg-appgw-demo
- 名前:
example.com
(カスタムドメイン名のゾーン)
- 「作成」をクリック
- 作成後、ゾーンのリソースページを開く
- 「レコード セット」メニューを選択
- カスタムドメイン
demo.example.com
の A レコードを追加- 名前:
demo
- タイプ:
CNAME
- エイリアス: App Service の FQDN(例:
app-appgw-demo-20250601.azurewebsites.net
)
- 名前:
- 「保存」をクリック
- 「仮想ネットワーク リンク」メニューを選択
- 「+ リンクの追加」をクリック
- 以下の設定を入力:
- 名前:
vnet-appgw-demo-link
- 仮想ネットワーク:
vnet-appgw-demo
(Application Gateway が配置されている VNet)
- 名前:
- 「作成」をクリック
DNS の変更を行ったので Application Gateway を再起動しておきます
|
|

6-8. Application Gateway のフロントエンド IP にカスタムドメインを設定
Application Gateway のフロントエンド IP アドレスにカスタムドメインを設定します:
- 自分のカスタムドメインをホストしている DNS サービスにアクセスします
- Application Gateway のパブリック IP アドレスを A レコードとして追加します
- ホスト名:
demo
(カスタムドメインのサブドメイン) - タイプ:
A
- 値: Application Gateway のパブリック IP アドレス
- ホスト名:

この構成により、Vnet 外ではカスタム ドメイン demo.example.com
が Application Gateway のパブリック IP アドレスに解決されます
一方で、Vnet 内では Private DNS ゾーンにより demo.example.com
が App Service のプライベート IP アドレスに解決されます
このように、Vnet 内外で異なる解決先を持つことを DNS スプリットと呼ぶそうです
DNSスプリット(Split DNS)は、内部ネットワークと外部ネットワークからのリクエストに対して異なるDNS応答を提供する技術です。これにより、同じドメイン名に対して内部ユーザーには内部リソースを、外部ユーザーには公開リソースを提供することができます
例えば、社内のユーザーが「internal.example.com」にアクセスすると、内部サーバーのIPアドレスが返されますが、外部のユーザーが同じドメインにアクセスすると、公開されているウェブサーバーのIPアドレスが返されます。この方法は、ネットワークパフォーマンスの向上やセキュリティの強化に役立ちます
※Copilot の解説をそのまま引用しました
6-9. 動作確認
カスタムドメインの設定が完了したら、以下の手順で動作を確認します:
- ブラウザで
https://demo.example.com
にアクセス - Application Gateway を経由して App Service のページが表示されることを確認

まとめ
Azure App Service と Application Gateway の連携パターンを実装・検証しました
結果、以下のポイントが重要であることが分かりました:
- セキュリティ要件に応じたパターン選択: 開発環境では制限なし、本番環境では Private Endpoint を推奨
- ホスト名保持の重要性: Application Gateway でのホスト名保持設定により、アプリケーションの動作問題を回避
- DNS 設定の正確性: Private Endpoint 使用時は特に DNS 設定が重要
- 監視とログの整備: 各コンポーネントでの適切な監視設定により、問題の早期発見が可能
今回検証した内容により、理論的な知識だけでなく、実際の実装で遭遇する課題とその解決方法を明確にすることができました。
これらの情報が、Azure App Service と Application Gateway の連携を検討している方の参考になれば幸いです。
参考
- 仮想ネットワーク用の Azure Firewall と Application Gateway - Azure Architecture Center | Microsoft Learn
- Azure Firewall と Application Gateway を使用した Web アプリケーションのゼロトラスト ネットワーク - Azure Architecture Center | Microsoft Learn
- ホスト名の保持 - Azure Architecture Center | Microsoft Learn
- Application Gateway を使用して App Service をセキュリティで保護する | Microsoft Learn
- App Service のプライベート エンドポイント | Microsoft Learn
- App Service証明書を利用してApplication GatewayのHTTPSリスナーを構成する
- TLS/SSL を使用してドメインをセキュリティで保護する - Azure App Service | Microsoft Learn
- Application Gateway のリスナーに Key Vault に格納された App Service 証明書を表示させる方法 - Japan PaaS Support Team Blog