チュートリアル: .NET バックグラウンド サービスで動的な構成を使用する

App Configuration からのデータは、.NET アプリケーションでアプリ設定として読み込むことができます。 詳細については、クイックスタートをご覧ください。 ただし、.NET の設計により、アプリ設定はアプリケーションの再起動時にのみ更新できます。 App Configuration .NET プロバイダーは、.NET Standard ライブラリです。 アプリケーションの再起動なしで、構成の動的なキャッシュと更新がサポートされます。 このチュートリアルでは、.NET バックグラウンド サービスに、動的構成の更新を実装する方法について説明します。

このチュートリアルでは、次の作業を行う方法について説明します。

  • App Configuration ストアへの変更に合わせて構成を更新するように .NET バックグラウンド サービスを設定する。
  • 最新の構成をバックグラウンド サービスに取り込む。

前提条件

キーと値を追加する

App Configuration ストアに次のキーと値を追加し、[ラベル][コンテンツのタイプ] を既定値のままにします。 Azure portal または CLI を使用してストアにキーと値を追加する方法の詳細については、キーと値の作成に関する記事を参照してください。

キー
TestApp:Settings:Message Azure App Configuration からのデータ

.NET バックグラウンド サービスを作成する

.NET コマンド ライン インターフェイス (CLI) を使用して、新しい .NET アプリ プロジェクトを作成します。 Visual Studio ではなく .NET CLI を使用する利点は、Windows、macOS、および Linux プラットフォームで使用できることです。 代わりに、Azure Cloud Shell で提供されているプレインストールのツールを使用します。

  1. プロジェクト用の新規フォルダーを作成します。

  2. 新しいフォルダーで次のコマンドを実行して、新しい .NET バックグラウンド サービス プロジェクトを作成します。

    dotnet new worker
    

App Configuration からデータを再度読み込む

  1. 次のコマンドを実行して、Microsoft.Extensions.Configuration.AzureAppConfiguration NuGet パッケージへの参照を追加します。

    dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
    
  2. 次のコマンドを実行して、プロジェクトのパッケージを復元します。

    dotnet restore
    
  3. Program.cs を開き、次のステートメントを追加します。

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    
  4. App Configuration に接続します。

    // Existing code in Program.cs
    // ... ...
    
    var builder = Host.CreateApplicationBuilder(args);
    
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
            // Load all keys that start with `TestApp:`.
            .Select("TestApp:*")
            // Configure to reload the key 'TestApp:Settings:Message' if it is modified.
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.Register("TestApp:Settings:Message");
            });
    
        // Register the refresher so that the Worker service can consume it through DI
        builder.Services.AddSingleton(options.GetRefresher());
    });
    
    // The rest of existing code in Program.cs
    // ... ...
    

    ConfigureRefresh メソッドでは、変更の監視のために App Configuration ストア内のキーが登録されます。 Register メソッドには、登録済みのキーが変更された場合にすべての構成値を更新するかどうかを示すために使用できる、省略可能なブール型パラメーター refreshAll があります。 この例では、キー TestApp:Settings:Message のみが更新されます。 更新のために登録されたすべての設定には、新しい更新が試行されるまでのキャッシュの有効期間として 30 秒の既定値があります。 これは AzureAppConfigurationRefreshOptions.SetCacheExpiration メソッドを呼び出すことで更新できます。

  5. Worker.cs を開きます。 IConfigurationIConfigurationRefresherWorker サービスに挿入し、App Configuration から構成データをログに記録します。

    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private readonly IConfiguration _configuration;
        private readonly IConfigurationRefresher _refresher;
    
        public Worker(ILogger<Worker> logger, IConfiguration configuration, IConfigurationRefresher refresher)
        {
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
            _refresher = refresher ?? throw new ArgumentNullException(nameof(refresher));
        }
    
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                // Intentionally not await TryRefreshAsync to avoid blocking the execution.
                _refresher.TryRefreshAsync(stoppingToken);
    
                if (_logger.IsEnabled(LogLevel.Information))
                {
                    _logger.LogInformation(_configuration["TestApp:Settings:Message"] ?? "No data.");
                }
    
                await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
            }
        }
    }
    

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

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

  1. ConnectionString という名前の環境変数に、App Configuration ストアへのアクセス キーを設定します。 コマンド ラインで次のコマンドを実行します。

    Windows コマンド プロンプトを使用してアプリをローカルでビルドして実行するには、次のコマンドを実行します。

    setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    変更を有効にするために、コマンド プロンプトを再起動します。 環境変数の値を出力して、正しく設定されていることを確認します。

  2. 次のコマンドを実行して、アプリをビルドします。

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

    dotnet run
    
  4. コンソールに以下の出力が表示されます。

    バックグラウンド サービスのスクリーンショット。

  5. Azure portal で、App Configuration ストアの [構成エクスプローラー] に移動し、次のキーの値を更新します。

    キー
    TestApp:Settings:Message Azure App Configuration からのデータ - 更新済み
  6. 更新間隔の時間枠が経過するまでしばらく待ちます。 変更されたコンソール出力が表示されます。

    更新されたバックグラウンド サービスのスクリーンショット。

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

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

重要

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

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

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

次のステップ

このチュートリアルでは、App Configuration から動的に構成設定を更新できるように .NET バックグラウンド サービスを設定しました。 ASP.NET Web アプリケーションで動的構成を有効にする方法については、次のチュートリアルに進んでください。

App Configuration へのアクセスを効率化する Azure マネージド ID を使用する方法については、次のチュートリアルに進んでください。