Azure SQL Database への Web アプリのプライベート接続

App Service
Private Link
SQL Database
Virtual Network
Web Apps

このシナリオ例では、完全にプライベートな接続を介して Web アプリをバックエンド データベースに安全に接続する方法について説明します。 このアーキテクチャにより、Azure App Service および Azure SQL Database 内の Web アプリからの通信は、仮想ネットワークのみを通過するようになります。

アーキテクチャ

Azure Private DNS ゾーンへの Private Link を使用して Virtual Network を通じてバックエンド Azure SQL Database に接続する App Service Web アプリを示すアーキテクチャ図。

このアーキテクチャの Visio ファイルをダウンロードします。

ワークフロー

  1. Web アプリは、Azure SQL データベースへの API 呼び出しを必要とする HTTP 要求をインターネットから受信します。

  2. App Service でホストされている Web アプリは、既定でインターネットでホストされているエンドポイントにのみアクセスできます。 ただし、リージョンでの仮想ネットワーク統合を設定すると、インターネットでホストされているエンドポイントではない仮想ネットワーク内のリソースへの Web アプリの送信アクセスが可能になります。 リージョンでのネットワーク統合では、AppSvcSubnet に仮想インターフェイスがマウントされます。

  3. Web アプリは、仮想ネットワークAppSvcSubnet にマウントされた仮想インターフェイスを介して仮想ネットワークに接続します。

  4. Azure Private Link は、Virtual Network の PrivateLinkSubnetAzure SQL データベースプライベート エンドポイントを設定します。

  5. Web アプリは、AppSvcSubnet の仮想インターフェイスを介して、Azure SQL Database の IP アドレスに対する送信 DNS クエリを送信します。 データベース DNS の CNAME は、DNS クエリをプライベート DNS ゾーンに送ります。 プライベート DNS ゾーンは、Azure SQL Database プライベート エンドポイントのプライベート IP アドレスを返します。

  6. Web アプリは、PrivateLinkSubnet のプライベート エンドポイントを通じて SQL Database に接続します。

  7. データベース ファイアウォールは、PrivateLinkSubnet から送信されるトラフィックのみの接続を許可します。 このデータベースは、パブリック インターネットからはアクセスできません。

Components

このシナリオでは、次の Azure サービスを使用します。

  • Azure App Service により Web アプリケーションがホストされ、自動スケーリングと高可用性が可能になります。インフラストラクチャの管理は不要です。

  • Azure SQL Database は、リレーショナル データ、空間データ、JSON、XML をサポートする汎用リレーショナル データベース マネージド サービスです。

  • Azure Virtual Network は、Azure 内のプライベート ネットワークの基本的な構成ブロックです。 仮想マシン (VM) などの Azure リソースを使用すると、Virtual Network 経由で、相互に、およびインターネットやオンプレミス ネットワークと安全に通信できます。

  • Azure Private Link は、Virtual Network にプライベート エンドポイントを提供して、Azure Storage や SQL Database またはカスタマー サービスやパートナーのサービスなどの Azure PaaS サービスに接続します。

  • Azure DNS は、信頼性が高くセキュリティで保護された DNS サービスを提供するプライベート DNS ゾーンをホストします。これにより、カスタムの DNS ソリューションの追加を必要とせずに、仮想ネットワークでドメイン名を管理および解決できます。

代替

アーキテクチャの代替手段

  • アーキテクチャ内の仮想ネットワークはトラフィックをルーティングするだけで、それ以外は空です。 他のサブネットとワークロードも仮想ネットワークで実行できます。
  • AppSvcSubnetPrivateLinkSubnet は、ハブとスポークのネットワーク構成の一部として、ピアリングされた別の Virtual Network に存在する可能性があります。
  • Web アプリは、Azure Functions アプリである可能性があります。 Azure Functions アプリは、Azure プライベート エンドポイントをサポートする任意の Azure サービスに接続できます。 Azure Functions アプリは、仮想ネットワークの統合をサポートする料金プランにデプロイする必要があります。
  • Web アプリや関数アプリは、別の Web アプリに接続できます。 App Service は、受信接続のプライベート エンドポイントをサポートしています。 たとえば、Web アプリや関数アプリは、Web サイトから別の Azure App Service インスタンスでホストされている REST API に接続できます。

サービスの代替手段

App Service EnvironmentAzure SQL Managed Instance をデータベース エンジンとして使用して、プライベート接続を提供できます。

  • App Service Environment と Azure SQL Managed Instance は、仮想ネットワーク内にネイティブにデプロイされます。
  • これらのサービスは、シングルテナントの分離デプロイなどの機能を提供するため、通常はコストが高くなります。
  • App Service Environment があるが SQL Managed Instance を使用していない場合、SQL Database へのプライベート接続に引き続きプライベート エンドポイントを使用できます。
  • SQL Managed Instance が既にあるがマルチテナント App Service を使用している場合、引き続きリージョン VNet 統合を使用して SQL Managed Instance プライベート アドレスに接続できます。

プライベート エンドポイントの代わりにサービス エンドポイントを使用して、データベースをセキュリティで保護することもできます。 Web アプリの送信トラフィックを仮想ネットワークにルーティングするには、リージョンでの仮想ネットワーク統合が必要です。

  • サービス エンドポイントを使用すると、AppSvcSubnet の仮想インターフェイスは、Azure のバックボーンを経由して API 呼び出しをルーティングします。 ソースは、仮想インターフェイスのプライベート IP アドレスです。 ターゲットは、Azure SQL Database サービス エンドポイントのパブリック IP です。 このルート パスにより、プライベート エンドポイントと PrivateLinkSubnet が不要になります。
  • サービス エンドポイントは、サービス全体を対象とします。 それに対して、プライベート エンドポイントは、特定のインスタンス (たとえば、SQL Server) にプライベートの専用 IP アドレスを提供します。 プライベート エンドポイントは、データ流出を防ぐのに役立ちます。 詳細については、「サービス エンドポイントとプライベート エンドポイントの比較」を参照してください。

ファイアウォールの代替手段

  • プライベート接続を使用しない場合は、指定された IP アドレス範囲からの受信トラフィックのみに制限するファイアウォール規則を追加できます。
  • サーバーへのアクセスを Azure サービスのみに許可することもできます。 ただし、許可されるトラフィックには、すべての Azure リージョンと他の顧客が含まれます。
  • より制限の厳しいファイアウォール規則を追加して、データベースへのアクセスを、アプリの送信 IP アドレスのみに許可することもできます。 ただし、App Service はマルチテナント サービスであり、IP アドレスは同じデプロイ スタンプにある他の顧客と共有されます。 この構成により、同じ送信 IP アドレスを使用する顧客からのトラフィックが許可されます。

シナリオの詳細

考えられるユース ケース

  • Azure App Service から Azure PaaS (サービスとしてのプラットフォーム) サービスへのプライベート接続。
  • Azure App Service から、(分離された Azure Virtual Networks にネイティブにデプロイされていない) Azure PaaS サービスへのプライベート接続。
  • Azure App Service から Azure Storage、Azure Cosmos DB、Azure Cognitive Search、Azure Event Grid、または受信接続で Azure プライベート エンドポイントをサポートするその他のサービスへの接続。

考慮事項

これらの考慮事項は、ワークロードの品質向上に使用できる一連の基本原則である Azure Well-Architected Framework の要素を組み込んでいます。 詳細については、「Microsoft Azure Well-Architected Framework」を参照してください。

以下では、このアーキテクチャに関するその他のセキュリティ、信頼性、コスト最適化に関する考慮事項について説明します。

セキュリティ

セキュリティは、重要なデータやシステムの意図的な攻撃や悪用に対する保証を提供します。 詳細については、「セキュリティの重要な要素の概要」を参照してください。

アーキテクチャは、App Service Web アプリからデータベースなどの下流依存関係へのセキュリティで保護された送信接続を作成します。 Web アプリへの受信接続をセキュリティで保護することもできます。 Application GatewayAzure Front Door のようなサービスをアプリのフロントに配置することにより、Web アプリの受信セキュリティが強化されます。 受信セキュリティをさらに強化するために、Azure Web Application Firewall を Application Gateway と Azure Front Door の両方に統合できます。

ユーザーがフロントエンド サービスをバイパスして Web アプリに直接アクセスできないようにするには、App Service のアクセス制限を設定できます。 シナリオ例については、「Application Gateway と App Service (マルチテナント)の統合」を参照してください。

DNS の構成

パブリック DNS (contoso.database.windows.net など) へのクエリをプライベート エンドポイントの IP アドレスに解決するには、構成の変更が必要です。 App Service でリージョンでの仮想ネットワーク統合を構成すると、アプリは仮想ネットワークの DNS サービス (リンクされたプライベート DNS ゾーンを含む) を使用して DNS クエリを解決します。 つまり、アプリはデータベース サーバーのホスト名のパブリック IP アドレスではなく、仮想ネットワーク内のプライベート エンドポイントの内部 IP アドレスを受け取るようになります。 このため、データベースへの Web アプリの送信トラフィックは、仮想ネットワーク経由でプライベートに送られます。

SQL データベースのファイアウォール

次の手順を使用して、他のユーザーがデータベースにアクセスできないようにファイアウォールを構成できます。

  1. ネットワーク セキュリティ グループ (NSG) を作成し、PrivateLinkSubnet にリンクします。 NSG を使用して、AppSvcSubnet からの受信トラフィックのみを許可します。 プライベート エンドポイントを含むサブネットでは、リンクが NSG に存在する前に、PrivateEndpointNetworkPolicies プロパティを有効にする必要があります。

  2. AppSvcSubnet からのトラフィックのみを許可する仮想ネットワーク規則を作成します。 AppSvcSubnet には Microsoft.Sql 用に構成されたサービス エンドポイントが必要であるため、データベースはそのサブネットからのトラフィックを識別できます。

  3. パブリック ネットワーク アクセスを拒否するように、ファイアウォールを構成します。 この構成では、他のすべてのファイアウォール規則がオフになり、データベースにはプライベート エンドポイント経由でのみアクセスできるようになります。

    • 最も安全な構成は、パブリック ネットワーク アクセスを拒否することです。
    • データベース アクセスは、プライベート エンドポイントをホストする仮想ネットワーク経由でのみ可能です。 データベースに接続するには、Web アプリ以外のものが Virtual Network に直接接続されている必要があります。
    • ローカル コンピューター上の SQL Server Management Studio (SSMS) からのデプロイまたは緊急の手動接続では、仮想ネットワークへの VPN または ExpressRoute 接続を使用する場合にのみ、データベースに接続できます。
    • また、仮想ネットワーク内の VM にリモート接続して、そこから SSMS を使用することもできます。
    • 例外的な状況では、パブリック ネットワークへのアクセスを一時的に許可し、他の構成オプションを使用してリスクを軽減することができます。

ログ記録と監視

Azure Private Link は Azure Monitor と統合されています。 統合により、データ フローを確認し、プライベート エンドポイントの接続のトラブルシューティングを実行できるようになります。

[信頼性]

Azure SQL Database のプライベート エンドポイントは、すべてのパブリック リージョンと政府機関向けのリージョンで利用できます。 プライベート エンドポイントの可用性 SLA は 99.99% です。 これは、ソリューション全体の複合 SLA を計算するときに考慮する必要があります。

グローバル ピアリング

仮想ネットワーク経由で接続できる任意の Azure リージョン内のサービスは、データベースのプライベート エンドポイントに到達できます。 たとえば、ハブ アンド スポーク トポロジの仮想ネットワーク ピアリングを使用すると、プライベート エンドポイントへの接続が可能になります。

App Service のリージョンでの仮想ネットワーク統合を使用する場合も同様です。 リージョンでの仮想ネットワーク統合は、App Service から別の Azure リージョン内のデータベースまたは他のプライベート エンドポイントへのリージョン間接続のためのソリューションです。 データベースへのプライベート接続を使用したマルチリージョン Web アプリを作成できます。 Web アプリまたはデータベースが別のリージョンにフェールオーバーする場合に、このマルチリージョン アーキテクチャは部分的なフェールオーバーをサポートします。

コスト最適化

コストの最適化とは、不要な費用を削減し、運用効率を向上させる方法を検討することです。 詳しくは、コスト最適化の柱の概要に関する記事をご覧ください。

Standard 以上のサポート対象価格レベルでは、App Service のリージョンでの仮想ネットワーク統合に追加料金は発生しません。 実稼働ワークロードには最低でも Standard をお勧めします。

プライベート エンドポイントには、時間料金に基づく関連コストと帯域幅に基づく割増金があります。

前述のすべてのサービスは、小規模なアプリケーション向けの妥当な既定値を使用して、Azure 料金計算ツールで事前構成されています。

ユース ケースについて価格の変化を確認するには、予想される使用量に合わせて該当する変数を変更します。

このシナリオのデプロイ

このソリューションをデプロイするには、Azure Portal または Azure Resource Manager (ARM) テンプレートを使用できます。

前提条件

  • Azure App Service Web アプリ
  • デプロイされた Azure SQL Database

Azure portal

  1. Azure portal で、アドレス範囲 10.1.0.0/16 を使用して仮想ネットワークを作成し、その中に次の 2 つのサブネットを作成します。

    • PrivateLinkSubnet: データベースのプライベート エンドポイントを公開するアドレス範囲 10.1.1.0/24
    • AppSvcSubnet: Web アプリのリージョンでの仮想ネットワーク統合用のアドレス範囲 10.1.2.0/24
  2. プライベート エンドポイントを作成するには、SQL Server に移動します。 左側のナビゲーションで、[セキュリティ][ネットワーク] を選択します。 ページの上部にある [プライベート アクセス] を選択します。 [プライベート エンドポイント接続] で、[プライベート エンドポイントを作成する] を選択します。

    プライベート エンドポイントの作成ページを表示する方法を示したスクリーンショット。

  3. 5 つの [プライベート エンドポイントを作成する] ページを移動して、PrivateLinkSubnet にプライベート エンドポイントを作成します。

    1. リソース グループを選択し、[基本] ページでプライベート エンドポイントに名前を付けます。 [リソース] ページで、[リソースの種類]Microsoft.Sql/servers であることと、[リソース] に正しい SQL Server が表示されていることを確認します。 [ターゲット サブリソース] には [sqlServer] を選択します。

      プライベート エンドポイントの作成ページのスクリーンショット。

    2. [仮想ネットワーク] ページで、作成する仮想ネットワークと [PrivateLinkSubnet] を選択します

      プライベート エンドポイントの仮想ネットワーク構成ページのスクリーンショット。

    3. [DNS] ページで、[プライベート DNS ゾーンと統合する] オプションに、[はい] を選択します。 選択すると、データベース サーバーのプライベート IP アドレスが privatelink.database.windows.net プライベート Azure DNS ゾーンに登録されます。

      プライベート エンドポイント構成ページのスクリーンショット。

  4. VNet 統合を有効にします

    1. Web アプリに移動します。 App Service の左側のナビゲーションで、[設定][ネットワーク] を選択します。

    2. [ネットワーク] ページの [Outbound Traffic] (送信トラフィック) セクションで、[VNet 統合] を選択します。

    3. [VNET 統合] ページで、 [VNet の追加] を選択します。

    4. [Add VNet Integration](VNet 統合の追加) ページの [仮想ネットワーク] で、ドロップダウンから該当する仮想ネットワークを選択します。 [サブネット][既存のものを選択] を選択します。 次に、[サブネット] ドロップダウンから [AppSvcSubnet] を選択します。 [OK] を選択します。

    [VNet 統合] ページに仮想ネットワーク構成の詳細が表示されるようになりました。

    Web アプリのリージョン VNet 統合を有効にする際のスクリーンショット。

    前に行ったように、App Service の [ネットワーク] ページを使用してリージョン VNet 統合を構成すると、Microsoft.Web に対するサブネットが自動的に委任されます。 App Service の [ネットワーク] ページを使用しない場合は、Microsoft.Webサブネットを手動で委任してください。

  5. 接続の検証 Web アプリケーションは、プライベート IP アドレスを使用してデータベースに接続できるようになったはずです。

    1. 接続を検証するには、データベース ファイアウォールを [パブリック ネットワーク アクセスの拒否] に設定して、プライベート エンドポイント経由でのみトラフィックが許可されることをテストします。
    2. SQL データベースの概要ページから、サーバー名 (contoso.database.windows.net など) をコピーします。
    3. App Service で、Web アプリを選択します。 左側のナビゲーションの [開発ツール] で、[コンソール] を選択します。
    4. nameresolver.exe ツールを使用してサーバー名が解決される IP アドレスを確認します。 構文は nameresolver.exe <Server name> です。
    5. 接続文字列内の SQL Database には、privatelink 固有のホスト名ではなく、contoso.database.windows.net など、通常のホスト名を使用してください。

    プライベート IP アドレスへの DNS の解決を確認するスクリーンショット。

ARM テンプレート

このシナリオより若干高度なものは、Azure Resource Manager のクイックスタート テンプレートとして入手できます。

このシナリオでは、Web アプリは、プライベート エンドポイント経由で SQL Database とストレージ アカウントの両方にアクセスします。 これらのエンドポイントは、App Service に統合された Virtual Network と異なる Virtual Network にあり、ピアリングされた Virtual Network 間でこのソリューションがどのように機能するかを示します。

1 つのVirtual Network 内のWeb アプリがピアリングされた Virtual Network 内の SQL Database とストレージ アカウントの両方にアクセスする、クイックスタート テンプレート ソリューション アーキテクチャを示すアーキテクチャ図。

次のステップ

製品ドキュメント:

Learn モジュール: