Skip to content

Расширения конфигурации .Net для различных поставщиков параметров/секретов: Яндекс Локбокс, AWS AppConfig.

License

Notifications You must be signed in to change notification settings

a-postx/Delobytes.Extensions.Configuration

Repository files navigation

Delobytes.Extensions.Configuration

RU, EN

Расширения конфигурации .Net для поставщиков параметров/секретов. Пакет позволяет использовать следующие клиенты внешних сервисов в качестве источника конфигурации/секретов вашего .NetCore приложения (с помощью Microsoft.Extensions.Configuration):

  • Яндекс.Облако Локбокс
  • AWS AppConfig

Статья с подробностями использования: https://habr.com/ru/post/660449/

Установка

Для добавления пакета в ваше приложение вы можете использовать NuGet:

dotnet add package Delobytes.Extensions.Configuration

Использование

Yandex Cloud Lockbox

Добавляет конфигурацию/секреты из сервиса Яндекс.Облако Lockbox.

  1. Откройте консоль Яндекс.Облака и создайте сервисную учётную запись с ролью "lockbox.payloadViewer" и запишите её идентификатор.

  2. Создайте новый авторизованный ключ для этой сервисной учётки. Запишите идентификатор ключа и приватный ключ.

  3. Добавьте любой секрет в Локбокс. Для создания иерархии используйте какой-либо допустимый символ-разделитель.

yc lockbox secret create --name Production --payload "[{"key": "MyPath-AppSecrets-SecretServiceToken", "text_value": "секретныйсекрет"}]"

добавление секрета

  1. После создания вам станет доступен идентификатор секрета. Занесите в настройки приложения (appsettings.json) идентификаторы:
{
  "YC": {
    "ConfigurationSecretId": "e6q9a81c6m2bolpjaqjq",
    "ServiceAccountId": "ajm2bdb9qq3mk4umqq23",
    "ServiceAccountAuthorizedKeyId": "aje25rj0oacm5o10ib43"
  }
}
  1. Добавьте источник конфигурации c помощью вызова метода расширения. Получите идентификаторы из файла конфигурации приложения, а приватный ключ из переменных среды и сконфигурируйте другие необходимые настройки:
IHostBuilder hostBuilder = new HostBuilder().UseContentRoot(Directory.GetCurrentDirectory());

hostBuilder.ConfigureAppConfiguration(configBuilder =>
{
    IConfigurationRoot tempConfig = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();
			
    configBuilder.AddYandexCloudLockboxConfiguration(config =>
        {
            config.PrivateKey = Environment.GetEnvironmentVariable("YC_PRIVATE_KEY");
            config.ServiceAccountId = tempConfig.GetValue<string>("YC:ServiceAccountId");
            config.ServiceAccountAuthorizedKeyId = tempConfig.GetValue<string>("YC:ServiceAccountAuthorizedKeyId");
            config.SecretId = tempConfig.GetValue<string>("YC:ConfigurationSecretId");
            config.Path = "MyPath";
            config.PathSeparator = '-';
            config.Optional = false;
            config.ReloadPeriod = TimeSpan.FromDays(7);
            config.LoadTimeout = TimeSpan.FromSeconds(20);
            config.OnLoadException += exceptionContext =>
            {
                //log
            };
        });
});
  1. В результате вы сможете получать объект стандартными методами работы с конфигурацией. Например, создав соответствующий объект и подключая к нему конфигурацию:
public class AppSecrets
{
    public string SecretServiceToken { get; set; }
}
[Route("/")]
[ApiController]
public class HomeController : ControllerBase
{
    public HomeController(IConfiguration config)
    {
        _config = config;
    }

    private readonly IConfiguration _config;

    [HttpGet("")]
    public IActionResult Get()
    {
        AppSecrets secrets = _config.GetSection(nameof(AppSecrets)).Get<AppSecrets>();

        return Ok();
    }
}

AWS App Configuration

Добавляет конфигурацию/секреты из сервиса AWS AppConfig.

  1. Получите ключ доступа и секретный ключ в AWS для соответствующего сервисного пользователя. Предоставьте эти данные приложению удобным для вас способом (например, через переменные окружения). Убедитесь, что у сервисного пользователя достаточно прав на чтение конфигураций AppConfig.

  2. Укажите регион AWS из которого следует брать конфигурацию. Его можно добавить в настройки приложения (appsettings.json):

{
  "AWS": {
    "Region": "us-east-1"
  }
}
  1. Добавьте приложение, среду, и конфигурационный профиль c параметрами/секретами в консоли AWS AppConfig.

  2. Добавьте источник конфигурации c помощью вызова метода расширения и предоставьте необходимые настройки:

IHostBuilder hostBuilder = new HostBuilder().UseContentRoot(Directory.GetCurrentDirectory());

hostBuilder.ConfigureAppConfiguration((hostingContext, configBuilder) =>
{
    IHostEnvironment hostEnvironment = hostingContext.HostingEnvironment;
	IConfigurationRoot tempConfig = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

    configBuilder.AddAwsAppConfigConfiguration(config =>
        {
            config.RegionEndpoint = RegionEndpoint.GetBySystemName(tempConfig.GetValue<string>("AWS:Region"));
            config.EnvironmentName = hostEnvironment.EnvironmentName;
            config.ApplicationName = hostEnvironment.ApplicationName;
            config.ConfigurationName = $"{hostEnvironment.EnvironmentName}-{hostEnvironment.ApplicationName}-profile";
            config.ClientId = $"{hostEnvironment.ApplicationName}-{Node.Id}";
            config.Optional = false;
            config.ReloadPeriod = TimeSpan.FromDays(1);
            config.LoadTimeout = TimeSpan.FromSeconds(20);
            config.OnLoadException += exceptionContext =>
            {
                //log
            };
        });
});
  1. В результате вы сможете получать объект стандартными методами работы с конфигурацией. Например, создав соответствующий объект и подключая к нему конфигурацию:
public class AppSecrets
{
    public string SecretServiceToken { get; set; }
}
[Route("/")]
[ApiController]
public class HomeController : ControllerBase
{
    public HomeController(IConfiguration config)
    {
        _config = config;
    }

    private readonly IConfiguration _config;

    [HttpGet("")]
    public IActionResult Get()
    {
        AppSecrets secrets = _config.GetSection(nameof(AppSecrets)).Get<AppSecrets>();

        return Ok();
    }
}

Лицензия

МИТ

About

Расширения конфигурации .Net для различных поставщиков параметров/секретов: Яндекс Локбокс, AWS AppConfig.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages