Skip to main content

Command Palette

Search for a command to run...

Conditional create object with count Terraform

Updated
1 min readView as Markdown

Object variable:

variable "autoscaling_read" {
  description = "A map of read autoscaling settings."
  type        = object({
    max_capacity = optional(number)
    scale_in_cooldown = optional(number)
    scale_out_cooldown = optional(number)
    target_value = optional(number)
  })
  default     = {}
}

In code:

resource "aws_appautoscaling_target" "table_read" {
  count = var.create_table && var.autoscaling_enabled && anytrue([for i in var.autoscaling_read : i != null]) ? 1 : 0

  max_capacity       = var.autoscaling_read["max_capacity"]
  min_capacity       = var.read_capacity
  resource_id        = "table/${try(aws_dynamodb_table.autoscaled[0].name, aws_dynamodb_table.autoscaled_gsi_ignore[0].name)}"
  scalable_dimension = "dynamodb:table:ReadCapacityUnits"
  service_namespace  = "dynamodb"
}

When object becomes map of object:

variable "autoscaling_read" {
  description = "A map of read autoscaling settings."
  type        = map(object({
    max_capacity = optional(number)
    scale_in_cooldown = optional(number)
    scale_out_cooldown = optional(number)
    target_value = optional(number)
  }))
  default     = {
    1 = {
        max_capacity = 15
    }
    2 = {
        max_capacity = 40
    }
    3 = {}
  }
}

Terraform console:

> alltrue([for i in var.autoscaling_read : i != null])
true

> anytrue([for i in var.autoscaling_read : i != null])
true

> anytrue([for i in var.autoscaling_read : i == null])
false

> alltrue([for i in var.autoscaling_read : i == null])
false

> anytrue([for i in var.autoscaling_read : i.max_capacity == null])
true

> alltrue([for i in var.autoscaling_read : i.max_capacity == null])
false