Ищете способ автоматизировать создание коллекций и индексов в Azure Cosmos DB динамическим способом, где наши пользователи могут предоставлять входные данные в формате yaml со свойствами коллекции, и это должно иметь возможность создавать коллекцию и индекс по мере их необходимый.
Входной файл должен иметь всю информацию об этих свойствах, а код Terraform должен быть согласован с новыми элементами коллекции/индекса при добавлении (необходимо синхронизировать файл состояния terraform с тем, что добавляют пользователи).
ниже приведен код terraform, созданный для этой цели, и у меня есть рабочий скрипт [yaml parser][1] в моем конвейере azuredevops, который преобразует данные входные данные в файлах yaml в переменные.
Но здесь я не могу добиться успеха в обновлении выше с помощью кода terraform.
resource "azurerm_cosmosdb_mongo_collection" "collection" {
for_each = { for coll in var.collections : coll.name => coll }
name = each.value.name
resource_group_name = var.cosmosdb_account_rg
account_name = var.cosmosdb_account_name
database_name = each.value.database_name
default_ttl_seconds = each.value.default_ttl_seconds
shard_key = each.value.shard_key
analytical_storage_ttl = var.analytical_storage_ttl
dynamic "index" {
for_each = each.value.indexes
content {
keys = index.value
unique = false
}
}
throughput = var.autoscaling_enabled ? null : var.max_throughput
dynamic "autoscale_settings" {
for_each = var.autoscaling_enabled ? [1] : []
content {
max_throughput = var.max_throughput
}
}
}
Ожидаемый ввод в файл yaml
- database_name : "mydb1"
create_db: true
- collectionName : "mycollection1"
create_collection : true
shard_key : "_id"
default_ttl_seconds: -1
additional_indexes :
- keys: "index1"
unique: false
- keys: "Index2",
unique: false
- collectionName : "mycollection1"
create_collection : true
shard_key : "_id"
default_ttl_seconds: -1
additional_indexes :
- keys: "index1"
unique: false
- keys: "Index2",
unique: false
- database_name : "mydb2"
create_db: true
- collectionName : "mycollection1"
create_collection : true
shard_key : "_id"
default_ttl_seconds: -1
additional_indexes :
- keys: "index1"
unique: false
- keys: "Index2",
unique: false
- collectionName : "mycollection1"
create_collection : true
shard_key : "_id"
default_ttl_seconds: -1
additional_indexes :
- keys: "index1"
unique: false
- keys: "Index2",
unique: false
это была опечатка, и во входном файле было только:
Используете ли вы какой-либо скрипт для создания этих переменных? Можете ли вы поделиться своим определением конвейера для этого?
Создание ресурса Terraform из входного файла yaml
Вот код Terraform для создания Azure Cosmos DB
коллекций с базами данных на основе пользовательского ввода в файле YAML.
provider "azurerm" {
features {}
}
data "azurerm_cosmosdb_account" "example" {
name = "sampledbtest"
resource_group_name = "Venkat-RG"
}
locals {
collections = yamldecode(file("${path.module}/config.yaml"))
}
resource "azurerm_cosmosdb_mongo_database" "database" {
for_each = { for coll in local.collections : coll.database_name => coll }
name = each.key
resource_group_name = data.azurerm_cosmosdb_account.example.resource_group_name
account_name = data.azurerm_cosmosdb_account.example.name
}
resource "azurerm_cosmosdb_mongo_collection" "collection" {
for_each = { for coll in local.collections : "${coll.database_name}-${coll.collection_name}" => coll }
name = each.value.collection_name
resource_group_name = data.azurerm_cosmosdb_account.example.resource_group_name
account_name = data.azurerm_cosmosdb_account.example.name
database_name = each.value.database_name
default_ttl_seconds = each.value.default_ttl_seconds
shard_key = each.value.shard_key
dynamic "index" {
for_each = concat([{
keys = [each.value.shard_key, "_id"]
unique = true
}], each.value.indexes)
content {
keys = index.value.keys
unique = index.value.unique
}
}
}
config.yaml
- database_name: "tfex-cosmos-mongo-db"
collection_name: "example-collection1"
default_ttl_seconds: 777
shard_key: "uniqueKey"
indexes:
- keys:
- "_id"
unique: true
- database_name: "tfex-cosmos-mongo-db1"
collection_name: "another-collection2"
default_ttl_seconds: 3600
shard_key: "uniqueKey"
indexes:
- keys:
- "_id"
unique: false
Терраформ применить
После выполнения Terraform script
коллекции и базы данных Azure Cosmos DB
будут созданы в учетной записи Azure Cosmos DB.
Отлично... Так можем ли мы использовать данный код для новых коллекций по мере необходимости, и файл плана и состояния будет синхронизирован? Также можно ли использовать приведенный выше код в качестве дочернего модуля и использовать его с корневым модулем?
Да, вы можете использовать тот же код для создания коллекций; однако для создания модулей необходимо изменить код.
Конечно... Я проверяю, как его можно использовать в качестве модулей... Я обновлю, как только мне удастся реализовать предоставленное решение.
Хотите создать коллекцию с модулем?
у нас есть модули для других ресурсов, и мы планируем использовать тот же подход, но нам нужно самостоятельное решение для создания этой коллекции для конечных пользователей.
Вы пробовали мой код? Он работает?
Давайте продолжим обсуждение в чате.
Как выглядит ваш текущий конвейер для преобразования этого YAML в переменные, в то время как входной yaml имеет как
=
, так и:
для соединения ключей и значений?