Подтвердить что ты не робот

Лучшее место для хранения переменных среды для функции Azure

Я тестирую лазурную функцию локально с несколькими ключами api. Какое место лучше всего хранить в переменных среды и как мне обращаться к ним? Я пытался

System.Environment.GetEnvironmentVariable("name")}

но я не уверен, где хранится переменная среды.

Благодарю!

4b9b3361

Ответ 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.