자습서: Azure Functions 앱에서 동적 구성 사용

App Configuration .NET 구성 공급자는 애플리케이션 활동에 의해 동적으로 구동되는 캐싱 및 새로 고침 구성을 지원합니다. 이 자습서에서는 코드에서 동적 구성 업데이트를 구현하는 방법을 보여줍니다. 빠른 시작에서 소개한 Azure Functions 앱을 기반으로 합니다. 계속하기 전에 먼저 Azure 앱 Configuration을 사용하여 Azure Functions 앱 만들기를 완료합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • App Configuration 저장소의 변경 내용에 대응하여 구성을 업데이트하도록 Azure Functions 앱을 설정합니다.
  • Azure Functions 호출에 최신 구성을 삽입합니다.

필수 조건

App Configuration에서 데이터 다시 로드

Azure Functions는 in-process 또는 isolated-process 실행을 지원합니다. 두 모드 간의 App Configuration 사용량의 주요 차이점은 구성을 새로 고치는 방법입니다. In-process 모드에서는 각 함수에서 호출을 수행하여 구성을 새로 고쳐야 합니다. 격리된 프로세스 모드에서는 미들웨어를 지원합니다. 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을 복사합니다.

    Quickstart Function debugging in VS

  4. 브라우저의 주소 표시줄에 HTTP 요청에 대한 URL을 붙여 넣습니다. 다음 이미지에서는 함수에서 반환된 로컬 GET 요청에 대한 브라우저의 응답을 보여 줍니다.

    Quickstart Function launch local

  5. Azure Portal에 로그인합니다. 모든 리소스를 선택하고 빠른 시작에서 만든 App Configuration 저장소를 선택합니다.

  6. 구성 탐색기를 선택하고 다음 키의 값을 업데이트합니다.

    TestApp:설정:Message Azure 앱 구성의 데이터 - 업데이트됨

    그런 다음, 예를 들어 센티널 키를 만들거나 이미 있는 경우 해당 값을 수정합니다.

    TestApp:설정:Sentinel v1
  7. 브라우저를 몇 번 새로 고칩니다. 캐시된 설정이 30초 후에 만료되면 페이지에 업데이트된 값이 있는 Functions 호출의 응답이 표시됩니다.

    Quickstart Function refresh local

참고 항목

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

리소스 정리

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

Important

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

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

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

다음 단계

이 자습서에서는 Azure Functions 앱을 사용하도록 설정하여 App Configuration의 구성 설정을 동적으로 새로 고칩니다. Azure 관리 ID를 사용하여 App Configuration에 대한 액세스를 간소화하는 방법을 알아보려면 다음 자습서를 계속 진행합니다.