Расширения конфигурации .Net для поставщиков параметров/секретов. Пакет позволяет использовать следующие клиенты внешних сервисов в качестве источника конфигурации/секретов вашего .NetCore приложения (с помощью Microsoft.Extensions.Configuration):
- Яндекс.Облако Локбокс
- AWS AppConfig
Статья с подробностями использования: https://habr.com/ru/post/660449/
Для добавления пакета в ваше приложение вы можете использовать NuGet:
dotnet add package Delobytes.Extensions.Configuration
Добавляет конфигурацию/секреты из сервиса Яндекс.Облако Lockbox.
-
Откройте консоль Яндекс.Облака и создайте сервисную учётную запись с ролью "lockbox.payloadViewer" и запишите её идентификатор.
-
Создайте новый авторизованный ключ для этой сервисной учётки. Запишите идентификатор ключа и приватный ключ.
-
Добавьте любой секрет в Локбокс. Для создания иерархии используйте какой-либо допустимый символ-разделитель.
yc lockbox secret create --name Production --payload "[{"key": "MyPath-AppSecrets-SecretServiceToken", "text_value": "секретныйсекрет"}]"
- После создания вам станет доступен идентификатор секрета. Занесите в настройки приложения (appsettings.json) идентификаторы:
{
"YC": {
"ConfigurationSecretId": "e6q9a81c6m2bolpjaqjq",
"ServiceAccountId": "ajm2bdb9qq3mk4umqq23",
"ServiceAccountAuthorizedKeyId": "aje25rj0oacm5o10ib43"
}
}
- Добавьте источник конфигурации 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
};
});
});
- В результате вы сможете получать объект стандартными методами работы с конфигурацией. Например, создав соответствующий объект и подключая к нему конфигурацию:
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 AppConfig.
-
Получите ключ доступа и секретный ключ в AWS для соответствующего сервисного пользователя. Предоставьте эти данные приложению удобным для вас способом (например, через переменные окружения). Убедитесь, что у сервисного пользователя достаточно прав на чтение конфигураций AppConfig.
-
Укажите регион AWS из которого следует брать конфигурацию. Его можно добавить в настройки приложения (appsettings.json):
{
"AWS": {
"Region": "us-east-1"
}
}
-
Добавьте приложение, среду, и конфигурационный профиль c параметрами/секретами в консоли AWS AppConfig.
-
Добавьте источник конфигурации 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
};
});
});
- В результате вы сможете получать объект стандартными методами работы с конфигурацией. Например, создав соответствующий объект и подключая к нему конфигурацию:
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();
}
}