次の方法で共有


チュートリアル: .NET アプリで動的構成を使用する

App Configuration .NET プロバイダー ライブラリでは、アプリケーションを再起動することなく、必要に応じて構成を更新できます。 このチュートリアルでは、コードに動的構成の更新を実装する方法について説明します。 これは、クイック スタートで導入されたアプリに基づいています。 続行する前 に、App Configuration で .NET アプリの作成を 完了する必要があります。

このチュートリアルの手順は、任意のコード エディターを使用して実行できます。 推奨のエディターは Visual Studio Code です (Windows、macOS、および Linux プラットフォームで使用できます)。

このチュートリアルでは、以下の内容を学習します。

  • App Configuration ストアの変更に応じて構成を更新するように .NET アプリを設定します。
  • 最新の構成をアプリケーションで実行する。

[前提条件]

Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。

クイックスタート「 App Configuration を使用して .NET アプリを作成する」を完了します。

アクティビティドリブン構成の更新

Program.csを開き、次のコードでファイルを更新します。 Microsoft Entra ID (推奨) または接続文字列を使用して App Configuration に接続できます。 次のコード スニペットは、Microsoft Entra ID を使用する場合を示しています。

DefaultAzureCredential を使って、App Configuration ストアに対する認証を行います。 前提条件に記載されているクイックスタートを完了した際、既に App Configuration データ閲覧者ロールの資格情報を割り当てています。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
using Azure.Identity;

IConfiguration _configuration = null;
IConfigurationRefresher _refresher = null;

var builder = new ConfigurationBuilder();
builder.AddAzureAppConfiguration(options =>
{
    string endpoint = Environment.GetEnvironmentVariable("Endpoint"); 
    options.Connect(new Uri(endpoint), new DefaultAzureCredential())            
           // Load the key-value with key "TestApp:Settings:Message" and no label
           .Select("TestApp:Settings:Message")
           // Reload configuration if any selected key-values have changed.
           .ConfigureRefresh(refresh =>
           {
               refresh.RegisterAll()
                      .SetRefreshInterval(TimeSpan.FromSeconds(10));
           })

    _refresher = options.GetRefresher();
});

_configuration = builder.Build();

Console.WriteLine(_configuration["TestApp:Settings:Message"] ?? "Hello world!");

// Wait for the user to press Enter
Console.ReadLine();

if (_refresher != null)
{
    await _refresher.TryRefreshAsync();
    Console.WriteLine(_configuration["TestApp:Settings:Message"] ?? "Hello world!");

}

ConfigureRefresh メソッド内で、RegisterAll メソッドを呼び出して、選択したキー値の変更が検出されるたびに構成全体を再読み込みするように App Configuration プロバイダーに指示します (この場合は TestApp:Settings:Message のみ)。 構成の変更の監視の詳細については、「 構成の更新のベスト プラクティス」を参照してください。

SetRefreshInterval メソッドでは、構成の変更を確認するために新しい要求が App Configuration に対して行われるまでに経過する必要がある最小時間を指定します。 この例では、既定の有効期限である 30 秒をオーバーライドし、デモンストレーションの目的で代わりに 10 秒を指定しています。

ConfigureRefresh メソッドを単独で呼び出しても、構成は自動的に更新されません。 インターフェイス TryRefreshAsync から IConfigurationRefresher メソッドを呼び出して、更新をトリガーします。 この設計は、アプリケーションがアイドル状態の場合でも App Configuration に要求が送信されるのを回避することを目的としています。 アプリケーションをアクティブと見なす TryRefreshAsync 呼び出しを含める必要があります。 たとえば、受信メッセージ、注文、複雑なタスクの反復を処理するときなどです。 また、アプリケーションが常にアクティブである場合は、タイマー内に含めることができます。 この例では、Enter キーを押すたびに TryRefreshAsync を呼び出します。 何らかの理由で呼び出し TryRefreshAsync が失敗した場合でも、アプリケーションはキャッシュされた構成を引き続き使用します。 構成された更新間隔が経過し、 TryRefreshAsync 呼び出しがアプリケーション アクティビティによって再度トリガーされたときに、もう 1 つの試行が行われます。 TryRefreshAsyncの呼び出しは、構成された更新間隔が経過する前の no-op であるため、頻繁に呼び出される場合でも、パフォーマンスへの影響は最小限です。

依存関係の挿入を使用した構成の更新

前のコードでは、IConfigurationRefresherを呼び出すためにTryRefreshAsyncのインスタンスを手動で保存しています。 または、依存関係の挿入を使用してサービスを解決する場合は、次の手順を参照できます。

  1. AddAzureAppConfiguration 上で IServiceCollection を呼び出すことで、必要な App Configuration サービスを登録します。

    次のコードを Program.csに追加します。

    // Existing code in Program.cs
    // ... ...
    
    // Add Azure App Configuration services to IServiceCollection
    builder.Services.AddAzureAppConfiguration();
    
  2. サービス コレクションから IConfigurationRefresherProvider のインスタンスを解決し、各更新プログラムで TryRefreshAsync を呼び出して、構成を更新します。

    class SampleConfigRefresher
    {
        private readonly IEnumerable<IConfigurationRefresher> _refreshers = null;
    
        public SampleConfigRefresher(IConfigurationRefresherProvider refresherProvider)
        {
            _refreshers = refresherProvider.Refreshers;
        }
    
        public async Task RefreshConfiguration()
        {
            foreach (var refresher in _refreshers)
            {
                _ = refresher.TryRefreshAsync();
            }
        }
    }
    

アプリをビルドしてローカルで実行する

  1. Endpoint という名前の環境変数に、Azure portal でストアの [概要] にある App Configuration ストアのエンドポイントを設定します。

    Windows コマンド プロンプトを使用する場合は、次のコマンドを実行してコマンド プロンプトを再起動し、変更が反映されるようにします。

    setx Endpoint "<endpoint-of-your-app-configuration-store>"
    

    PowerShell を使用する場合は、次のコマンドを実行します。

    $Env:Endpoint = "<endpoint-of-your-app-configuration-store>"
    

    macOS または Linux を使用する場合は、次のコマンドを実行します。

    export Endpoint='<endpoint-of-your-app-configuration-store>'
    
  2. 次のコマンドを実行して、コンソール アプリをビルドします。

     dotnet build
    
  3. ビルドが正常に完了したら、次のコマンドを実行して、アプリをローカルで実行します。

     dotnet run
    

    クイック スタートのアプリ (ローカルで起動)

  4. Azure portal にサインインします。 [すべてのリソース] を選択し、クイックスタートで作成した App Configuration ストア インスタンスを選択します。

  5. 構成エクスプローラーを選択し、次のキーの値を更新します。

    価値
    TestApp:設定:メッセージ Azure App Configuration からのデータ - 更新済み
  6. Enter キーを押して更新をトリガーし、更新された値をコマンド プロンプトまたは PowerShell ウィンドウに出力します。

    クイック スタート アプリのローカル更新

    更新操作の構成を指定するときに、 SetRefreshInterval メソッドを使用して更新間隔を 10 秒に設定したので、構成設定の値は、その設定の最後の更新から少なくとも 10 秒が経過した場合にのみ更新されます。

ログ記録と監視

ログは構成の更新時に出力され、App Configuration ストアから取得されたキー値と、アプリケーションに加えられた構成変更に関する詳細情報を含んでいます。 ASP.NET Core アプリケーションがある場合は、 ASP.NET Core のログ記録と監視に関する以下の手順を参照してください。 それ以外の場合は、Azure SDK でのログ記録の手順を使用して ログ記録を有効にすることができます。

  • ログは、さまざまなイベント レベルで出力されます。 既定のレベルは Informational です。

    イベント レベル 説明
    詳細 ログには、アプリケーションが App Configuration ストアからの変更を監視するキーとキー値のラベルが含まれます。 この情報には、アプリケーションが既に読み込んだ内容と比較してキー値が変更されたかどうかも含まれます。 構成の変更が想定どおりに行われなかった場合にアプリケーションのトラブルシューティングを行うには、このレベルでログを有効にします。
    情報提供 ログには、構成の更新中に更新された構成設定のキーが含まれます。 機密データが漏洩しないように、構成設定の値はログから省略されます。 このレベルのログを監視して、アプリケーションが予想される構成変更を確実に取得できるようにします。
    警告 ログには、構成の更新中に発生したエラーと例外が含まれます。 構成プロバイダーはキャッシュされたデータを引き続き使用し、次回は構成を更新しようとするため、不定期な発生は無視してもかまいません。 このレベルでログを監視して、潜在的な問題を示す可能性のある繰り返し警告を確認できます。 たとえば、接続文字列をローテーションしたが、アプリケーションの更新を忘れたとします。

    次の例に示すように、Verbose パラメーターを指定することで、EventLevel.Verbose イベント レベルでログ記録を有効にすることができます。 これらの手順は、他のすべてのイベント レベルにも適用されます。 この例では、 Microsoft-Extensions-Configuration-AzureAppConfiguration-Refresh カテゴリに対してのみログを有効にします。

    using var listener = new AzureEventSourceListener((eventData, text) =>
    {
        if (eventData.EventSource.Name == "Microsoft-Extensions-Configuration-AzureAppConfiguration-Refresh")
        {
            Console.WriteLine("[{1}] {0}: {2}", eventData.EventSource.Name, eventData.Level, text);
        }
    }, EventLevel.Verbose);
    
  • ログ カテゴリは Microsoft-Extensions-Configuration-AzureAppConfiguration-Refresh です。これは各ログの前に表示されます。 各イベント レベルでのログの例を次に示します。

    [Verbose] Microsoft-Extensions-Configuration-AzureAppConfiguration-Refresh:
    Key-value read from App Configuration. Change:'Modified' Key:'ExampleKey' Label:'ExampleLabel' Endpoint:'https://examplestore.azconfig.io'
    
    [Informational] Microsoft-Extensions-Configuration-AzureAppConfiguration-Refresh:
    Setting updated. Key:'ExampleKey'
    
    [Warning] Microsoft-Extensions-Configuration-AzureAppConfiguration-Refresh:
    A refresh operation failed while resolving a Key Vault reference.
    Key vault error. ErrorCode:'SecretNotFound' Key:'ExampleKey' Label:'ExampleLabel' Etag:'6LaqgBQM9C_Do2XyZa2gAIfj_ArpT52-xWwDSLb2hDo' SecretIdentifier:'https://examplevault.vault.azure.net/secrets/ExampleSecret'
    

ログ記録は、次のいずれかのパッケージのバージョン 6.0.0 以降を使用している場合に利用できます。

  • Microsoft.Extensions.Configuration.AzureAppConfiguration
  • Microsoft.Azure.AppConfiguration.AspNetCore
  • Microsoft.Azure.AppConfiguration.Functions.Worker

リソースをクリーンアップする

この記事で作成したリソースを継続して使用しない場合は、ここで作成したリソース グループを削除して課金されないようにしてください。

重要

リソース グループを削除すると、元に戻すことができません。 リソース グループとそのすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 この記事のリソースを、保持したい他のリソースを含むリソース グループ内に作成した場合は、リソース グループを削除する代わりに、各リソースをそれぞれのペインから個別に削除します。

  1. Azure portal にサインインし、 [リソース グループ] を選択します。
  2. [名前でフィルター] ボックスにリソース グループの名前を入力します。
  3. 結果一覧でリソース グループ名を選択し、概要を表示します。
  4. [リソース グループの削除] を選択します。
  5. リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにリソース グループの名前を入力し、 [削除] を選択します。

しばらくすると、リソース グループとそのすべてのリソースが削除されます。

次のステップ

このチュートリアルでは、.NET アプリで App Configuration から構成設定を動的に更新できるようにしました。 App Configuration へのアクセスを効率化する Azure マネージド ID を使用する方法については、次のチュートリアルに進んでください。