チュートリアル:Azure Functions アプリで動的な構成を使用する

App Configuration .NET 構成プロバイダーは、アプリケーションのアクティビティによって動的にもたらされる構成のキャッシュと更新をサポートします。 このチュートリアルでは、自分が作成するコードに、構成の動的更新を実装する方法について説明します。 これは、クイックスタートで紹介されている Azure Functions アプリに基づいています。 先に進む前に、Azure App Configuration を使用した Azure Functions アプリの作成を完了しておいてください。

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

  • App Configuration ストアへの変更に合わせて構成を更新するように Azure Functions アプリを設定する。
  • 最新の構成を Azure Functions の呼び出しに挿入する。

前提条件

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

Azure Functions では、インプロセスまたは分離プロセスの実行がサポートされています。 2 つのモード間にある App Configuration の使用方法の主な違いは、構成の更新方法です。 インプロセス モードで構成を更新するには、各関数内で呼び出しを行う必要があります。 分離プロセス モードでは、ミドルウェアがサポートされています。 App Configuration ミドルウェアの Microsoft.Azure.AppConfiguration.Functions.Worker を使うと、各関数の実行前に自動的に構成を更新する呼び出しが可能になります。

  1. App Configuration に接続するコードを更新し、データ更新条件を追加します。

    Startup.cs を開き、ConfigureAppConfiguration メソッドを更新します。

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                    // Load all keys that start with `TestApp:` and have no label
                    .Select("TestApp:*")
                    // Configure to reload configuration if the registered sentinel key is modified
                    .ConfigureRefresh(refreshOptions =>
                        refreshOptions.Register("TestApp:Settings:Sentinel", refreshAll: true));
        });
    }
    

    ConfigureRefresh メソッドを使って、アプリケーション内で更新がトリガーされるたびに変更を確認する設定を登録します。 refreshAll パラメーターが指定されているので、App Configuration プロバイダーは、登録された設定に変更が検出されるたびに構成全体をリロードします。

    更新のために登録されたすべての設定には、新しい更新が試行されるまでのキャッシュの有効期間として 30 秒の既定値があります。 これは AzureAppConfigurationRefreshOptions.SetCacheExpiration メソッドを呼び出すことで更新できます。

    ヒント

    App Configuration にあるキーと値の複数のペアを更新する際、すべての変更が済むまでは、アプリケーションに構成をリロードさせたくないのが普通でしょう。 Sentinel キーを登録し、その他の構成変更がすべて完了したときにだけ、そのキーを更新してください。 そうすることで、アプリケーション内の構成の一貫性を確保しやすくなります。

    不整合のリスクを最小化するために、次を行うこともできます。

    • 一時的な構成の不整合に対して許容できるようにアプリケーションを設計する
    • アプリケーションをオンラインにする (要求に応える) 前にウォームアップする
    • アプリケーションで既定の構成を準備しておき、構成の検証が失敗したときに使用する
    • トラフィックのタイミングを抑えるなど、アプリケーションへの影響を最小限にする構成更新戦略を選択します。
  1. 依存関係の挿入を通じて Azure App Configuration サービスを利用できるように Configure メソッドを更新します。

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddAzureAppConfiguration();
    }
    
  2. Function1.cs を開いて、次の名前空間を追加します。

    using System.Linq;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    

    IConfigurationRefresherProvider のインスタンスを依存関係の挿入を通じて取得し、そこから IConfigurationRefresher のインスタンスを取得できるように、コンストラクターを更新します。

    private readonly IConfiguration _configuration;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IConfiguration configuration, IConfigurationRefresherProvider refresherProvider)
    {
        _configuration = configuration;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  3. Run メソッドを更新し、Functions 呼び出しの最初に TryRefreshAsync メソッドを使用して構成を更新するよう伝えます。 キャッシュの有効期間に達していなければ、何も実行されません。 現在の Functions 呼び出しをブロックせずに構成を更新したい場合は、await オペレーターを削除してください。 その場合は、後続の Functions 呼び出しが、更新された値を取得するようになります。

    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        await _configurationRefresher.TryRefreshAsync(); 
    
        string keyName = "TestApp:Settings:Message";
        string message = _configuration[keyName];
    
        return message != null
            ? (ActionResult)new OkObjectResult(message)
            : new BadRequestObjectResult($"Please create a key-value with the key '{keyName}' in App Configuration.");
    }
    

関数をローカルでテストする

  1. ConnectionString という名前の環境変数に、アプリ構成ストアへのアクセス キーを設定します。 Windows コマンド プロンプトを使用する場合は、次のコマンドを実行してコマンド プロンプトを再起動し、変更が反映されるようにします。

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

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

    $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    

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

    export ConnectionString='connection-string-of-your-app-configuration-store'
    
  2. 関数をテストするには、F5 キーを押します。 メッセージが表示されたら、Visual Studio からの要求に同意し、Azure Functions Core (CLI) ツールをダウンロードしてインストールします。 また、ツールで HTTP 要求を処理できるように、ファイアウォールの例外を有効にすることが必要になる場合もあります。

  3. Azure Functions のランタイムの出力から、関数の URL をコピーします。

    クイック スタート: VS での関数のデバッグ

  4. HTTP 要求の URL をブラウザーのアドレス バーに貼り付けます。 関数によって返されたローカルの GET 要求に対するブラウザーでの応答を次の図に示します。

    クイック スタート: ローカル環境での関数の起動

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

  6. [構成エクスプローラー] を選択して次のキーの値を更新します。

    Key Value
    TestApp:Settings:Message Azure App Configuration からのデータ - 更新済み

    次に、Sentinel キーを作成するか、Sentinel キーが既に存在している場合は、その値を変更します。その例を次に示します。

    Key [値]
    TestApp:Settings:Sentinel v1
  7. ブラウザーを数回更新します。 30 秒後、キャッシュされた設定の有効期限が切れると、更新された値と共に、Functions 呼び出しの応答がページに表示されます。

    クイックスタート: ローカル環境での関数の更新

Note

このチュートリアルで使用したコード例は、App Configuration の GitHub リポジトリからダウンロードできます。

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

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

重要

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

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

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

次のステップ

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