다음을 통해 공유


빠른 시작: Azure Functions 앱에 기능 플래그 추가

이 빠른 시작에서는 Azure Functions C# 코드 프로젝트를 만들고 그 안에 Functions 플래그를 사용합니다. Azure App Configuration의 기능 관리를 사용하여 중앙에서 모든 기능 플래그를 저장하고 상태를 제어합니다.

.NET 기능 관리 라이브러리는 기능 플래그 지원을 통해 프레임워크를 확장합니다. 이 라이브러리는 .NET 구성 시스템을 기반으로 빌드됩니다. 해당 .NET 구성 공급자를 통해 App Configuration과 통합됩니다.

참고 항목

이 문서는 현재 .NET 6에서 실행되는 C# In-Process 함수 앱만 지원합니다.

필수 조건

기능 플래그 추가

App Configuration 저장소에 베타라는 기능 플래그를 추가하고 레이블설명을 기본값으로 둡니다. Azure Portal 또는 CLI를 사용하여 저장소에 기능 플래그를 추가하는 방법에 대한 자세한 내용은 기능 플래그 만들기로 이동하세요.

Beta라는 기능 플래그 사용

Functions 프로젝트 만들기

Visual Studio의 Azure Functions 프로젝트 템플릿은 Azure에서 함수 앱에 게시할 수 있는 C# 클래스 라이브러리 프로젝트를 만듭니다. 함수 앱을 사용하면 함수를 논리 단위로 그룹화하여 더 쉽게 리소스를 관리, 배포, 크기 조정 및 공유할 수 있습니다.

  1. Visual Studio 메뉴에서 파일>새로 만들기>프로젝트를 차례로 선택합니다.

  2. 새 프로젝트 만들기에서 검색 상자에 함수를 입력하고, Azure Functions 템플릿을 선택한 다음, 다음을 선택합니다.

  3. 새 프로젝트 구성에서 프로젝트에 대한 프로젝트 이름을 입력한 다음, 만들기를 선택합니다. 함수 앱 이름은 C# 네임스페이스로 유효해야 하므로 밑줄, 하이픈 또는 기타 영숫자가 아닌 문자는 사용하지 마세요.

  4. 새 Azure Functions 애플리케이션 만들기 설정에 대해서는 다음 표의 값을 사용합니다.

    설정 설명
    .NET 버전 .NET 6 이 값은 Azure Functions 런타임 버전 4.x에서 In-Process로 실행되는 함수 프로젝트를 만듭니다. 자세한 내용은 Azure Functions 런타임 버전 개요를 참조하세요.
    함수 템플릿 HTTP 트리거 이 값은 HTTP 요청에 의해 트리거되는 함수를 만듭니다.
    스토리지 계정(AzureWebJobsStorage) 스토리지 에뮬레이터 Azure의 함수 앱에는 스토리지 계정이 필요하기 때문에 Azure에 프로젝트를 게시할 때 할당되거나 생성됩니다. HTTP 트리거는 Azure Storage 계정 연결 문자열을 사용하지 않습니다. 다른 모든 트리거 형식에는 유효한 Azure Storage 계정 연결 문자열이 필요합니다.
    권한 부여 수준 익명 만들어진 함수를 모든 클라이언트에서 키를 제공하지 않고 트리거할 수 있습니다. 이 권한 부여 설정을 통해 새 함수를 쉽게 테스트할 수 있습니다. 키 및 권한 부여에 대한 자세한 내용은 권한 부여 키HTTP 및 웹후크 바인딩을 참조하세요.

    Azure Functions 프로젝트 설정의 스크린샷


    권한 부여 수준익명으로 설정했는지 확인합니다. 기본 수준인 Function을 선택하면 함수 엔드포인트에 액세스하도록 요구하는 요청에 함수 키를 제공해야 합니다.

  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. ConfigureAppConfiguration 메서드를 업데이트하고 AddAzureAppConfiguration()을 호출하여 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;
    

    종속성 주입을 통해 _featureManagerSnapshotIConfigurationRefresherProvider의 인스턴스를 가져오는 데 사용되는 생성자를 추가합니다. 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 메서드는 함수 호출의 시작 부분에서 기능 플래그를 새로 고치기 위해 호출됩니다. 이는 캐시 만료 시간 범위에 도달해야만 작동합니다. 현재 함수 호출을 차단하지 않고 기능 플래그를 새로 고치려면 await 연산자를 제거합니다. 이 경우 이후 함수 호출에서 업데이트된 값을 가져옵니다.

    [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을 붙여 넣습니다. 다음 이미지는 기능 플래그 베타가 비활성화되었음을 나타내는 응답을 보여줍니다.

    빠른 시작 함수 기능 플래그 사용 안 함

  5. Azure Portal에 로그인합니다. 모든 리소스를 선택하고 사용자가 만든 App Configuration 저장소를 선택합니다.

  6. 기능 관리자를 선택하고, Beta 키의 상태를 On으로 변경합니다.

  7. 브라우저를 몇 번 새로 고칩니다. 새로 고침 간격 기간이 지나면 아래 이미지에 표시된 것처럼 기능 플래그 베타가 켜져 있음을 나타내도록 페이지가 변경됩니다.

    빠른 시작 함수 기능 플래그 사용

참고 항목

이 자습서에 사용된 예제 코드는 Azure App Configuration GitHub 리포지토리에서 다운로드할 수 있습니다.

리소스 정리

이 문서에서 만든 리소스를 계속 사용하지 않으려면 여기서 만든 리소스 그룹을 삭제하여 요금이 부과되지 않도록 합니다.

Important

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹 및 포함된 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 합니다. 유지하려는 다른 리소스가 포함된 리소스 그룹 내에서 이 문서에 대한 리소스를 만든 경우 리소스 그룹을 삭제하는 대신 해당 창에서 각 리소스를 개별적으로 삭제합니다.

  1. Azure Portal에 로그인하고 리소스 그룹을 선택합니다.
  2. 이름으로 필터링 상자에서 리소스 그룹의 이름을 입력합니다.
  3. 결과 목록에서 리소스 그룹 이름을 선택하여 개요를 확인합니다.
  4. 리소스 그룹 삭제를 선택합니다.
  5. 리소스 그룹 삭제를 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 입력하여 확인하고 삭제를 선택합니다.

잠시 후, 리소스 그룹 및 모든 해당 리소스가 삭제됩니다.

다음 단계

이 빠른 시작에서는 기능 플래그를 만들고, Microsoft.FeatureManagement 라이브러리를 통해 Azure Functions 앱에서 사용했습니다.