简体   繁体   中英

Terraform support in list of maps

In order to create a multi region mongodb cluster I'll need to create a resource which contains some static and dynamic configuration.

I would like to take the dynamic configuration and insert 2 different values to this section.

Let me clarify, please check the following resource:

resource "mongodbatlas_cluster" "mongo_cluster" {

  project_id                  = var.mongo_project_id
  name                        = var.mongo_cluster_name
  num_shards                  = var.mongo_num_shards
  replication_factor          = var.mongo_replication_factor
  backup_enabled              = var.mongo_backup_boolean
  mongo_db_major_version      = var.mongo_version
  provider_name               = var.mongo_provider_name
  disk_size_gb                = var.mongo_disk_size
  provider_disk_iops          = var.mongo_disk_iops
  provider_volume_type        = var.mongo_volume_type
  provider_encrypt_ebs_volume = var.mongo_encryption_boolean
  provider_instance_size_name = var.mongo_instance_size
  cluster_type                = var.mongo_cluster_type
  replication_specs {
    num_shards                = var.mongo_replication_num_shards
    regions_config {
      region_name = regions_config.region
      electable_nodes = regions_config.electable_nodes
      priority = regions_config.priority
      read_only_nodes = regions_config.read_only_nodes
      }
    }
  }
}

For my purposes I would like to create a list of maps which will look like this:

regions_config = [
{
  region_name = "eu-west-1"
  electable_nodes = "2"
  priority = "7"
  read_only_nodes = "0"
},
{
  region_name = "eu-central-1"
  electable_nodes = "1"
  priority = "6"
  read_only_nodes = "0"
}
]

Note that I don't want to create several clusters so I guess the “count” function won't help me, I just want to add another “regions_config” section to the specified cluster.

The resource should look like this:

resource "mongodbatlas_cluster" "cluster-test" {
  project_id     = "<YOUR-PROJECT-ID>"
  name           = "cluster-test-multi-region"
  disk_size_gb   = 100
  num_shards     = 1
  backup_enabled = true
  cluster_type   = "REPLICASET"

  //Provider Settings "block"
  provider_name               = "AWS"
  provider_disk_iops          = 300
  provider_volume_type        = "STANDARD"
  provider_instance_size_name = "M10"

  replication_specs {
    num_shards = 1
    regions_config {
      region_name     = "US_EAST_1"
      electable_nodes = 3
      priority        = 7
      read_only_nodes = 0
    }
    regions_config {
      region_name     = "US_EAST_2"
      electable_nodes = 2
      priority        = 6
      read_only_nodes = 0
    }
    regions_config {
      region_name     = "US_WEST_1"
      electable_nodes = 2
      priority        = 5
      read_only_nodes = 2
    }
  }
}

Do you know how can I handle it?

Thanks !

So I got the answer from Hashicorp forum, Link

I've created a dynamic block of regions_config in the resource's section:

resource "mongodbatlas_cluster" "mongo_cluster" {
  project_id                  = var.mongo_project_id
  name                        = var.mongo_cluster_name
  num_shards                  = var.mongo_num_shards
  replication_factor          = var.mongo_replication_factor
  backup_enabled              = var.mongo_backup_boolean
  mongo_db_major_version      = var.mongo_version
  provider_name               = var.mongo_provider_name
  disk_size_gb                = var.mongo_disk_size
  provider_disk_iops          = var.mongo_disk_iops
  provider_volume_type        = var.mongo_volume_type
  provider_encrypt_ebs_volume = var.mongo_encryption_boolean
  provider_instance_size_name = var.mongo_instance_size
  cluster_type                = var.mongo_cluster_type
  replication_specs {
    num_shards                = var.mongo_replication_num_shards
    dynamic "regions_config" {
      for_each = var.regions_config
      content {
        region_name     = regions_config.value.region_name
        electable_nodes = regions_config.value.electable_nodes
        priority        = regions_config.value.priority
        read_only_nodes = regions_config.value.read_only_nodes
      }
    }
  }
}

In the variables file I defined the regions_config var as:

variable "regions_config" {
  type = list(object({
    region_name     = string
    electable_nodes = number
    priority        = number
    read_only_nodes = number
  }))
}

I can verify it's working. (Terraform V0.12.12)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM