Azure 함수 - appsettings.json 사용
Azure Functions에서 appsettings.json 파일을 사용할 수 있습니까?
여기에는 환경 변수에 대한 설명서가 있습니다.
..우리는 Octopus를 배포에 사용하므로 앱 설정 버전을 제어하고 싶습니다.
사용해 보았습니다.
{
"frameworks": {
"net46": {
"dependencies": {
"Microsoft.Extensions.Configuration": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0"
}
}
}
}
하지만 계속해서 얻는 것.
2016-11-23T 15:27:03.811 (12,16): 오류 CS0012:'Object' 유형이 참조되지 않는 어셈블리에 정의되어 있습니다.어셈블리 '시스템'에 대한 참조를 추가해야 합니다.런타임, 버전=4.0.0.0
Octopus를 통해 환경 변수를 제공/업데이트할 수 있는 것만으로도 우리의 요구에 충분할 것입니다.
조언 부탁드립니다.
필요에 따라 대답은 YES! Azure Functions는 구성에 appsettings.json을 사용할 수 있습니다.그러나 함수가 요청될 때 Azure가 수행하는 몇 가지 주문 순서가 있습니다.
1(으) Azure에서 사용한 키를 찾습니다.Azure Functions 설정의 Application Settings 블레이드에 구성된 Key를 통해 환경 변수 가져오기("[KEY]") 메서드
2º) Azure가 Application Settings 키를 통해 구성을 찾을 수 없는 경우 Azure는 작업 중인 Function의 루트 폴더에서 afterappsettings.json 파일을 찾습니다.
3. 마지막으로, Azure가 appsettings.json 파일에서도 응용 프로그램 설정에서 이 키를 찾을 수 없다면, Azure는 이 파일 appsettings 섹션 키를 찾기 위해 web.config를 찾는 마지막 시도를 할 것입니다.
참고로, 당신은 내 github repo의 샘플을 통해 이러한 구성을 확인할 수 있습니다: 여기와 여기.
이 정보들이 당신에게 도움이 되길 바랍니다.
구성 파일의 변경 사항에 따라 로컬만 사용해야 합니다.appsettings.json의 이름이 local로 변경된 이후 settings.json.설정.json
변경에 대한 참조: zure-functions-cli
앱 설정 및 연결 문자열에 대해서는 환경 변수만 지원됩니다. appsettings.json
지원되지 않습니다.
그러나 ARM(Azure Resource Manager) 템플릿을 사용하여 Function App의 설정을 구성할 수 있습니다.여기 이것을 더 자세히 설명하는 블로그 게시물이 있습니다.
구성 소스 사용자 지정은 Azure Functions 호스트 버전 2.0.14192.0 및 3.0.14191.0부터 사용할 수 있습니다.
추가 구성 소스를 지정하려면 함수 앱의 StartUp 클래스에서 ConfigureAppConfiguration 메서드를 재정의합니다.
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
public class Startup : FunctionsStartup
{
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder
builder)
{
FunctionsHostBuilderContext context = builder.GetContext();
builder.ConfigurationBuilder
.AddJsonFile(Path.Combine(context.ApplicationRootPath,
"appsettings.json"), optional: true, reloadOnChange: false)
.AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.
{context.EnvironmentName}.json"), optional: true, reloadOnChange: false)
.AddEnvironmentVariables();
}
}
}
csp프로젝트의 구성 업데이트
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="appsettings">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
매번 구성을 사용하는 대신 아래와 같이 필요할 때마다 옵션 클래스를 주입할 수 있습니다.시작 단계부터 시작합니다.방법을 구성합니다. 다음 코드를 사용하여 IConfiguration 인스턴스의 값을 사용자 지정 유형으로 추출할 수 있습니다.
builder.Services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.GetSection("MyOptions").Bind(settings);
});
함수 클래스:
using System;
using Microsoft.Extensions.Options;
public class HttpTrigger
{
private readonly MyOptions _settings;
public HttpTrigger(IOptions<MyOptions> options)
{
_settings = options.Value;
}
}
참조: https://learn.microsoft.com/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources
Azure Functions에서는 설정이 로컬에 저장됩니다.settings.json(솔루션에 존재하지 않는 경우 이 파일을 생성합니다/이름은 언급한 대로 정확해야 합니다).
설정 파일을 추가한 후에는 아래에 언급된 Run() 방법으로 파일을 구성해야 합니다.
설정에 액세스할 때 아래를 사용합니다.
IConfigurationRoot config;
config["fromEmail"];
아래 명령을 사용하여 설정 게시
func azure functionapp publish *YourAppName* --publish-local-settings -i
다음을 수행할 수 있는 시도 및 테스트 접근 방식:
- 함수 앱 프로젝트 내에 appsettings.json을 만듭니다.
- FunctionsStartup 클래스에서 상속받는 프로젝트 내에 Startup.cs 클래스를 추가해야 합니다.그러면 Configure(구성) 메서드가 표시됩니다.IF 함수재정의하기 위한 HostBuilder Builder)입니다.
- 사용자 지정 수준을 제어하기 위해 IF 기능을 확장해야 합니다.HostBuilder 클래스는 그렇다고 말할 수 있습니다(IFunctions).호스트 빌더Extensions.cs ) 및 확장 메서드를 추가하여 새 구성 작성기를 이에 추가합니다.이를 통해 런타임에 앱 설정을 구성하는 방법을 제어할 수 있습니다.
- 완료되면 앱 설정에 대한 전체 파일 경로를 전달하거나 이름만 전달하여 새로 생성된 확장 메서드를 호출할 수 있습니다. (코드 내에서 서두르지 않도록 확장 메서드에서 앱 설정의 기본 경로를 구성할 수 있습니다.)
- 확장 방법을 구축하면 주입할 수 있는 서비스가 제공됩니다.코드베이스 내의 임의의 위치로 사용할 수 있는 I 구성.
- Azure Key Vault, AWS Secret Manager 등 앱 설정에 대해 여러 공급자를 추가할 수도 있습니다.마찬가지로 IF 함수 내에 확장 메서드를 추가하기만 하면 됩니다.호스트 빌더확장 클래스 및 시작 클래스 내에서 확장 클래스를 호출합니다.
- 좀 더 깔끔하게 유지하려면 I 구성 서비스 주변에 래퍼를 구현하여 I 구성 내의 중앙 공급자 모음에서 원하는 설정을 반환하는 단일 GetSettings(문자열 키) 메서드를 표시할 수 있습니다.
다음 코드는 다음과 같습니다.
/// <summary>
/// Represents the startup class of the function app.
/// </summary>
public class Startup : FunctionsStartup
{
private const string LocalSettingFileGenericName = "appsettings";
private const string LocalSettingFileExtension = "json";
/// <summary>
/// Configures the host builder for the function app.
/// </summary>
/// <param name="builder">The function app host builder.</param>
public override void Configure(IFunctionsHostBuilder builder)
{
try
{
builder.AddConfiguration((configurationBuilder) =>
{
var configuration = typeof(Startup).Assembly.GetCustomAttribute<AssemblyConfigurationAttribute>().Configuration;
var configurationFileName = !string.Equals(configuration, "Release")
? $"{LocalSettingFileGenericName}.{configuration.ToLowerInvariant()}.{LocalSettingFileExtension}"
: $"{LocalSettingFileGenericName}.{LocalSettingFileExtension}";
var configurationSource = configurationBuilder
.AddJsonFile(configurationFileName, false, true)
.AddEnvironmentVariables();
var partialConfigurationBuilder = configurationSource.Build();
var keyVaultName = partialConfigurationBuilder.GetSection(ConfigurationKeys.KeyvaultName)?.Value;
return configurationSource
.AddKeyVaultWithManagedIdentity(keyVaultName)
.Build();
});
Ifunction BuilderExtensions.cs
internal static class IFunctionsHostBuilderConfigurationsExtensions
{
private const string keyVaultGenericUri = "https://{0}.vault.azure.net/";
/// <summary>
/// Provides an extension method to add configuration provider.
/// </summary>
/// <param name="builder">The function app host builder.</param>
/// <param name="configBuilderFunc">The delegate to pointing to configuration builder.</param>
/// <returns>The function app host builder</returns>
public static IFunctionsHostBuilder AddConfiguration(
this IFunctionsHostBuilder builder,
Func<IConfigurationBuilder, IConfiguration> configBuilderFunc)
{
var configurationBuilder = builder.GetBaseConfigurationBuilder();
var configuration = configBuilderFunc(configurationBuilder);
builder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), configuration));
return builder;
}
/// <summary>
/// Provides an extension method to add Azure Key Vault as a configuration provider.
/// </summary>
/// <param name="builder">The configuration builder.</param>
/// <param name="keyvaultName">The azure key vault name.</param>
/// <param name="authenticationClientId">The AAD application clientId.</param>
/// <param name="authenticationClientSecret">The AAD application clientSecret.</param>
/// <returns>The configuration builder.</returns>
public static IConfigurationBuilder AddKeyVaultWithManagedIdentity(
this IConfigurationBuilder builder,
string keyvaultName)
{
if (string.IsNullOrWhiteSpace(keyvaultName))
{
return builder;
}
var serviceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(serviceTokenProvider.KeyVaultTokenCallback));
var keyVaultUri = string.Format(keyVaultGenericUri, keyvaultName);
builder.AddAzureKeyVault(
keyVaultUri,
keyVaultClient,
new DefaultKeyVaultSecretManager());
return builder;
}
private static IConfigurationBuilder GetBaseConfigurationBuilder(this IFunctionsHostBuilder builder)
{
var configurationBuilder = new ConfigurationBuilder();
var descriptor = builder.Services.FirstOrDefault(
service => service.ServiceType == typeof(IConfiguration));
if (descriptor?.ImplementationInstance is IConfiguration configRoot)
{
configurationBuilder.AddConfiguration(configRoot);
}
var rootConfigurationBuilder = configurationBuilder.SetBasePath(GetCurrentDirectory());
return rootConfigurationBuilder;
}
private static string GetCurrentDirectory()
{
var currentDirectory = Path.GetDirectoryName(
Assembly.GetExecutingAssembly().Location);
return currentDirectory.Replace("bin", "{Your settings directory}");
}
래퍼 구현 예제:
/// <summary>
/// Represents the configuration settings provider class.
/// </summary>
public class ConfigurationSettings : IConfigurationSettings
{
private readonly IConfiguration configurationSource;
/// <summary>
/// Initializes the class of type <see cref="ConfigurationSettings"/>.
/// </summary>
/// <param name="configurationSource">The configuration source.</param>
public ConfigurationSettings(
IConfiguration configurationSource)
{
this.configurationSource = configurationSource;
}
///<inheritdoc/>
public T GetSetting<T>(string key)
{
try
{
if (!configurationSource.GetSection(key).Exists())
{
throw new ConfigurationDoesNotExistException(
$"The configuration with key {key} does not exist in appsetting or key vault.");
}
return (T)Convert.ChangeType(configurationSource.GetSection(key)?.Value, typeof(T));
}
catch (InvalidCastException)
{
throw;
}
catch (Exception)
{
throw;
}
}
}
다음과 같은 간단한 솔루션이 유용할 수 있습니다.
[assembly: FunctionsStartup(typeof(AzureFunctions.Startup))]
namespace AzureFunctions;
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
var context = builder.GetContext();
var config = context.Configuration; //Here you go!
}
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
var context = builder.GetContext();
builder.ConfigurationBuilder
.AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
.AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false); //For example enviroment name can be: Development
}
}
종속성의 경우 함수 내부에서 project.json을 사용/생성해야 합니다.여기서 종속성을 지정할 수 있습니다.다음을 확인하십시오. https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-csharp#package-management
예:
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.ProjectOxford.Face": "1.1.0"
}
}
}
}
언급URL : https://stackoverflow.com/questions/40768490/azure-functions-using-appsettings-json
'programing' 카테고리의 다른 글
선행 0 및 쉼표를 모두 포함하는 Excel용 CSV (0) | 2023.05.05 |
---|---|
월 번호에서 월 이름 가져오기 (0) | 2023.05.05 |
애플리케이션 중앙에 표시할 대화 상자 위치를 설정하는 방법은 무엇입니까? (0) | 2023.05.05 |
원격 태그를 삭제하려면 어떻게 해야 합니까? (0) | 2023.05.05 |
Angular - ng: 명령을 찾을 수 없습니다. (0) | 2023.05.05 |