App Service から SQL Database へのアクセスを仮想ネットワーク内に制限したいという要件がある場合、Virtual Network Integration と Private Endpoint を利用することで、プライベートネットワーク経由で安全に接続することができます。
従来から提供されている機能ではありますが、本記事ではあらためて構築手順を整理してまとめました。
システム構成
App Service から SQL Database へプライベートネットワークで接続するシンプルな構成を例に、構成方法を説明します。

Virtual Network Integration
App Service から仮想ネットワーク内のリソースへのアクセスを制御する機能です。
learn.microsoft.com
Private Endpoint
SQL Database へのアクセスを仮想ネットワークの中からのみに限定する機能です。
learn.microsoft.com
前準備
ASP.NET Core を使用して、商品一覧を表示するアプリケーションを用意しました。Shop データベースの Product テーブルを参照し、MVC の View に一覧表示しています。
public class ProductsController : Controller { private readonly ShopDbContext _context; public ProductsController(ShopDbContext context) { _context = context; } public async Task<IActionResult> Index() { return View(await _context.Product.ToListAsync()); } }
ShopDbContext を Entity Framework Core の DI コンテナに登録し、データプロバイダーとして SQL Server を使用する構成としています。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<ShopDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ShopDbContext") ?? throw new InvalidOperationException("Connection string 'ShopDbContext' not found.")));
appsettings.json では、環境変数の ShopDbContext というキーから接続文字列を取得するように構成しています。
{ "ConnectionStrings": { "ShopDbContext": "Server=(localdb)\\mssqllocaldb;Database=Shop;Trusted_Connection=True;MultipleActiveResultSets=true" } }
パブリックネットワークアクセスを有効にした SQL Database に接続する構成で、App Service にデプロイしました。

SQL Database の接続文字列は、App Service の環境変数に登録しています。

Virtual Network を作成する
前置きが長くなりましたが、ここからが本題です。
まずは、仮想ネットワークを作成します。この際、Virtual Network Integration 用と Private Endpoint 用のサブネットもあわせて作成します。

Virtual Network Integration 用のサブネットは、他のリソース(Private Endpoint など)と共有できないことに注意してください。
SQL Database の Private Endpoint を作成する
次に、SQL Database の Security - Networking から Private Endpoint を作成します。
Private Endpoint は、仮想ネットワーク内のサブネットにプライベート IP アドレスを持つ Network Interface Card として実体化されます。この NIC が、SQL Database へのプライベートな接続口となります。

対象サブリソースは、sqlserver を選択します。

Private Endpoint 用に作成したサブネットを選択し、IP アドレスを動的に割り当てるようにします。

SQL Database の FQDN をプライベート IP アドレスに正しく名前解決させるため、Private DNS Zone を統合させます。

Private Endpoint を作成できたら、SQL Database の Security - Networking からパブリックネットワークアクセスを無効にします。

これにより、App Service から SQL Database へ接続できなくなりました。

App Service の Virtual Network Integration を構成する
最後に、App Service の Settings - Networking から Virtual Network Integration を構成します。これにより、App Service から仮想ネットワーク内のリソースへアウトバウンド通信が可能になります。

Virtual Network Integration 用に作成したサブネットを選択して接続します。

App Service から SQL Database へプライベートネットワークで接続できるようになりました。Virtual Network Integration はアウトバウンド通信の制御となりますので、インバウンド通信を制御したい場合には Private Endpoint を作成する必要があります。

App Service の Kudu から nslookup を実行すると、SQL Database の FQDN からプライベート IP アドレスが返されていることを確認できます。

まとめ
App Service の Virtual Network Integration と SQL Database の Private Endpoint を利用することで、プライベートネットワーク経由の接続を構成しました。
次回は、このシステム構成に Key Vault を追加してみたいと思います。






























