#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.