前回の記事では、App Service の Virtual Network Integration と SQL Database の Private Endpoint を使用し、プライベートネットワーク経由で接続する構成を確認しました。
gooner.hateblo.jp
今回は、SQL Database の接続文字列を App Service の環境変数に直接登録するのではなく、Key Vault のシークレットを参照する構成に変更します。
システム構成
App Service から SQL Database へプライベートネットワークで接続する構成において、Private Endpoint を使用して Key Vault からシークレットを参照する方法について説明していきます。

前準備
前回の記事で用意したアプリケーションに対して、SQL Database の接続文字列を Key Vault から取得するように変更します。
Azure 環境では、Key Vault を構成プロバイダーとして登録することで、シークレットを IConfiguration 経由で参照できるようになります。
接続先の Key Vault の URL は、環境変数 KeyVaultUrl から取得し、認証には Managed Identity を使用します。
if (!builder.Environment.IsDevelopment()) { builder.Configuration.AddAzureKeyVault(new Uri(builder.Configuration["KeyVaultUrl"] ?? ""), new DefaultAzureCredential()); } builder.Services.AddDbContext<ShopDbContext>(options => options.UseSqlServer(builder.Configuration["ShopDbContext"] ?? throw new InvalidOperationException("Key Vault Secret 'ShopDbContext' not found.")));
なお、ローカルの開発環境では、appsettings.json ではなく、.NET Core のシークレット管理(secrets.json)を使用して、ShopDbContext の接続文字列を定義しています。
{ "ShopDbContext": "Server=(localdb)\\mssqllocaldb;Database=Shop;Trusted_Connection=True;MultipleActiveResultSets=true" }
Key Vault を作成する
まずは、Key Vault を作成して、IAM でシークレットを登録できるロール(Key Vault Secrets Officer)を自分に割り当てます。

シークレットに SQL Database の接続文字列を登録します。

App Service と Key Vault を Managed Identity で認証する
次に、App Service の環境変数に Key Vault の URL(https://xxx.vault.azure.net)を登録します。なお、前回の記事で登録した SQL Database の接続文字列は削除しておきます。

App Service の Settings - Identity から、Managed Identity を有効化します。

Key Vault の IAM から、シークレットを参照できるロール(Key Vault Secrets User)を App Service に割り当てます。

パブリックネットワークアクセスを有効にした Key Vault からシークレットを取得する構成で、アプリケーションが動作するようになりました。

Key Vault の Private Endpoint を作成する
最後に、Key Vault の Settings - Networking から Private Endpoint を作成します。
Private Endpoint は、仮想ネットワーク内のサブネットにプライベート IP アドレスを持つ Network Interface Card として実体化されます。この NIC が、Key Vault へのプライベートな接続口となります。

リソースの種類は Microsoft.KeyVault/vaults、対象サブリソースは vault を選択します。

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

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

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

App Service から Key Vault へプライベートネットワークで接続できるようになりました。

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

まとめ
App Service から SQL Database へプライベートネットワークで接続する構成において、Private Endpoint を利用して Key Vault からシークレットを参照するように変更しました。
次回は、このシステム構成で Application Insights に対しても、プライベートネットワーク経由で接続する構成に変更してみたいと思います。
gooner.hateblo.jp