prakashrajansakthivel
prakashrajansakthivel

Reputation: 2032

if condition in terraform in count

I am adding autoscale settings in the Azure cosmosdb database, My problem is not all our db requires autoscale only a selection of database require autoscalse rest are manual. I will not be able to specify the autoscalse block also the throughout in the same resource as there are conflicts between those two. so I thought of using the count but I will be not be able to run the resouece block for only one of the DB. for the below example

variable

variable "databases" {
  description = "The list of Cosmos DB SQL Databases."
  type = list(object({
    name       = string
    throughput = number
    autoscale          = bool
    max_throughput     = number
  }))
  default = [
      {
    name       = "testcoll1"
    throughput = 400
    autoscale          = false
    max_throughput     = 0
      },
       {
    name       = "testcoll2"
    throughput = 400
    autoscale          = true
    max_throughput     = 1000
      }
  ]
}

For the first I dont need autoscale and next one I need. My main.tf code

resource "azurerm_cosmosdb_mongo_database" "database_manual" {
  count = length(var.databases)

  name                = var.databases[count.index].name
  resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
  account_name        = local.account_name
  throughput          = var.databases[count.index].throughput

}

resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
  count = length(var.databases)

  name                = var.databases[count.index].name
  resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
  account_name        = local.account_name

  autoscale_settings {
      max_throughput = var.databases[count.index].max_throughput
  }
}

First I thought of running two blocks one with scale and on without, but I will not be able to proceed because it requires the count numbers

count = var.autoscale_required == true ? len(databases) : 0

at the start but in my case I will only know at the time of iteration. I have tried to use dynamic within the block but errored out.

*Update I have switched to foreach and able to run the condition but still it requires 2 blocks resource "azurerm_cosmosdb_mongo_database" "database_autoscale" resource "azurerm_cosmosdb_mongo_database" "database_manual"

resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
  for_each = { 
      for key, value in var.databases : key => value
      if value.autoscale_required == true }

  name                = each.value.name
  resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
  account_name        = local.account_name

  autoscale_settings {
      max_throughput = each.value.max_throughput
  }
}

Upvotes: 1

Views: 800

Answers (1)

Marcin
Marcin

Reputation: 238111

If I understand correctly, I think you could do what you want using the following:

resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
  count               = length(var.databases)

  name                = var.databases[count.index].name
  resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
  account_name        = local.account_name
  
  throughput          = var.databases[count.index].autoscale == false ? var.databases[count.index].throughput : null

  dynamic "autoscale_settings" {
      for_each = var.databases[count.index].autoscale == false ? [] : [1]
      content {
          max_throughput = var.databases[count.index].max_throughput
      }
  }
}

Upvotes: 2

Related Questions