クイック スタート:Azure Functions アプリに機能フラグを追加する

このクイックスタートでは、Azure Functions C# コード プロジェクトを作成し、その中で機能フラグを使用します。 Azure App Configuration の機能管理を使用して、すべての機能フラグを 1 か所に保存し、それらの状態を制御します。

.NET 機能管理ライブラリは、機能フラグのサポートにより、フレームワークを拡張します。 これらのライブラリは、.NET 構成システム上に構築されます。 .NET 構成プロバイダーを介して、App Configuration と統合されます。

Note

この記事では現在、.NET 6 で実行される C# インプロセス関数アプリ のみをサポートしています。

前提条件

機能フラグを追加する

Beta という機能フラグを App Configuration ストアに追加し、[ラベル][説明] を既定値のままにします。 Azure portal または CLI を使用してストアに機能フラグを追加する方法の詳細については、「機能フラグを作成する」を参照してください。

Beta という名前の機能フラグを有効にする

Functions プロジェクトを作成する

Visual Studio の Azure Functions プロジェクト テンプレートを使用すると、Azure の関数アプリに発行できる C# クラス ライブラリ プロジェクトを作成できます。 関数アプリを使用すると、リソースの管理、デプロイ、スケーリング、および共有を容易にするための論理ユニットとして関数をグループ化できます。

  1. Visual Studio メニューで、 [ファイル]>[新規]>[プロジェクト] を選択します。

  2. [新しいプロジェクトの作成] の検索ボックスに「functions」と入力し、Azure Functions テンプレートを選択してから、 [次へ] を選択します。

  3. [新しいプロジェクトの構成] で、プロジェクトのプロジェクト名を入力し、 [作成] を選択します。 関数アプリ名は、C# 名前空間として有効である必要があります。そのため、アンダースコア、ハイフン、その他の英数字以外の文字は使用しないでください。

  4. [新しい Azure Functions アプリケーションの作成] 設定で、次の表の値を使用します。

    設定 説明
    .NET のバージョン .NET 6 この値により、Azure Functions ランタイムのバージョン 4.x でインプロセスを実行する関数プロジェクトが作成されます。 詳細については、「Azure Functions ランタイム バージョンをターゲットにする方法」をご覧ください。
    関数テンプレート HTTP トリガー この値は、HTTP 要求によってトリガーされる関数を作成します。
    ストレージ アカウント (AzureWebJobsStorage) ストレージ エミュレーター Azure の関数アプリにはストレージ アカウントが必要であるため、プロジェクトを Azure に発行する際に割り当てられるか、作成されます。 HTTP トリガーによって、Azure Storage アカウントの接続文字列が使用されることはありません。その他のすべてのトリガーの種類には、有効な Azure Storage アカウントの接続文字列が必要です。
    承認レベル 匿名 作成される関数を、すべてのクライアントがキーを使用せずにトリガーできます。 この承認設定により、新しい関数のテストが容易になります。 キーと承認の詳細については、「承認キー」と HTTP と Webhook のバインドに関するページをご覧ください。

    Azure Functions プロジェクト設定のスクリーンショット


    [承認レベル][匿名] に設定していることを確認します。 関数の既定のレベルを選択した場合、関数エンドポイントにアクセスする要求で、関数キーを提示する必要があります。

  5. [作成] を選択して、関数プロジェクトと HTTP トリガー関数を作成します。

App Configuration ストアに接続する

このプロジェクトでは .NET Azure Functions で依存関係の挿入を使用します。 機能フラグが保存される追加の構成ソースとして Azure App Configuration が追加されます。

  1. プロジェクトを右クリックし、 [NuGet パッケージの管理] を選択します。 [参照] タブで以下の NuGet パッケージを検索し、自分のプロジェクトに追加します。

  2. 次のコードを使用して、新しいファイル Startup.cs を追加します。 これにより、FunctionsStartup 抽象クラスを実装する Startup という名前のクラスが定義されます。 アセンブリ属性は、Azure Functions の起動時に使われる型名を指定するために使用されます。

    using System;
    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.Configuration;
    using Microsoft.FeatureManagement;
    
    [assembly: FunctionsStartup(typeof(FunctionApp.Startup))]
    
    namespace FunctionApp
    {
        class Startup : FunctionsStartup
        {
            public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
            {
            }
    
            public override void Configure(IFunctionsHostBuilder builder)
            {
            }
        }
    }
    
  3. AddAzureAppConfiguration() を呼び出すことで、ConfigureAppConfiguration メソッドを更新し、Azure App Configuration プロバイダーを新しい構成ソースとして追加します。

    UseFeatureFlags() メソッドでは、機能フラグを読み込むようにプロバイダーに指示します。 すべての機能フラグには、変更を再確認するまでに 30 秒という既定のキャッシュ有効期限が設定されています。 有効期限の間隔は、UseFeatureFlags メソッドに渡される FeatureFlagsOptions.CacheExpirationInterval プロパティを設定することによって更新できます。

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                   .Select("_")
                   .UseFeatureFlags();
        });
    }
    

    ヒント

    機能フラグ以外の構成をアプリケーションに読み込む必要がない場合は、Select("_") を呼び出して、存在しないダミー キー "_" のみを読み込むことができます。 既定では、Select メソッドを呼び出さない場合、App Configuration ストア内のすべての構成キー値が読み込まれます。

  4. 依存関係の挿入を通じて Azure App Configuration サービスと機能マネージャーを利用できるように、Configure メソッドを更新します。

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

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

    依存関係の挿入によって、_featureManagerSnapshot および IConfigurationRefresherProvider のインスタンスを取得するために使用されるコンストラクターを追加します。 IConfigurationRefresherProvider からは、IConfigurationRefresher のインスタンスを取得できます。

    private readonly IFeatureManagerSnapshot _featureManagerSnapshot;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IFeatureManagerSnapshot featureManagerSnapshot, IConfigurationRefresherProvider refresherProvider)
    {
        _featureManagerSnapshot = featureManagerSnapshot;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  6. 表示されるメッセージの値が機能フラグの状態に応じて変化するように、Run メソッドを更新します。

    TryRefreshAsync メソッドは、機能フラグを更新する Functions 呼び出しの先頭で呼び出されます。 キャッシュの有効期限に達していなければ、何も実行されません。 現在の Functions 呼び出しをブロックせずに機能フラグを更新する場合は、await 演算子を削除してください。 その場合は、後続の Functions 呼び出しで、更新された値を取得します。

    [FunctionName("Function1")]
    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 message = await _featureManagerSnapshot.IsEnabledAsync("Beta")
                ? "The Feature Flag 'Beta' is turned ON"
                : "The Feature Flag 'Beta' is turned OFF";
    
        return (ActionResult)new OkObjectResult(message);
    }
    

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

  1. ConnectionString という名前の環境変数を設定します。先ほど App Configuration ストアの [アクセス キー] で取得した接続文字列がその値となります。 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 をブラウザーのアドレス バーに貼り付けます。 次の画像のように、機能フラグ Beta が無効であることを示す応答が表示されます。

    クイックスタート: 関数の機能フラグが無効

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

  6. [機能マネージャー] を選択し、Beta キーの状態を [オン] に変更します。

  7. ブラウザーを数回更新します。 更新間隔の時間枠が経過すると、次の画像に示すように、機能フラグ Beta がオンになっていることを示すようにページが変更されます。

    クイックスタート: 関数の機能フラグが有効

Note

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

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

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

重要

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

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

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

次のステップ

このクイックスタートでは、機能フラグを作成し、Azure Functions でその機能フラグを使用しました。

他の種類のアプリに対して機能管理機能を有効にするには、次のチュートリアルに進みます。

Azure App Configuration での機能フラグの管理の詳細については、次のチュートリアルに進んでください。

.NET 機能管理ライブラリの完全な機能の概要については、次のドキュメントに進んでください。