Conditional create dynamic block với variable là object và map of object trong Terraform
- 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
}
}
}