Впереди немного более длинный вопрос, но, пожалуйста, потерпите меня: PM CosmosDB объясняет в ветке обратной связи это:
In Cosmos DB, all of the resources e.g. databases, collections/tables/graphs, users, permissions, documents/items/nodes/edges, attachments are all runtime resources. You can CRUD/query these resources using runtime SDKs and REST APIs. [...] All of the “runtime resources” [...] are meant to be used by the developers directly inside their applications.
The only resource which is meant for administrative purposes is the “database account”. This resource is exposed via ARM.
Таким образом, с помощью ARM (Azure Resource Manager) можно подготовить только ресурс CosmosDB, например в конвейере CI / CD, например, с помощью Azure DevOps.
Итак, теперь мой вопрос: Как правильно создать базы данных и коллекции в учетной записи CosmosDB?
Допустим, я использую функцию Azure, которая хранит / считывает данные из CosmosDB. Используя привязку функций, я мог бы, например, использовать
[DocumentDB("ToDoList", "Migration", ConnectionStringSetting = "CosmosDB", CreateIfNotExists = true)] IAsyncCollector<Document> documentsToStore)
создать базу данных и коллекцию. Создавая экземпляр DocumentClient вручную, я мог бы использовать
await client.CreateDatabaseIfNotExistsAsync(database);
Но: это правильный способ сделать это ?? Выполнение этого, например, в привязке функции будет означать, что коллекция не будет создана, пока функция не будет выполнена в первый раз. Это просто неправильно.
Или вместо этого следует использовать, например, сценарий Powershell в конвейере развертывания для создания базы данных и коллекции после развертывания сценария ARM? Это, конечно, выполнимо, но если это будет рекомендуемый способ, можно очень поспорить, что это должно быть раскрыто через ARM.
Я ответил на это по другому вопросу, который связан с тем же вопросом: ### Как развернуть контейнер / коллекцию с инфраструктурой и без необходимости запускать дополнительный код начальной загрузки во время запуска? <br/> Теперь существуют шаблоны ARM для их предоставления. stackoverflow.com/a/55962822/237723





Я чувствую, что ответ на этот вопрос полностью зависит от цели функции, которую вы пытаетесь создать. Если функция предполагает, что она может читать / обновлять / удалять документы в коллекции, которая может существовать или не существовать, тогда да, это хорошая практика - оспорить коллекцию, а затем создать ее на лету, если она еще не существует.
Если коллекцию необходимо создать, потому что от нее зависят другие инструменты, и это предсказуемая коллекция, вы можете создать их заранее, но если имя или номер коллекции невозможно предсказать, значит, вы находитесь в привязке.
Я бы не согласился. Во-первых, функция была просто примером. Может быть любое приложение, использующее CosmosDB. Во-вторых, создание базы данных и коллекции во время выполнения - не лучший вариант. Если бы кто-нибудь мог дать этому правильное объяснение, я был бы очень счастлив.
Возможный дубликат Как настроить коллекцию Cosmos Db во время развертывания