Лучшее место для хранения переменных среды для функции Azure
Я тестирую лазурную функцию локально с несколькими ключами api. Какое место лучше всего хранить в переменных среды и как мне обращаться к ним? Я пытался
System.Environment.GetEnvironmentVariable("name")}
но я не уверен, где хранится переменная среды.
Благодарю!
Ответы
Ответ 1
У вас должен быть файл с именем local.settings.json. Вот лазурный сайт для Functions-Run-Local
Говорится
Эти настройки также могут быть прочитаны в вашем коде как переменные среды. В С# используйте System.Environment.GetEnvironmentVariable или ConfigurationManager.AppSettings. В JavaScript используйте process.env. Параметры, указанные в качестве системной переменной среды, имеют приоритет над значениями в файле local.settings.json.
пример local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<connection string>",
"AzureWebJobsDashboard": "<connection string>"
},
"Host": {
"LocalHttpPort": 7071,
"CORS": "*"
},
"ConnectionStrings": {
"SQLConnectionString": "Value"
}
}
Это говорит о том, что вам нужно поместить параметры приложения в свойство Values в файле local.settings.json.
Для извлечения я использовал ConfigurationManager.AppSettings["CustomSetting"]
как он позволяет вам получать строки подключения.
Я только что поиграл с этим и обнаружил, что у вас должен быть строковый ключ и строковое значение. Я получил ошибку, когда попытался создать подраздел (как вы это сделали в appsettings.json). Мне нужно, чтобы local.settings.json был похож на это:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<connection string>",
"AzureWebJobsDashboard": "<connection string>"
"CustomSetting":"20"
}
}
Ответ 2
Для хранения ключей API вы можете использовать настройки приложения. Подробности: https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings#application-settings
Чтобы получить переменную среды или значение параметра приложения, используйте System.Environment.GetEnvironmentVariable, как показано в следующем примере кода:
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
log.Info(GetEnvironmentVariable("AzureWebJobsStorage"));
log.Info(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}
public static string GetEnvironmentVariable(string name)
{
return name + ": " +
System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}
Подробности: https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-csharp#environment-variables
Спасибо Алексей
Ответ 3
Поместите пары ключ/значение в файл appsettings.json под свойством "Значения".
Ответ 4
В функциях Azure 2 мы перешли к конфигурации ядра ASP.NET, и ConfigurationManager больше не поддерживается.
Я видел много статей, в которых люди сами пытаются заставить работать настройки ConfigurationBuilder. Проблема в том, что, как только вы начинаете делать DI, который был недавно добавлен, возникают некоторые раздражающие сценарии, вызванные отсутствием доступа к параметру Context (1). Гораздо чище просто использовать Environment.GetEnvironmentVariable.
Это идеально соответствует модели конфигурации функций Azure: в dev он выбирает элементы в массиве local.settings.json> Values и в производственном процессе выбирает переменные среды. Это просто работает.
Я не вижу ничего другого, кроме того, что мы делаем в MVC. Но это не MVC, это Функции, и пока MS не приведёт эти платформы в лучшее соответствие, мы должны открыть свои умы для того, что лучше всего в Функциях, вместо того, чтобы заставлять работать другую парадигму.
Ваш local.settings.json может выглядеть так:
{
"IsEncrypted": false,
"Values": {
"KeystoneDB": "[CONNECTION STRING HERE]"
"FUNCTIONS_WORKER_RUNTIME": "dotnet"
}
}
А на производстве вы устанавливаете переменные среды на портале.
(1) Нет другого чистого способа удовлетворить ConfigurationBuilder(). SetBasePath, о котором я знаю. См. Получение корневого каталога приложения-функции Azure v2.