대상 그룹에 대한 기능 단계적 롤아웃 사용

대상 지정은 개발자가 사용자 기반에 새로운 기능을 점진적으로 롤아웃할 수 있도록 하는 기능 관리 전략입니다. 이 전략은 대상 사용자로 알려진 사용자 집합을 대상으로 하는 개념을 기반으로 합니다. 대상 그룹은 특정 사용자, 그룹 및 전체 사용자 기반의 지정된 백분율로 구성됩니다.

  • 사용자는 실제 사용자 계정일 수 있지만 컴퓨터, 디바이스 또는 기능을 롤아웃하려는 고유하게 식별 가능한 엔터티일 수도 있습니다.

  • 그룹은 정의할 애플리케이션에 달려 있습니다. 예를 들어 사용자 계정을 대상으로 지정할 때 사용자 위치를 나타내는 Microsoft Entra 그룹 또는 그룹을 사용할 수 있습니다. 컴퓨터를 대상으로 지정할 때 롤아웃 단계에 따라 컴퓨터를 그룹화할 수 있습니다. 그룹은 대상 그룹을 분류하려는 모든 공통 특성일 수 있습니다.

이 문서에서는 Azure 앱 Configuration과 함께 ASP.NET Core 웹 애플리케이션에서 지정된 사용자 및 그룹에 TargetingFilter 새 기능을 롤아웃하는 방법을 알아봅니다.

필수 조건

인증 및 기능 플래그를 사용하여 웹 애플리케이션 만들기

이 섹션에서는 사용자가 로그인하고 이전에 만든 베타 기능 플래그를 사용할 수 있는 웹 애플리케이션을 만듭니다. 대부분의 단계는 빠른 시작에서 수행한 작업과 매우 유사합니다.

  1. 다음 명령을 사용하여 로컬 데이터베이스에 대해 인증하는 웹 애플리케이션을 만듭니다.

    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을 엽니다. 홈 및 개인 정보 탐색 모음 항목 사이에 새 <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의 메일 주소를 사용합니다. 등록 확인 화면에서 여기를 클릭하여 계정을 확인합니다.를 선택합니다.

  10. App Configuration에서 기능 플래그를 토글합니다. 이 작업이 탐색 모음에서 베타 항목의 표시 여부를 제어하는지 유효성을 검사합니다.

사용할 웹 애플리케이션 코드 업데이트 TargetingFilter

이 지점에서 기능 플래그를 사용하여 모든 사용자에 대해 Beta 기능을 사용하거나 사용하지 않도록 설정할 수 있습니다. 일부 사용자에 대해 기능 플래그를 사용하도록 설정하지만 다른 사용자에 대해 사용하지 않도록 설정하려면 TargetingFilter를 사용하도록 코드를 업데이트합니다. 이 예제에서는 로그인한 사용자의 전자 메일 주소를 사용자 ID로 사용하고 전자 메일 주소의 do기본 이름 부분을 그룹으로 사용합니다. 사용자 및 그룹을 에 추가합니다 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 이전 단계에서 만든 항목을 열고 기존 줄 TargetingFilterAddFeatureManagement뒤의 메서드를 호출 WithTargeting 하여 서비스 컬렉션에 추가 ExampleTargetingContextAccessor 합니다. 기능 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
    // ... ...
    

    참고 항목

    Blazor 애플리케이션의 경우 범위가 지정된 서비스로 기능 관리를 사용하도록 설정하기 위한 지침을 참조하세요.

TargetingFilter를 사용하도록 기능 플래그 업데이트

  1. Azure Portal에서 App Configuration 저장소로 이동하고 기능 관리자를 선택합니다.

  2. 빠른 시작에서 만든 ‘베타’ 기능 플래그의 상황에 맞는 메뉴를 선택합니다. 편집을 선택합니다.

    Edit Beta feature flag

  3. 편집 화면에서 기능 플래그 사용 확인란을 선택합니다(선택되어 있지 않은 경우). 그런 다음, 기능 필터 사용 확인란을 선택합니다.

  4. 생성 단추를 선택합니다.

  5. 필터 유형 드롭다운에서 대상 지정 필터를 선택합니다.

  6. 그룹별 재정의사용자별 재정의 확인란을 선택합니다.

  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으로 설정되므로 ‘베타’ 항목이 도구 모음에 표시되지 않습니다.

이제 등록할 때 설정한 암호를 사용하여 test@contoso.com으로 로그인합니다. test@contoso.com이 대상 사용자로 지정되므로 이제 ‘베타’ 항목이 도구 모음에 표시됩니다.

이제 등록할 때 설정한 암호를 사용하여 testuser@contoso.com으로 로그인합니다. testuser@contoso.com이 제외된 사용자로 지정되므로 도구 모음에 ‘베타’ 항목이 표시되지 않습니다.

다음 비디오는 이러한 동작을 보여 줍니다.

TargetingFilter in action

더 많은 사용자와 @contoso.com@contoso-xyz.com 전자 메일 주소를 만들어 그룹 설정의 동작을 확인할 수 있습니다.

전자 메일 주소가 있는 contoso-xyz.com 사용자에게 베타 항목이 표시되지 않습니다. @contoso.com 이메일 주소를 사용하는 사용자 중 50%에게는 ‘베타’ 항목이 표시되지만, 나머지 50%에게는 ‘베타’ 항목이 나타나지 않습니다.

다음 단계