含まれているもの: ホスティング統合 —および—
Client 統合
Azure Key Vault は、シークレットを安全に格納してアクセスするためのクラウド サービスです。 .NET Aspire Azure Key Vault 統合により、Azure Key Vault アプリケーションから .NET インスタンスに接続できます。
ホスティング統合
Azure Key Vault ホスティング統合は、Key Vault リソースを AzureKeyVaultResource の種類としてモデル化します。 この種類とAPIにアクセスし、アプリホストプロジェクト内でそれらを表現するには、📦Aspire.Hosting.Azure.KeyVault NuGetパッケージをインストールしてください。
dotnet add package Aspire.Hosting.Azure.KeyVault
詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。
リソース Azure Key Vault を追加する
アプリ ホスト プロジェクトで、ビルダー インスタンスの AddAzureKeyVault を呼び出して、Azure Key Vault リソースを追加します。
var builder = DistributedApplication.CreateBuilder(args);
var keyVault = builder.AddAzureKeyVault("key-vault");
builder.AddProject<Projects.ExampleProject>()
.WithReference(keyVault);
// After adding all resources, run the app...
WithReference メソッドは、ExampleProject
という名前の "key-vault"
で接続を構成します。
重要
既定では、AddAzureKeyVault
は、Key Vault 管理者の組み込みロールを構成します。
ヒント
AddAzureKeyVaultを呼び出すと、暗黙的に AddAzureProvisioningが呼び出され、アプリの起動時に Azure リソースを動的に生成するためのサポートが追加されます。 アプリは、適切なサブスクリプションと場所を構成する必要があります。 詳細については、「ローカル プロビジョニング: 構成」を参照してください。
プロビジョニングによって生成されたBicep
Bicep を初めて使う場合、これは Azure リソースを定義するためのドメイン固有の言語です。 .NET .NET Aspireでは、Bicep を手動で記述する必要はありません。代わりに、プロビジョニング API によって Bicep が生成されます。 アプリを発行すると、生成された Bicep がマニフェスト ファイルと共に出力されます。 Azure Key Vault リソースを追加すると、次の Bicep が生成されます。
@description('The ___location for the resource(s) to be deployed.')
param ___location string = resourceGroup().___location
resource key_vault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: take('keyvault-${uniqueString(resourceGroup().id)}', 24)
___location: ___location
properties: {
tenantId: tenant().tenantId
sku: {
family: 'A'
name: 'standard'
}
enableRbacAuthorization: true
}
tags: {
'aspire-resource-name': 'key-vault'
}
}
output vaultUri string = key_vault.properties.vaultUri
output name string = key_vault.name
上記の Bicep は、 Azure Key Vault リソースをプロビジョニングするモジュールです。 さらに、ロールの割り当ては、別のモジュールで Azure リソースに対して作成されます。
@description('The ___location for the resource(s) to be deployed.')
param ___location string = resourceGroup().___location
param key_vault_outputs_name string
param principalType string
param principalId string
resource key_vault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
name: key_vault_outputs_name
}
resource key_vault_KeyVaultSecretsUser 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(key_vault.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4633458b-17de-408a-b874-0445c86b69e6'))
properties: {
principalId: principalId
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4633458b-17de-408a-b874-0445c86b69e6')
principalType: principalType
}
scope: key_vault
}
生成された Bicep は開始点であり、C# のプロビジョニング インフラストラクチャへの変更の影響を受ける。 Bicep ファイルのカスタマイズは直接上書きされるため、C# プロビジョニング API を通じて変更を加えて、生成されたファイルに反映されるようにします。
プロビジョニング インフラストラクチャをカスタマイズする
すべての .NET AspireAzure リソースは、AzureProvisioningResource 型のサブクラスです。 この型では、Azure API を使用して ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) リソースを構成する fluent API を提供することで、生成された Bicep をカスタマイズできます。 たとえば、sku
、RBAC
、tags
などを構成できます。 次の例では、Azure Key Vault リソースをカスタマイズする方法を示します。
builder.AddAzureKeyVault("key-vault")
.ConfigureInfrastructure(infra =>
{
var keyVault = infra.GetProvisionableResources()
.OfType<KeyVaultService>()
.Single();
keyVault.Properties.Sku = new()
{
Family = KeyVaultSkuFamily.A,
Name = KeyVaultSkuName.Premium,
};
keyVault.Properties.EnableRbacAuthorization = true;
keyVault.Tags.Add("ExampleKey", "Example value");
});
上記のコード:
-
ConfigureInfrastructure API への呼び出しを連鎖させます。
-
infra
パラメーターは、AzureResourceInfrastructure 型のインスタンスです。 - プロビジョニング可能なリソースは、GetProvisionableResources() メソッドを呼び出すことによって取得されます。
- 単一の KeyVaultService リソースが取得されます。
-
Sku
プロパティは、新しい KeyVaultSku インスタンスに設定されます。 -
KeyVaultProperties.EnableRbacAuthorization プロパティが
true
に設定されている。 -
ExampleKey
のキーと値がExample value
のタグがリソースに追加されます。
-
Key Vault リソースをカスタマイズするために使用できる構成オプションは他にも多数あります。 詳細については、「Azure.Provisioning.KeyVault と Azure」およびカスタマイズのプロビジョニングを参照してください。
既存の Azure Key Vault インスタンスに接続する
接続する既存の Azure AI Key Vault インスタンスがある場合があります。 呼び出しをチェーンして、AzureKeyVaultResource が既存のリソースであることを注釈付けることができます。
var builder = DistributedApplication.CreateBuilder(args);
var existingKeyVaultName = builder.AddParameter("existingKeyVaultName");
var existingKeyVaultResourceGroup = builder.AddParameter("existingKeyVaultResourceGroup");
var keyvault = builder.AddAzureKeyVault("ke-yvault")
.AsExisting(existingKeyVaultName, existingKeyVaultResourceGroup);
builder.AddProject<Projects.ExampleProject>()
.WithReference(keyvault);
// After adding all resources, run the app...
重要
RunAsExisting
、PublishAsExisting
、またはAsExisting
メソッドを呼び出して、Azure サブスクリプションに既に存在するリソースを操作する場合は、特定の構成値をアプリ ホストに追加して、.NET Aspireが見つけられるようにする必要があります。 必要な構成値には、 SubscriptionId、 AllowResourceGroupCreation、 ResourceGroup、 Location が含まれます。 設定しない場合は、 .NET.NET Aspire ダッシュボードに "構成がありません" エラーが表示されます。 設定方法の詳細については、「 構成」を参照してください。
Azure Key Vault リソースを既存のリソースとして扱う方法の詳細については、「既存のAzure リソースを使用する」を参照してください。
注釈
または、 Azure Key Vault リソースを表す代わりに、接続文字列をアプリ ホストに追加することもできます。 このアプローチは弱く型指定されており、ロールの割り当てやインフラストラクチャのカスタマイズでは機能しません。 詳細については、「Azureを使用して既存の リソースを追加する」を参照してください。
Client 統合
.NET Aspire Azure Key Vault クライアント統合を開始するには、クライアントが使用されるプロジェクト、つまり 📦 クライアントを使用するアプリケーションのプロジェクトに、Aspire NuGet パッケージをインストールします。
dotnet add package Aspire.Azure.Security.KeyVault
クライアント統合には、Azure Key Vaultからシークレットにアクセスする 2 つの方法が用意されています。
-
IConfiguration
またはIOptions<T>
パターンを使用して、アプリ構成にシークレットを追加します。 -
SecretClient
を使用して、必要に応じてシークレットを取得します。
構成にシークレットを追加する
クライアントを使用するプロジェクトの Program.cs ファイルで、AddAzureKeyVaultSecrets の IConfiguration 拡張メソッドを呼び出して、アプリの構成の一部としてシークレットを追加します。 このメソッドは、接続名パラメーターを受け取ります。
builder.Configuration.AddAzureKeyVaultSecrets(connectionName: "key-vault");
注釈
AddAzureKeyVaultSecrets
API 名は、少し混乱を引き起こしました。 このメソッドは、指定された接続名に基づいて SecretClient
を構成するために使用されますが、構成にシークレットを追加するためには 使用されません。
ヒント
connectionName
パラメーターは、アプリ ホスト プロジェクトに Azure Key Vault リソースを追加するときに使用する名前と一致する必要があります。 詳細については、「に Azure Key Vault リソースを追加する」を参照してください。
その後、通常の IConfiguration API を使用するか、オプション パターンを使用して厳密に型指定されたクラスにバインドすることによっても、シークレットベースの構成値を取得できます。 依存関係挿入コンテナーに登録されているサービス クラスの例からシークレットを取得するには、次のスニペットを検討してください。
インスタンス IConfiguration
取得する
public class ExampleService(IConfiguration configuration)
{
// Use configuration...
private string _secretValue = configuration["SecretKey"];
}
前の例では、依存関係の挿入用に IConfiguration
インスタンスも登録していることを前提としています。 詳細については、.NETにおけるの依存関係の挿入を参照してください。
インスタンス IOptions<T>
取得する
public class ExampleService(IOptions<SecretOptions> options)
{
// Use options...
private string _secretValue = options.Value.SecretKey;
}
前の例では、オプション パターンで使用する SecretOptions
クラスを構成していることを前提としています。 詳細については、「.NETのオプション パターン」を参照してください。
追加 AddAzureKeyVaultSecrets
API パラメーターは、必要に応じて次のシナリオで使用できます。
-
Action<AzureSecurityKeyVaultSettings>? configureSettings
: 一部またはすべてのオプションをインラインで設定します。 -
Action<SecretClientOptions>? configureClientOptions
: SecretClientOptions をインラインで設定します。 -
AzureKeyVaultConfigurationOptions? options
: AzureKeyVaultConfigurationOptions をインラインで構成します。
Azure シークレット クライアントを追加する
または、SecretClient を直接使用して、オンデマンドでシークレットを取得することもできます。 これには、少し異なる登録 API が必要です。
クライアントを使用するプロジェクトの Program.cs ファイルで、AddAzureKeyVaultClient インスタンスの IHostApplicationBuilder 拡張機能を呼び出して、依存関係挿入コンテナー経由で使用する SecretClient
を登録します。
builder.AddAzureKeyVaultClient(connectionName: "key-vault");
ヒント
connectionName
パラメーターは、アプリ ホスト プロジェクトに Azure Key Vault リソースを追加するときに使用する名前と一致する必要があります。 詳細については、「に Azure Key Vault リソースを追加する」を参照してください。
ビルダーに SecretClient
を追加した後、依存関係の挿入を使用して SecretClient インスタンスを取得できます。 たとえば、サンプル サービスからクライアントを取得するには、それをコンストラクター パラメーターとして定義し、ExampleService
クラスが依存関係挿入コンテナーに登録されていることを確認します。
public class ExampleService(SecretClient client)
{
// Use client...
}
依存関係の挿入に関する詳細については、.NET 依存関係の挿入を参照してください。
キー付き Azure Key Vault クライアントを追加する
接続名が異なる複数の SecretClient
インスタンスを登録する場合があります。 キー付き Azure Key Vault クライアントを登録するには、AddKeyedAzureKeyVaultClient メソッドを呼び出します。
builder.AddKeyedAzureKeyVaultClient(name: "feature-toggles");
builder.AddKeyedAzureKeyVaultClient(name: "admin-portal");
その後、依存関係の挿入を使用して SecretClient
インスタンスを取得できます。 たとえば、サービスの例からクライアントを取得するには、次のようにします。
public class ExampleService(
[FromKeyedServices("feature-toggles")] SecretClient featureTogglesClient,
[FromKeyedServices("admin-portal")] SecretClient adminPortalClient)
{
// Use clients...
}
キー付きサービスの詳細については、「.NET 依存関係の挿入: キー付きサービスの」を参照してください。
構成
.NET Aspire
Azure Key Vault 統合には、プロジェクトの要件と規則に基づいて SecretClient
を構成するための複数のオプションが用意されています。
構成プロバイダーを使用する
.NET Aspire
Azure Key Vault 統合では、Microsoft.Extensions.Configurationがサポートされます。
AzureSecurityKeyVaultSettings キーを使用して、appsettings.json またはその他の構成ファイルから Aspire:Azure:Security:KeyVault
を読み込みます。
{
"Aspire": {
"Azure": {
"Security": {
"KeyVault": {
"DisableHealthChecks": true,
"DisableTracing": false,
"ClientOptions": {
"Diagnostics": {
"ApplicationId": "myapp"
}
}
}
}
}
}
}
完全な Azure Key Vault クライアント統合 JSON スキーマについては、Aspireを参照してください。Azure.Security.KeyVault/ConfigurationSchema.json.
名前付き構成を使用する
.NET Aspire Azure Key Vault統合では、名前付き構成がサポートされています。これにより、同じリソースの種類の複数のインスタンスを異なる設定で構成できます。 名前付き構成では、メイン構成セクションのキーとして接続名が使用されます。
{
"Aspire": {
"Azure": {
"Security": {
"KeyVault": {
"vault1": {
"VaultUri": "https://myvault1.vault.azure.net/",
"DisableHealthChecks": true,
"ClientOptions": {
"Diagnostics": {
"ApplicationId": "myapp1"
}
}
},
"vault2": {
"VaultUri": "https://myvault2.vault.azure.net/",
"DisableTracing": true,
"ClientOptions": {
"Diagnostics": {
"ApplicationId": "myapp2"
}
}
}
}
}
}
}
}
この例では、vault1
を呼び出すときに、vault2
とAddAzureKeyVaultSecrets
の接続名を使用できます。
builder.AddAzureKeyVaultSecrets("vault1");
builder.AddAzureKeyVaultSecrets("vault2");
名前付き構成は、最上位レベルの構成よりも優先されます。 両方を指定すると、名前付き構成の設定が最上位の設定よりも優先されます。
Aspire:Azure:Security:KeyVault
ファイルの appsettings.json セクションで構成を設定した場合は、パラメーターを渡さずにメソッド AddAzureKeyVaultSecrets
を呼び出すことができます。
インライン デリゲートを使用する
Action<AzureSecurityKeyVaultSettings>
デリゲートを渡して、一部またはすべてのオプションをインラインで設定することもできます。たとえば、AzureSecurityKeyVaultSettings.VaultUriを設定します。
builder.AddAzureKeyVaultSecrets(
connectionName: "key-vault",
configureSettings: settings => settings.VaultUri = new Uri("KEY_VAULT_URI"));
SecretClientOptions メソッドの省略可能なパラメーターである Action<SecretClientOptions>
デリゲートを使用して、AddAzureKeyVaultSecrets
を設定することもできます。 たとえば、KeyClientOptions.DisableChallengeResourceVerification ID を設定してクライアントを識別するには、次のようにします。
builder.AddAzureKeyVaultSecrets(
connectionName: "key-vault",
configureClientOptions: options => options.DisableChallengeResourceVerification = true))
構成オプション
次の構成可能なオプションは、AzureSecurityKeyVaultSettings クラスを介して公開されます。
名前 | 説明 |
---|---|
AzureSecurityKeyVaultSettings.Credential | Azure Key Vaultに対する認証に使用される資格情報。 |
AzureSecurityKeyVaultSettings.DisableHealthChecks | Key Vault の正常性チェックが無効かどうかを示すブール値。 |
AzureSecurityKeyVaultSettings.DisableTracing | OpenTelemetry トレースが無効かどうかを示すブール値。 |
AzureSecurityKeyVaultSettings.VaultUri | クライアントが使用する保管庫へのURI。 Azure ポータルに "DNS 名" として表示されます。 |
Client 統合健康診断
既定では、.NET.NET Aspireクライアント統合 すべてのサービスで 正常性チェック 有効になっています。 同様に、多くの .NET.NET Aspireホスティング統合 もヘルスチェックエンドポイントを有効にします。 詳細については、以下を参照してください。
- アプリの正常性チェックを C# で
行う - ASP.NET Core における健康診断
.NET Aspire Azure Key Vault 統合には、次の正常性チェックが含まれています。
-
AzureKeyVaultSecretsHealthCheck
正常性チェックを追加します。これは、Key Vault に接続してクエリを実行しようとします。 -
/health
HTTP エンドポイントと統合します。このエンドポイントは、アプリがトラフィックを受け入れる準備ができていると見なされるために、登録されているすべての正常性チェックに合格する必要があります
可観測性とテレメトリ
伐採
.NET Aspire Azure Key Vault 統合では、次のログ カテゴリが使用されます。
Azure.Core
Azure.Identity
トレース
.NET Aspire Azure Key Vault 統合では、OpenTelemetryを使用して次のトレース アクティビティが出力されます。
Azure.Security.KeyVault.Secrets.SecretClient
メトリック
.NET Aspire Azure Key Vault 統合では現在、Azure SDK の制限により、既定ではメトリックがサポートされていません。
関連項目
.NET Aspire