Terraform在资源中创建一种或另一种块类型



我正试图使用Terraform在GCP中创建一个警报策略,并根据布尔值选择是创建condition_threshold还是conditionAbsent类型策略。由于这两种块在google_monitoring_alert_policy中都是不同类型的块,我无法找到基于布尔值创建其中一种或另一种的方法。

resource "google_monitoring_alert_policy" "logging_alert_policy" {
for_each     = local.metrics_map
project      = var.project
display_name = lower(format("%s%s%s%s", join("_", [element(split("-", each.value.appcode), length(split("-", each.value.appcode)) - 1), element(split("-", each.value.appcode), 0)]), " ", "log_match ", each.value.display_name))
combiner = each.value.how_to_trigger
dynamic "conditions" {
for_each = each.value.conditions
content {
display_name = lower(format("%s%s%s%s", join("_", [element(split("-", conditions.value.appcode), length(split("-", conditions.value.appcode)) - 1), element(split("-", conditions.value.appcode), 0)]), " ", "log_match ", conditions.value.display_name))

# condition_threshold {
#   filter = lower("metric.type="logging.googleapis.com/user/${format("%s%s%s%s", conditions.value.appcode, "-", lower(replace(lookup(conditions.value, "metric_name"), "/\W|_|\s/", "-")), "")}" resource.type="${conditions.value.resource_type}"")
#   comparison      = conditions.value.comparison
#   threshold_value = conditions.value.threshold_value
#   duration        = conditions.value.duration
#   trigger {
#     count = lookup(conditions.value, "trigger_count", var.default_metric_alert["trigger_count"])
#   }
#   aggregations {
#     alignment_period     = conditions.value.alignment_period
#     per_series_aligner   = conditions.value.per_series_aligner
#     cross_series_reducer = conditions.value.cross_series_reducer
#     group_by_fields      = conditions.value.group_by_fields
#   }
# }
condition_absent {

aggregations {
alignment_period     = "300s"
per_series_aligner   = "ALIGN_MAX"
cross_series_reducer = "REDUCE_MAX"
group_by_fields      = ["resource.label.container_name"]
}
trigger {
count = 1
}
duration        = "180s"
filter = lower("metric.type="logging.googleapis.com/user/${format("%s%s%s%s", conditions.value.appcode, "-", lower(replace(lookup(conditions.value, "metric_name"), "/\W|_|\s/", "-")), "")}" resource.type="${conditions.value.resource_type}"")
}

}
}

我建议嵌套的动态块依赖于local计算的一个元素集,或者不依赖任何元素。

这个想法的简短例子:

locals {
absent = false  # let's say we want to have "condition_threshold" block if this is true 
conditions_config        = local.absent == false ? ["1"] : []
absent_conditions_config = local.absent == true ? ["1"] : []

# I agree the above code is ugly but shows exactly the idea
}
# [...]
dynamic "conditions" {
for_each = each.value.conditions
content {
#[...]

dynamic "condition_threshold" {
for_each = toset(local.conditions_config)  # this will be one element if local.absent = false
# content { ... } 
}
dynamic "condition_absent" {
for_each = toset(local.absent_conditions_config) # this will be one element if local.absent = true
# content { ... } 
}

最新更新