Создание ресурса Terraform из входного файла yaml

Ищете способ автоматизировать создание коллекций и индексов в 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

Как выглядит ваш текущий конвейер для преобразования этого YAML в переменные, в то время как входной yaml имеет как =, так и : для соединения ключей и значений?

Alvin Zhao - MSFT 19.08.2024 08:39

это была опечатка, и во входном файле было только:

Vowneee 19.08.2024 09:24

Используете ли вы какой-либо скрипт для создания этих переменных? Можете ли вы поделиться своим определением конвейера для этого?

Alvin Zhao - MSFT 19.08.2024 09:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создание ресурса 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.

Отлично... Так можем ли мы использовать данный код для новых коллекций по мере необходимости, и файл плана и состояния будет синхронизирован? Также можно ли использовать приведенный выше код в качестве дочернего модуля и использовать его с корневым модулем?

Vowneee 19.08.2024 16:14

Да, вы можете использовать тот же код для создания коллекций; однако для создания модулей необходимо изменить код.

Venkat V 19.08.2024 19:20

Конечно... Я проверяю, как его можно использовать в качестве модулей... Я обновлю, как только мне удастся реализовать предоставленное решение.

Vowneee 19.08.2024 19:57

Хотите создать коллекцию с модулем?

Venkat V 19.08.2024 20:13

у нас есть модули для других ресурсов, и мы планируем использовать тот же подход, но нам нужно самостоятельное решение для создания этой коллекции для конечных пользователей.

Vowneee 19.08.2024 20:17

Вы пробовали мой код? Он работает?

Venkat V 19.08.2024 20:20

Давайте продолжим обсуждение в чате.

Venkat V 19.08.2024 20:21

Другие вопросы по теме