Conditional create dynamic block với variable là object và map of object trong Terraform

  1. Object

Ta có biến object như sau:

    sensitive_labels = optional(object({
      auth_token  = optional(string)
      password    = optional(string)
      service_key = optional(string)
    }))

Người ta có thể bỏ qua một thuộc tính được đánh dấu là optional, và trong trường hợp đó, Terraform sẽ tự động đặt thuộc tính đó thành null bên trong module của bạn.

Bạn có thể sử dụng biến trong module như sau:

resource "google_monitoring_notification_channel" "channels" {
  for_each     = var.notification_channels

  project      = var.project_id
  type         = each.value.type
  display_name = each.value.display_name
  description  = each.value.description
  labels       = each.value.labels
  enabled      = each.value.enabled

  dynamic "sensitive_labels" {
    for_each = each.value.sensitive_labels[*]
    content {
      auth_token  = sensitive_labels.value.auth_token
      password    = sensitive_labels.value.password
      service_key = sensitive_labels.value.service_key
    }

Biểu thức each.value.sensitive_labels[*] là một biểu thức splat sử dụng single values làm lists feature, biến đổi chính xác giá trị đã cho thành danh sách one-element list hoặc zero-element list tùy thuộc vào việc giá trị đó có rỗng hay không. Điều đó thực sự có nghĩa là sẽ có một khối Sensitive_labels nếu each.value.sensitive_labels được set và không có khối nào thuộc loại đó nếu thuộc tính đó không được đặt (null).

Các thuộc tính bên trong các khối đó cũng có thể chỉ được gán trực tiếp mà không cần bất kỳ logic đặc biệt nào, bởi vì Terraform sẽ tự động đặt chúng thành null nếu không được người gọi chỉ định và việc đặt đối số tài nguyên thành null luôn giống như không đặt đối số đó.

2. Map of object

variable "feature_flags" {
  type = map(object({
    project_key    = string
    key            = string
    name           = string
    description    = string
    variation_type = string
    tags           = set(string)
    variations = list(object({
      value = string
    }))
  }))
}

Sử dụng:

resource "launchdarkly_feature_flag" "ffs" {
  for_each = var.feature_flags

  project_key    = each.value.project_key
  key            = each.value.key
  name           = each.value.name
  description    = each.value.description
  variation_type = each.value.variation_type
  tags           = each.value.tags

  dynamic "variations" {
    for_each = each.value.variations != null ? each.value.variations : []
    content {
      variations.value.value
    }
  }
}