Azure 앱 구성 및 Azure Functions
우리는 Azure Key Vault 참조와 함께 API를 앱 구성으로 이동하게 되어 정말 기뻤습니다. 즉, 구성을 중앙 집중화하고 중복을 제거하고 모든 비밀을 Azure Key Vault로 푸시했습니다. 그 옆에 기능 플래그와 같이 제공하는 다른 기능의 추가 이점이 있습니다.
간단해 보이네요. 해봅시다!
모든 API에 대한 구성 설정을 업데이트한 후 논리적인 다음 단계는 Azure Functions에 대해 동일한 작업을 수행하는 것이었습니다. 우리는 그것들이 많고 많은 구성을 포함하고 있지만 Azure Function은 Asp.NET 핵심 API와 동일하지 않습니다. 여기서부터 오늘의 여정이 시작됩니다.
첫 번째 단계는 Google을 시작하고 Azure Functions와 함께 Azure App Configuration을 검색하는 것이었고, 이로 인해 공식Microsoft documentation이 표시되었습니다.
설명서는 다음 예를 보여줍니다.
private static IConfiguration Configuration { set; get; }
static Function1()
{
var builder = new ConfigurationBuilder();
builder.AddAzureAppConfiguration(Environment.GetEnvironmentVariable("ConnectionString"));
Configuration = builder.Build();
}
음...
좋아, 이것은 작동하지만 API에서 설정한 것처럼 매끄럽지 않습니다. 나는 설정이 webapps의 설정과 유사하기를 정말로 원했습니다. 업그레이드할 기능이 많았고 모두 이미 기존 IConfiguration 구현이나 IOptions 패턴에 의존하고 있습니다.
기능시작
Azure Functions에서는 실제로 웹앱과 같이 HostBuilder 설정에 들어갈 수 없습니다. 사용 가능한 가장 가까운 방법은 'FunctionsStartup'을 구현하는 것입니다. 여기에서 종속성 주입을 설정하기 때문에 대부분의 기능에서 이미 사용할 수 있었습니다. 이 주제에 대한 배경 지식이 더 필요하면 GitHub에서 documentation 또는 내 examples를 확인하십시오.
가장 큰 문제는 'Configure' 메서드의 코드가 호출될 때 이미 구성이 설정되어 있다는 것입니다. 내 계획은 새 구성을 만들어 서비스 컬렉션에서 교체하는 것이었습니다.
var configBuilder = new ConfigurationBuilder();
// Add env vars to the new config
configBuilder.AddEnvironmentVariables();
// Replace IConfiguration
builder.Services.RemoveAll<IConfiguration>();
builder.Services.AddSingleton<IConfiguration>(configBuilder.Build());
Update: After publishing the initial version of this post I got a tip from to use IFunctionsConfigurationBuilder instead. This new recommended way that I somehow missed in my quest makes this so much more clean! To be able to use this you need at least version 1.1.0-preview1 of the Microsoft.Azure.Functions.Extensions package installed. Since I have absolutely no fear of preview packages that is not a problem.
약간의 조정과 테스트는 나중에 다음과 같은 구현으로 끝났습니다. Key Vault 참조를 활용할 수 있도록 Azure App Configuration 및 Azure Key Vault를 추가합니다. 여기에서 확인할 수 있는 것은 인증에 Azure ID의 기본 자격 증명을 사용하기 때문에 앱 구성에 대한 끝점만 필요하다는 것입니다. 연결 문자열을 사용할 수도 있지만 목표는 구성에서 비밀을 제거하는 것이었습니다.
using System;
using Azure.Identity;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
[assembly: FunctionsStartup(typeof(AppConfigurationExample.StartUp))]
namespace AppConfigurationExample
{
public class StartUp : FunctionsStartup
{
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
//get the original configuration
var tmpConfig = builder.ConfigurationBuilder.Build();
// create a new configurationbuilder and add appconfiguration
builder.ConfigurationBuilder.AddAzureAppConfiguration((options) =>
{
var defaultAzureCredential = GetDefaultAzureCredential();
options.Connect(new Uri(tmpConfig["AppConfigUrl"]), defaultAzureCredential)
// also setup key vault for key vault references
.ConfigureKeyVault(kvOptions =>
{
kvOptions.SetCredential(defaultAzureCredential);
});
// configure appconfiguation features you want;
// options.UseFeatureFlags();
// options.Select(KeyFilter.Any, LabelFilter.Null);
});
}
public override void Configure(IFunctionsHostBuilder builder)
{
// Setup DI
//builder.Services.AddScoped<>();
//builder.Services.AddTransient<>();
//builder.Services.AddSingleton<>();
}
private DefaultAzureCredential GetDefaultAzureCredential() => new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
//be explicit about this to prevent frustration
ExcludeManagedIdentityCredential = false,
ExcludeAzureCliCredential = false,
ExcludeSharedTokenCacheCredential = true,
ExcludeVisualStudioCodeCredential = true,
ExcludeInteractiveBrowserCredential = true,
ExcludeEnvironmentCredential = true,
ExcludeVisualStudioCredential = true
});
}
}
구성 사용
이 부분은 이미 내 기능에서 구현되었으므로 여기서 아무 것도 할 필요가 없습니다. 한 가지 옵션은 다음과 같은 기능을 포함하는 비 상태 클래스에 IConfiguration을 주입하는 것입니다.
public class Function1
{
readonly IConfiguration _configuration;
public Function1(IConfiguration configuration)
{
_configuration = configuration;
}
[FunctionName("Function1")]
public async Task<string> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req)
{
return _configuration["greetingsconfigkey"];
}
}
더 나은 방법은 다음 예제와 같이 IOptions 패턴을 사용하는 것입니다.
StartUp의 Configure 메서드 내부
builder.Services.AddOptions<ExampleSettingsConfig>()
.Configure<IConfiguration>((configSection, configuration) =>
{
configuration.GetSection("ExampleTestSettings").Bind(configSection);
});
함수 생성자
public Function1(IOptions<ExampleSettingsConfig> exampleOptions)
{
_config = exampleOptions.Value;
}
But there is a warning...
This implementation has some limitations described here. The configuration needed for the binding triggers cannot be moved to App Configuration because it is used outside your Azure Function code by the platform. If you would have a Service Bus trigger, the scale controller that will determine if it needs to spin up hosts for your functions needs access to the queue or subscription you are listening to. I am sure this has the attention of the team responsible, but I can imagine it is not an easy problem to solve.
우리는 또 무엇을 얻었습니까?
레이블 필터 설정과 같은 Azure 앱 구성 설정에 있는 세부 정보 옵션 옆에 기능 플래그 기능도 있습니다. 설정에서 'options.UseFeatureFlags()'를 호출하여 이를 활성화할 수 있습니다.
나눔은 배려다
예제 코드
누구나 원하는 작업을 수행할 수 있도록 GitHub에 간단한 예제 구현을 추가했습니다. 당신은 그것을 찾을 수 있습니다 here .
oscarvantol.nl
Reference
이 문제에 관하여(Azure 앱 구성 및 Azure Functions), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/oscarvantol/azure-app-configuration-and-azure-functions-35ae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)