Где хранить строку подключения Azure в приложении Azure Functions

#azure #azure-functions #azure-cosmosdb

#azure #azure-функции #azure-cosmosdb

Вопрос:

Я создал приложение Azure Functions, которое подключается к базе данных CosmosDB. Я создал следующий класс для извлечения CosmosClient экземпляра:

 public static class CosmosClientContext
{
    private static readonly CosmosClient CosmosClient = GetCosmosClient();

    public static CosmosClient GetCosmosClient()
    {
        return CosmosClient
               //?? new CosmosClient("AccountEndpoint=https://mycosmosdb.documents.azure.com:443/;AccountKey=JkLv....etc;");
               ?? new CosmosClient("AccountEndpoint=https://localhost:8081/;AccountKey=C2y6...etc");
    }
}
  

Итак, как вы можете видеть, я в настоящее время жестко кодирую ConnectionString в классе, что, очевидно, не оптимально.

Я заметил, что у меня есть local.settings.json файл в моем проекте. Является ли это местом для хранения строки локального подключения? И если да, должен ли я использовать для этого определенное имя ключа? Или как мне читать из него?

И как это будет работать, когда я опубликую свое приложение Azure Functions?

Итак, как я могу сделать так, чтобы она локально использовала мою локальную строку подключения, а при публикации она автоматически использовала строку удаленного подключения?

Ответ №1:

Вы сохраняете их как переменные среды. Локально они будут находиться в local.settings.json, а в Azure они будут находиться на вкладке «Настройки приложения» в разделе «Конфигурация» вашего функционального приложения на портале Azure.

Имя вашей переменной является произвольным. Ваш local.settings.json будет выглядеть примерно так:

 {
    "IsEncrypted": false,
    "Values": {
        "CosmosDbConnectionString": "[CONNECTION STRING HERE]"
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    }
}
  

Убедитесь, что он находится внутри раздела «Значения». Вы просто получаете к нему доступ, используя метод GetEnvironmentVariable:

 Environment.GetEnvironmentVariable("CosmosDbConnectionString");
  

Итак, что-то вроде:

 return new CosmosClient(Environment.GetEnvironmentVariable("CosmosDbConnectionString"));
  

Вам не нужна какая-либо логика для переключения между dev и prod. Поскольку переменные среды различны для каждого места, он автоматически подберет правильную строку подключения.

Обратите внимание, что на портале убедитесь, что вы используете раздел «Настройки приложения», а не раздел «Строки подключения». Это сбивает с толку, но раздел Строки подключений используется только для Entity Framework в функциях.введите описание изображения здесь

Комментарии:

1. @Vivendi в дополнение к этому ответу рассмотрите возможность интеграции хранилища ключей с вашей функцией Azure: azure.microsoft.com/en-us/blog /…

2. Я нашел настройки приложения , когда я нажимаю на имя моего функционального приложения -> Конфигурация . Затем я оказываюсь на похожем экране, похожем на ваш. Это то место, которое вы имеете в виду? Потому что я не могу найти вызов службы «App Service» . Я вижу что-то под названием «Службы приложений», но оттуда я снова попадаю в свое функциональное приложение . Это нормально?

3. Я согласен с Томашем, KeyVault — очень полезная функция для защиты секретов, поэтому, как только вы заработаете, попробуйте изменить ее, чтобы использовать это.

4. @Vivendi, да, это страница. На скриншоте написано App Service, потому что этот экран по существу одинаков как для службы приложений, так и для функций, и мой снимок экрана получен из службы приложений. Но вы находитесь в правильном месте.

5. Отлично, большое спасибо! Я также загляну в хранилище ключей, как только у меня это заработает.

Ответ №2:

Если вы предпочитаете получать доступ к конфигурации в идиоматическом ASP.NET Основным способом при внедрении зависимостей вы можете использовать Startup.cs, который выглядит примерно так, как показано ниже. Значения хранятся в local.settings.json или в настройках размещенного приложения.

 [assembly: FunctionsStartup(typeof(MyApp.Functions.Startup))]

namespace MyApp.Functions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            IServiceCollection services = builder.Services;

            // Read configuration
            var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddEnvironmentVariables().Build();

            // Pass configuration values to a custom IServiceCollection extension
            services.AddCosmosDb(new CosmosDbOptions
            {
                ConnectionString = config["CosmosDb:ConnectionString"],
                DatabaseId = config["CosmosDb:DatabaseId"]
            });

            // Configuration access
            services.Configure<AzureStorageOptions>(config.GetSection("AzureStorage"));

            // Other setup, add more things to services, etc 
            services.AddMemoryCache();
        }
    }
}
  

Затем в любую функцию вы можете встроить конструктором любые службы, настроенные при запуске, включая ваш экземпляр службы Cosmos.