JavaScriptを有効にしてください

Azure App Service と Application Gateway の連携パターンを整理し隊

 ·   23 分で読めます  ·   [Kento GitHub Copilot]

本記事は 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 の各連携パターンを実装・検証していきます:

  1. 基本環境の準備

    • リソースグループの作成
    • 仮想ネットワーク(VNet)とサブネットの作成
    • App Service Plan と App Service の作成
    • Log Analytics ワークスペースの作成
  2. パターン1: 制限なし + Application Gateway

    • Application Gateway の作成と基本設定
    • 接続テストの実行
  3. パターン2: サービスエンドポイント + Application Gateway

    • App Service のアクセス制限設定
    • 接続テストの実行
  4. パターン3: Private Endpoint + Application Gateway

    • Private Endpoint の作成
    • Private DNS Zone の設定
    • Application Gateway バックエンド設定の更新
    • 接続テストの実行
  5. パターン4: Azure Firewall + Private Endpoint + Application Gateway

    • Azure Firewall の作成
    • ルートテーブルの設定
    • ファイアウォールルールの設定
    • 接続テストの実行
  6. 高度な設定

    • カスタムドメインとホスト名保持の設定
    • SSL/TLS 設定の最適化

0. 基本環境の準備

まず、検証に必要な基本リソースを作成します。

下記の手順で紹介しているパラメーターはあくまでも、検証として使った値です
好きなようにカスタマイズしてください

0-1. リソースグループの作成

Azure Portal でリソースグループを作成します:

  1. Azure Portal(https://portal.azure.com)にサインイン
  2. 「リソースグループ」を検索して選択
  3. 「+ 作成」をクリック
  4. 以下の設定を入力:
    • サブスクリプション: 使用するサブスクリプションを選択
    • リソースグループ名: rg-appgw-demo
    • リージョン: Southeast Asia
  5. 「確認および作成」→「作成」をクリック

0-2. 仮想ネットワークの作成

Application Gateway とプライベートエンドポイント用のサブネットを含む仮想ネットワークを作成します。

  1. Azure Portal で「仮想ネットワーク」を検索して選択

  2. 「+ 作成」をクリック

  3. 基本設定タブで以下を入力:

    • サブスクリプション: 作成したサブスクリプションを選択
    • リソースグループ: rg-appgw-demo
    • 名前: vnet-appgw-demo
    • リージョン: Southeast Asia
  4. 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
  5. 「確認および作成」→「作成」をクリック

vnet_creation
仮想ネットワークの作成: Application Gateway と Private Endpoint 用のサブネットを含む VNet

0-3. App Service Plan と App Service の作成

  1. Azure Portal で「App Services」を検索して選択

  2. 「+ 作成」をクリック

  3. 基本設定タブで以下を入力:

    • サブスクリプション: 使用するサブスクリプションを選択
    • リソースグループ: rg-appgw-demo
    • 名前: app-appgw-demo-20250601 (グローバルで一意な名前に変更してください)
    • 公開: コード
    • ランタイム スタック: .NET 9
    • オペレーティング システム: Linux
    • リージョン: Southeast Asia
  4. App Service プランセクションで:

    • 「新規作成」を選択
    • 名前: plan-appgw-demo
    • 価格レベル: Premium v3 P0V3 を選択
  5. 「確認および作成」→「作成」をクリック

appservice_creation
App Service の作成: 基本的な App Service の作成完了

0-4. Log Analytics ワークスペースの作成

  1. Azure Portal で「Log Analytics ワークスペース」を検索して選択
  2. 「+ 作成」をクリック
  3. 以下の設定を入力:
    • サブスクリプション: 使用するサブスクリプションを選択
    • リソースグループ: rg-appgw-demo
    • 名前: log-appgw-demo
    • リージョン: Southeast Asia
  4. 「確認および作成」→「作成」をクリック
以降の手順でさまざまな Azure リソースを作成します
これらのリソースのリソース ログを 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 の作成

  1. Azure Portal で「Application Gateway」を検索して選択

  2. 「+ 作成」をクリック

  3. 基本設定タブで以下を入力:

    • サブスクリプション: 使用するサブスクリプション
    • リソースグループ: rg-appgw-demo
    • Application Gateway 名: appgw-demo
    • リージョン: Southeast Asia
    • レベル: Standard V2
    • 自動スケーリング: はい
    • 仮想ネットワーク: vnet-appgw-demo
    • サブネット: subnet-appgw
  4. フロントエンドタブで:

    • フロントエンド IP アドレスの種類: パブリック
    • パブリック IP アドレス: pip-appgw-demo を新規追加
  5. バックエンドタブで:

    • 「バックエンド プールの追加」をクリック
    • 名前: backend-appservice
    • ターゲットの種類: App Service
    • ターゲット: app-appgw-demo-20250601 (作成した App Service)
  6. 構成タブで:

    • 「ルーティング規則の追加」をクリック
    • 規則名: rule-basic
    • 優先度: 100

    リスナーセクション:

    • リスナー名: listener-http
    • フロントエンド IP: パブリック
    • プロトコル: HTTP
    • ポート: 80

    バックエンド ターゲットセクション:

    • ターゲットの種類: バックエンド プール
    • バックエンド ターゲット: backend-appservice
    • 「新規追加」をクリックして HTTP 設定を作成:
      • HTTP 設定名: http-settings-appservice
      • バックエンド プロトコル: HTTPS
      • バックエンド サーバーの証明書は既知の CA によって発行されます : はい
      • 新しいホスト名をオーバーライドする: はい
      • ホスト名をオーバーライドする: バックエンド ターゲットからホスト名を選択する
  7. タグタブ(オプション)

  8. 確認および作成→「作成」をクリック

appgw_basic
基本的な Application Gateway 設定: App Service をバックエンドとする Application Gateway

1-2. 動作確認とテスト

Application Gateway の作成が完了したら、以下の手順で動作を確認します:

手順1: Application Gateway の IP アドレス確認

  1. Application Gateway のリソースページを開く
  2. 「概要」セクションでフロントエンド パブリック IP アドレスを確認
  3. IP アドレスをメモする(例:20.78.xxx.xxx

手順2: Application Gateway 経由でのアクセステスト

  1. ブラウザで Application Gateway の IP アドレスにアクセス
  2. App Service のデフォルトページが表示されることを確認

手順3: 直接アクセステスト

  1. ブラウザで App Service の URL(https://app-appgw-demo-20250601.azurewebsites.net)に直接アクセス
  2. 同じページが表示されることを確認(制限なしパターンなので直接アクセス可能)
pattern1_test
パターン1の動作確認: Application Gateway 経由と直接アクセスの両方が成功

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 のアクセス制限設定

  1. 作成した App Service のリソースページを開く
  2. 「ネットワーク」メニューを選択
  3. 「公衆ネットワーク アクセス」で「アクセス制限なしで有効」をクリック
  4. 公衆ネットワーク アクセスを「選択した仮想ネットワークと IP アドレスから有効」に設定
  5. サイトのアクセスとツールメイン サイトタブで:
    • 一致しないルールのアクション: 拒否
    • 「+ 追加」をクリック
    • 以下の設定を入力:
      • 名前: AllowApplicationGateway
      • アクション: 許可
      • 優先度: 100
      • 種類: 仮想ネットワーク
      • 仮想ネットワーク: vnet-appgw-demo
      • サブネット: subnet-appgw
  6. 「規則の追加」をクリック
service_endpoint_config
サービスエンドポイントの設定: App Service のアクセス制限で特定サブネットのみを許可

2-2. 動作確認とテスト

アクセス制限設定が完了したら、以下の手順で動作を確認します:

手順1: Application Gateway 経由でのアクセステスト

  1. ブラウザで Application Gateway の IP アドレスにアクセス
  2. App Service のページが正常に表示されることを確認

手順2: 直接アクセスの制限確認

  1. ブラウザで App Service の URL(https://app-appgw-demo-20250601.azurewebsites.net)に直接アクセス
  2. HTTP 403 Forbidden エラーが表示されることを確認
  3. アクセス制限が正しく動作していることを確認
pattern2_test
パターン2の動作確認: Application Gateway 経由は成功、直接アクセスは拒否される

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 のパブリックアクセスを無効にします:

  1. App Service のリソースページを開く
  2. 「ネットワーク」メニューを選択
  3. 「公衆ネットワーク アクセス」のメニューをクリック
  4. 公衆ネットワーク アクセスを「無効」に設定
  5. 「保存」をクリック

3-2. Private Endpoint の作成

  1. App Service のリソースページを開く
  2. 「ネットワーク」メニューを選択
  3. 「プライベート エンドポイント」メニューをクリック
  4. 「+ 追加」> 「簡易」をクリック
  5. 以下の設定を入力:
    • 名前: pe-appservice-demo
    • サブスクリプション: 使用するサブスクリプション
    • リージョン: Southeast Asia
    • 仮想ネットワーク: vnet-appgw-demo
    • サブネット: subnet-private-endpoint
    • プライベート DNS 統合: 「はい」
  6. 「OK」をクリック

3-3. Private DNS Zone の設定確認

Private Endpoint 作成後、DNS 設定を確認します:

  1. リソースグループ内の「プライベート DNS ゾーン」リソースを開く
  2. privatelink.azurewebsites.net ゾーンを選択
  3. 「レコード セット」で A レコードが自動作成されていることを確認
  4. 「仮想ネットワーク リンク」で vnet-appgw-demo がリンクされていることを確認
private_endpoint_config
Private Endpoint の設定: App Service のネットワーク

3-4. Application Gateway の再起動

Application Gateway では DNS 情報をキャッシュしています
今回 DNS 情報を更新したので、Application Gateway を再起動して新しい DNS 情報を取得させます

1
2
az network application-gateway stop --resource-group rg-appgw-demo --name appgw-demo
az network application-gateway start --resource-group rg-appgw-demo --name appgw-demo

3-5. 動作確認とテスト

Private Endpoint 設定が完了したら、以下の手順で動作を確認します:

手順1: Application Gateway 経由でのアクセステスト

  1. ブラウザで Application Gateway の IP アドレスにアクセス
  2. App Service のページが正常に表示されることを確認

手順2: 直接アクセスの完全遮断確認

  1. ブラウザで App Service の URL に直接アクセス
  2. 接続エラーまたは HTTP 403 エラーが表示されることを確認
pattern3_test
パターン3の動作確認: Private Endpoint 経由でのみアクセス可能、直接アクセスは完全遮断

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 用サブネットの作成

  1. 仮想ネットワーク vnet-appgw-demo のリソースページを開く
  2. 「サブネット」メニューを選択
  3. 「+ サブネット」をクリック
  4. 以下の設定を入力:
    • 名前: AzureFirewallSubnet (この名前は固定)
    • サブネット アドレス範囲: 10.0.3.0/24
  5. 「保存」をクリック

4-2. Azure Firewall の作成

  1. Azure Portal で「Firewall」を検索して選択
  2. 「+ 作成」をクリック
  3. 以下の設定を入力:
    • サブスクリプション: 使用するサブスクリプション
    • リソースグループ: 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. 「確認および作成」→「作成」をクリック

4-3. ルートテーブルの作成と設定

Application Gateway からの通信を Azure Firewall 経由にルーティングします:

  1. Azure Portal で「ルート テーブル」を検索して選択
  2. 「+ 作成」をクリック
  3. 以下の設定を入力:
    • サブスクリプション: 使用するサブスクリプション
    • リソースグループ: rg-appgw-demo
    • リージョン: Southeast Asia
    • 名前: rt-appgw-to-firewall
  4. 「確認および作成」→「作成」をクリック
  5. 作成後、ルートテーブルのリソースページを開く
  6. 「ルート」メニューで「+ 追加」をクリック
  7. 以下のルートを追加:
    • ルート名: RouteToFirewall
    • 宛先の種類: IP アドレス
    • アドレス プレフィックス: 10.0.2.4/32 (Private Endpoint)
    • 次ホップの種類: 仮想アプライアンス
    • 次ホップ アドレス: Azure Firewall のプライベート IP(例:10.0.3.4
  8. 「追加」をクリック
  9. 「サブネット」メニューで「関連付け」をクリック
  10. 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 は既定はすべてのトラフィックを拒否するためアクセスに失敗します

pattern4_test01
パターン4の動作確認01: Application Gateway から Azure Firewall 経由でのアクセスは拒否される

手順2: Azure Firewall のログ確認

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

4-5. ファイアウォール ポリシーの設定

正常に接続ができるように Firewall Policy に許可ルールを指定します
Firewall Policy でアプリケーションルールを設定します:

  1. 作成した fw-policy-demo のリソースページを開く

  2. 「ルール」メニューを選択

  3. アプリケーション ルール コレクションタブで「アプリケーション ルール コレクションの追加」をクリック

  4. 以下の設定を入力:

    • 名前: AllowAppService
    • 優先度: 100
    • アクション: 許可

    ルールセクション:

    • 名前: AllowHTTPS
    • 送信元の種類: IP アドレス
    • 送信元: 10.0.1.0/24 (Application Gateway サブネット)
    • プロトコル: HTTPS:443
    • ターゲットの種類: FQDN
    • ターゲット: App Service の FQDN(例:app-appgw-demo-20250601.azurewebsites.net
  5. 「追加」をクリック

アプリケーション規則で許可する場合とネットワーク規則で許可する場合では 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 経由でのアクセステスト

  1. ブラウザで Application Gateway の IP アドレスにアクセス
  2. Azure Firewall 経由で App Service にアクセスできることを確認
  3. 接続が成功することを確認

手順2: ファイアウォールログの確認

  1. Azure Firewall のリソースページを開く
  2. 「ログ」メニューを選択
  3. アプリケーションルールログでトラフィックが許可されていることを確認

手順3: ルーティングの確認

  1. Application Gateway の「バックエンドの正常性」を確認
  2. Azure Firewall 経由でもバックエンドプールが「正常」状態であることを確認
pattern4_test
パターン4の動作確認: Azure Firewall + Application Gateway + Private Endpoint による多層セキュリティの動作確認
今回は省略しましたが、よりセキュアにするために Azure Firewall で IDPS や TLS の検査を有効化することをお勧めします
また 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 の構成図と同じになります

以降の手順では、カスタムドメインの SSL/TLS 証明書を使用します
今回は下記の手順に従って 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 証明書の準備

  1. Azure Portal で「App Service 証明書」を検索して選択
  2. 「+ 作成」をクリック
  3. 以下の設定を入力:
    • サブスクリプション: 使用するサブスクリプション
    • リソースグループ: rg-appgw-demo
    • 証明書の SKU: Standard
    • ドメイン名: demo.example.com (所有するドメインに変更)
    • 名前: asc-demo
    • 証明書の有効期間: 1 年
  4. 「確認および作成」→「作成」をクリック
app_service_certificate
App Service 証明書の作成: カスタムドメイン用の SSL/TLS 証明書を作成
  1. 証明書の作成が完了したら、証明書のリソースページを開きます
  2. [証明書の構成] に移動し手順を進めます。

詳細は App Service証明書を利用してApplication GatewayのHTTPSリスナーを構成する で書かれているのでポイントだけ記載

app_service_certificate_config
App Service 証明書の構成: 証明書の構成手順を進める

6-2. カスタムドメインの準備

App Service にカスタムドメインを追加します:

  1. App Service のリソースページを開く
  2. 「証明書」メニューを選択
  3. 「Bring Your Own Certificate」をクリック
  4. 「+ 追加」をクリック
  5. 以下の設定を入力:
    • ソース: App Service 証明書のインポート
    • App Service 証明書: asc-demo (先ほど作成した証明書)
    • 証明書のフレンドリ名: 自動入力のまま
  6. 「検証」> 「追加」をクリック
custom_domain_setup
カスタムドメインの設定: App Service に証明書を追加
  1. App Service の「カスタム ドメイン」メニューを選択
  2. 「+ カスタム ドメインの追加」をクリック
  3. 以下の設定を入力:
    • ドメイン名: demo.example.com (所有するドメインに変更)
    • TLS または SSL 証明書: 後で証明書を追加
    • 画面に従ってドメインの検証を実施
      • 最終的に Application Gateway で接続するためには CNAME は不要ですが、段階的に動作確認をするため CNAME レコードも追加しておきます
  4. 「検証」> 「追加」をクリック
custom_domain_validation
カスタムドメインの検証: カスタム ドメインの追加

この状態では証明書バインドがないので、設定します

  1. 作成したカスタム ドメインから [バインドの追加] をクリック
  2. 前の手順で作成している証明書を選択

これで App Service 側のカスタムドメインと証明書の設定が完了しました

custom_domain_binding
カスタムドメインのバインド: App Service にカスタムドメインと証明書をバインド

custom_domain_binding2
カスタムドメインのバインド完了: カスタムドメインのバインドが完了

6-3. App Service カスタムドメインの検証

App Service のカスタムドメインが正しく設定されているか確認します

  1. App Service のリソースページを開く
  2. ネットワークメニューを選択
  3. 公衆ネットワーク アクセスを許可する
  4. ブラウザで https://demo.example.com にアクセス
  5. App Service のページが表示されることを確認
custom_domain_test
カスタムドメインの動作確認: カスタムドメインで App Service にアクセスできることを確認
  1. 再び公衆ネットワークアクセスを無効に戻しておきます

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 リスナーを設定します:

  1. Application Gateway のリソースページを開く
  2. 「リスナー」メニューを選択
  3. 「+ 追加」をクリック
  4. 以下の設定を入力:
    • 名前: listener-demo
    • フロントエンド IP: パブリック
    • プロトコル: HTTPS
    • ポート: 443
    • 証明書の選択: 既存のものを選択(先ほど作成した App Service 証明書 asc-demo を選択)
https_listener_setup
HTTPS リスナーの設定: Application Gateway の HTTPS リスナーを設定

6-5. Application Gateway の バックエンド設定の作成

Application Gateway のバックエンド設定を作成します:

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

6-6. Application Gateway の ルーティング規則の設定

Https リスナーを使用してルーティング規則を設定します:

  1. Application Gateway のリソースページを開く
  2. 「ルール」メニューを選択
  3. 「+ ルーティング規則」をクリック
  4. 以下の設定を入力:
    • 名前: 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アプリ
  1. Azure Portal で「プライベート DNS ゾーン」を検索して選択
  2. 「+ ゾーンの作成」をクリック
  3. 以下の設定を入力:
    • サブスクリプション: 使用するサブスクリプション
    • リソースグループ: rg-appgw-demo
    • 名前: example.com (カスタムドメイン名のゾーン)
  4. 「作成」をクリック
  5. 作成後、ゾーンのリソースページを開く
  6. 「レコード セット」メニューを選択
  7. カスタムドメイン demo.example.com の A レコードを追加
    • 名前: demo
    • タイプ: CNAME
    • エイリアス: App Service の FQDN(例:app-appgw-demo-20250601.azurewebsites.net
  8. 「保存」をクリック
  9. 「仮想ネットワーク リンク」メニューを選択
  10. 「+ リンクの追加」をクリック
  11. 以下の設定を入力:
    • 名前: vnet-appgw-demo-link
    • 仮想ネットワーク: vnet-appgw-demo (Application Gateway が配置されている VNet)
  12. 「作成」をクリック

DNS の変更を行ったので Application Gateway を再起動しておきます

1
2
az network application-gateway stop --resource-group rg-appgw-demo --name appgw-demo
az network application-gateway start --resource-group rg-appgw-demo --name appgw-demo
private_dns_zone_setup
Private DNS ゾーンの設定: カスタムドメイン用の Private DNS ゾーンを設定

6-8. Application Gateway のフロントエンド IP にカスタムドメインを設定

Application Gateway のフロントエンド IP アドレスにカスタムドメインを設定します:

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

この構成により、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. 動作確認

カスタムドメインの設定が完了したら、以下の手順で動作を確認します:

  1. ブラウザで https://demo.example.com にアクセス
  2. Application Gateway を経由して App Service のページが表示されることを確認
custom_domain_test2
カスタムドメインの動作確認: カスタムドメインで Application Gateway 経由の App Service にアクセスできることを確認

まとめ

Azure App Service と Application Gateway の連携パターンを実装・検証しました
結果、以下のポイントが重要であることが分かりました:

  1. セキュリティ要件に応じたパターン選択: 開発環境では制限なし、本番環境では Private Endpoint を推奨
  2. ホスト名保持の重要性: Application Gateway でのホスト名保持設定により、アプリケーションの動作問題を回避
  3. DNS 設定の正確性: Private Endpoint 使用時は特に DNS 設定が重要
  4. 監視とログの整備: 各コンポーネントでの適切な監視設定により、問題の早期発見が可能

今回検証した内容により、理論的な知識だけでなく、実際の実装で遭遇する課題とその解決方法を明確にすることができました。
これらの情報が、Azure App Service と Application Gateway の連携を検討している方の参考になれば幸いです。

参考

共有

Kento
著者
[Kento GitHub Copilot]
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中