対象ユーザーに対する機能の段階的なロールアウトを有効にする

対象設定は、開発者が新しい機能をユーザー ベースに段階的にロールアウトできるようにする機能管理戦略です。 この戦略は、対象ユーザーと呼ばれる一連のユーザーをターゲットにする概念に基づいて構築されています。 対象ユーザーは、特定のユーザー、グループ、およびユーザー ベース全体の指定された割合で構成されます。

  • ユーザーは実際のユーザー アカウントにすることができますが、コンピューター、デバイス、または機能をロールアウトする一意に識別可能なエンティティにすることもできます。

  • グループは、定義するアプリケーション次第です。 たとえば、ユーザー アカウントを対象とする場合は、Microsoft Entra グループまたはユーザーの場所を示すグループを使用できます。 コンピューターを対象とする場合は、ロールアウト ステージに基づいてグループ化できます。 グループは、対象ユーザーを分類する基準となる一般的な属性にすることができます。

この記事では、Azure App Configuration で TargetingFilter を使用して、ASP.NET Core Web アプリケーションの新しい機能を指定したユーザーとグループにロールアウトする方法について説明します。

前提条件

認証および機能フラグを使用して Web アプリケーションを作成する

このセクションでは、ユーザーがサインインし、前に作成された Beta 機能フラグを使用できるようにする Web アプリケーションを作成します。 ほとんどの手順は、クイック スタートで行ったこととよく似ています。

  1. 次のコマンドを使用して、ローカル データベースに対して認証を行う Web アプリケーションを作成します。

    dotnet new mvc --auth Individual -o TestFeatureFlags
    
  2. 次の NuGet パッケージへの参照を追加します。

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    
  3. App Configuration ストアの接続文字列を格納します。

    dotnet user-secrets init
    dotnet user-secrets set ConnectionStrings:AppConfig "<your_connection_string>"
    
  4. 次のコードを使用して Program.cs を更新します。

    // Existing code in Program.cs
    // ... ...
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Retrieve the App Config connection string
    string AppConfigConnectionString = builder.Configuration.GetConnectionString("AppConfig");
    
    // Load configuration from Azure App Configuration
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        options.Connect(AppConfigConnectionString);
        options.UseFeatureFlags();
    });
    
    // Add Azure App Configuration middleware to the container of services
    builder.Services.AddAzureAppConfiguration();
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement();
    
    // The rest of existing code in Program.cs
    // ... ...
    
    // Existing code in Program.cs
    // ... ...
    
    var app = builder.Build();
    
    // Use Azure App Configuration middleware for dynamic configuration refresh
    app.UseAzureAppConfiguration();
    
    // The rest of existing code in Program.cs
    // ... ...
    
  5. Views\Home ディレクトリの下に Beta.cshtml を追加し、次のマークアップで更新します。

    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  6. Controllers ディレクトリの下にある HomeController.cs を開き、次のコードで更新します。

    public IActionResult Beta()
    {
        return View();
    }
    
  7. _ViewImports.cshtmlを開き、@addTagHelper ディレクティブを使用して機能マネージャー タグ ヘルパーを登録します。

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  8. Views\Shared ディレクトリの _Layout.cshtml を開きます。 HomePrivacy navbar 項目の間に新しい <feature> タグを挿入します。

    <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
        <ul class="navbar-nav flex-grow-1">
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
            </li>
            <feature name="Beta">
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Beta">Beta</a>
                </li>
            </feature>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
            </li>
        </ul>
        <partial name="_LoginPartial" />
    </div>
    
  9. ビルドして実行します。 その後、右上隅にある [登録] リンクを選択して、新しいユーザー アカウントを作成します。 test@contoso.com のメール アドレスを使用します。 [Register Confirmation]\(登録の確認\) 画面で、 [Click here to confirm your account]\(ここをクリックしてアカウントを確認\) を選択します。

  10. App Configuration で機能フラグを切り替えます。 この操作によってナビゲーション バーの [Beta] 項目の表示が制御されることを確認します。

TargetingFilter を使用するように Web アプリケーション コードを更新する

この時点で、機能フラグを使用して、すべてのユーザーに対して Beta 機能を有効または無効にすることができます。 一部のユーザーに対して機能フラグを有効にし、他のユーザーに対して無効にするには、TargetingFilter を使用するようにコードを更新します。 この例では、サインイン ユーザーのメール アドレスをユーザー ID として使用し、メール アドレスのドメイン名部分をグループとして使用しています。 ユーザーとグループを TargetingContext に追加します。 TargetingFilter は、このコンテキストを使用して、要求ごとに機能フラグの状態を確認します。

  1. ExampleTargetingContextAccessor.cs ファイルを追加します。

    using Microsoft.AspNetCore.Http;
    using Microsoft.FeatureManagement.FeatureFilters;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace TestFeatureFlags
    {
        public class ExampleTargetingContextAccessor : ITargetingContextAccessor
        {
            private const string TargetingContextLookup = "ExampleTargetingContextAccessor.TargetingContext";
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public ExampleTargetingContextAccessor(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
            }
    
            public ValueTask<TargetingContext> GetContextAsync()
            {
                HttpContext httpContext = _httpContextAccessor.HttpContext;
                if (httpContext.Items.TryGetValue(TargetingContextLookup, out object value))
                {
                    return new ValueTask<TargetingContext>((TargetingContext)value);
                }
                List<string> groups = new List<string>();
                if (httpContext.User.Identity.Name != null)
                {
                    groups.Add(httpContext.User.Identity.Name.Split("@", StringSplitOptions.None)[1]);
                }
                TargetingContext targetingContext = new TargetingContext
                {
                    UserId = httpContext.User.Identity.Name,
                    Groups = groups
                };
                httpContext.Items[TargetingContextLookup] = targetingContext;
                return new ValueTask<TargetingContext>(targetingContext);
            }
        }
    }
    
  2. Program.cs を開き、既存の AddFeatureManagement 行の後に WithTargeting メソッドを呼び出して、サービス コレクションに前の手順で作成した ExampleTargetingContextAccessor、および TargetingFilter を追加します。 TargetingFilter では、ExampleTargetingContextAccessor を使用して、機能フラグが評価されるたびにターゲット コンテキストを決定します。

    // Existing code in Program.cs
    // ... ...
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement()
                    .WithTargeting<ExampleTargetingContextAccessor>();
    
    // The rest of existing code in Program.cs
    // ... ...
    

    Note

    Blazor アプリケーションの場合は、機能管理をスコープ付きサービスとして有効にする方法をご覧ください。

TargetingFilter を使用するように機能フラグを更新する

  1. Azure portal で、App Configuration ストアに移動し、 [機能マネージャー] を選択します。

  2. クイックスタートで作成した [Beta] 機能フラグのコンテキスト メニューを選択します。 [Edit]\(編集\) を選択します。

    Edit Beta feature flag

  3. [編集] 画面で、 [機能フラグを有効にする] チェックボックスがまだオンになっていない場合はオンにします。 次に、 [機能フィルターを使用する] チェックボックスをオンします。

  4. [作成] ボタンを選択します。

  5. フィルターの種類ドロップダウンで [Targeting filter] (ターゲット フィルター) を選択します。

  6. [Override by Groups] (グループによるオーバーライド)[Override by Users] (ユーザーによるオーバーライド) チェック ボックスをオンにします。

  7. 次のオプションを選択します。

    • 既定のパーセンテージ: 0
    • グループを含める: [名前] に「contoso.com」と入力し、[パーセンテージ] に「50」と入力します。
    • グループを除外する: contoso-xyz.com
    • ユーザーを含める: test@contoso.com
    • ユーザーを除外する: testuser@contoso.com

    機能フィルター画面はこのようになります。

    Conditional feature flag

    これらの設定により、次の動作が発生します。

    • この機能フラグは、ユーザー testuser@contoso.com に対して常に無効になります。これは、testuser@contoso.com[ユーザーを除外する] セクションにリストされているためです。
    • この機能フラグは、contoso-xyz.com のユーザーに対して常に無効になります。これは、contoso-xyz.com[グループを除外する] セクションにリストされているためです。
    • この機能フラグは、ユーザー test@contoso.com に対して常に有効になります。これは、test@contoso.com[ユーザーを含める] セクションにリストされているためです。
    • この機能フラグは、contoso.com グループ内のユーザーの 50% に対して有効になります。これは、contoso.com[グループを含める] セクションにリストされており、[パーセンテージ]50 に設定されているためです。
    • 機能は、他のすべてのユーザーに対して常に無効になります。これは、 [既定のパーセンテージ]0 に設定されているためです。
  8. [追加] を選択して、ターゲット フィルターを保存します。

  9. [適用] を選択してこれらの設定を保存し、 [機能マネージャー] 画面に戻ります。

  10. これで、機能フラグの [機能フィルター][ターゲット] として表示されるようになりました。 この状態は、[ターゲット] 機能フィルターによって適用される条件に基づいて、機能フラグが要求ごとに有効または無効になることを示します。

TargetingFilter の動作

この機能フラグの効果を確認するには、アプリケーションをビルドして実行します。 [既定のパーセンテージ] オプションが 0 に設定されているため、初期状態では [Beta] 項目はツールバーに表示されません。

次に、登録時に設定したパスワードを使用して test@contoso.com としてサインインします。 test@contoso.com がターゲット ユーザーとして指定されているため、 [Beta] 項目がツールバーに表示されるようになりました。

次に、登録時に設定したパスワードを使用して testuser@contoso.com としてサインインします。 "ベータ版" の項目は、ツール バーには表示されません。これは、testuser@contoso.com が除外ユーザーとして指定されているためです。

次のビデオでは、この動作を示します。

TargetingFilter in action

@contoso.com@contoso-xyz.com のメール アドレスを使用して追加のユーザーを作成し、グループ設定の動作を確認できます。

contoso-xyz.com のメール アドレスを持つユーザーには、"ベータ版" アイテムは表示されません。 @contoso.com のメール アドレスを持つユーザーの 50% には "ベータ版" アイテムが表示されますが、残りの 50% には "ベータ版" アイテムは表示されません。

次のステップ