programing

Azure 함수 - appsettings.json 사용

yellowcard 2023. 5. 5. 08:48
반응형

Azure 함수 - appsettings.json 사용

Azure Functions에서 appsettings.json 파일을 사용할 수 있습니까?

여기에는 환경 변수에 대한 설명서가 있습니다.

https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-csharp#environment-variables

..우리는 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

여기에 이미지 설명 입력

다음을 수행할 수 있는 시도 및 테스트 접근 방식:

  1. 함수 앱 프로젝트 내에 appsettings.json을 만듭니다.
  2. FunctionsStartup 클래스에서 상속받는 프로젝트 내에 Startup.cs 클래스를 추가해야 합니다.그러면 Configure(구성) 메서드가 표시됩니다.IF 함수재정의하기 위한 HostBuilder Builder)입니다.
  3. 사용자 지정 수준을 제어하기 위해 IF 기능을 확장해야 합니다.HostBuilder 클래스는 그렇다고 말할 수 있습니다(IFunctions).호스트 빌더Extensions.cs ) 및 확장 메서드를 추가하여 새 구성 작성기를 이에 추가합니다.이를 통해 런타임에 앱 설정을 구성하는 방법을 제어할 수 있습니다.
  4. 완료되면 앱 설정에 대한 전체 파일 경로를 전달하거나 이름만 전달하여 새로 생성된 확장 메서드를 호출할 수 있습니다. (코드 내에서 서두르지 않도록 확장 메서드에서 앱 설정의 기본 경로를 구성할 수 있습니다.)
  5. 확장 방법을 구축하면 주입할 수 있는 서비스가 제공됩니다.코드베이스 내의 임의의 위치로 사용할 수 있는 I 구성.
  6. Azure Key Vault, AWS Secret Manager 등 앱 설정에 대해 여러 공급자를 추가할 수도 있습니다.마찬가지로 IF 함수 내에 확장 메서드를 추가하기만 하면 됩니다.호스트 빌더확장 클래스 및 시작 클래스 내에서 확장 클래스를 호출합니다.
  7. 좀 더 깔끔하게 유지하려면 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

반응형