次の方法で共有


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

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

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

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

前提条件

キーと値を追加する

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

キー
TestApp:Settings:メッセージ 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. Microsoft Entra ID (推奨) または接続文字列を使って App Configuration に接続します。

    DefaultAzureCredential を使って、App Configuration ストアに対する認証を行います。 手順に従って、資格情報に App Configuration データ閲覧者ロールを割り当てます。 アプリケーションを実行する前に、アクセス許可が伝わるのに十分な時間をおいてください。

    // Existing code in Program.cs
    // ... ...
    
    var builder = Host.CreateApplicationBuilder(args);
    
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        string endpoint = Environment.GetEnvironmentVariable("Endpoint"); 
        options.Connect(new Uri(endpoint), new DefaultAzureCredential());
            // Load all keys that start with `TestApp:` and have no label.
            .Select("TestApp:*")
            // Reload configuration if any selected key-values have changed.
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.RegisterAll();
            });
    
        // 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 メソッド内では、RegisterAll メソッドを呼び出して、選択したキー値 (TestApp で始まりラベルのない値) の変更が検出されるたびに、構成全体を再読み込みするように App Configuration プロバイダーに指示します。 構成の変更の監視の詳細については、「 構成の更新のベスト プラクティス」を参照してください。

    ヒント

    refreshOptions.SetRefreshInterval メソッドの呼び出しを追加して、構成の更新間隔の最小時間を指定できます。 今回の例では既定の値である 30 秒を使用します。 App Configuration ストアに対する要求の数を減らす必要がある場合は、より大きな値に調整します。

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

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

  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. コンソールに以下の出力が表示されます。

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

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

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

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

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

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

重要

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

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

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

次のステップ

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

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