You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform如何遍历复杂对象列表动态生成CloudWatch告警metric_query块?

问题根因
  • 动态块metric_query的遍历对象错误:local.alarm_WithExpression是包含多个告警配置的元组,没有metrics属性,你需要遍历的是当前告警实例的metrics列表,也就是资源级for_each迭代到的each.value.metrics
  • 动态块内部取值错误:资源级for_each的迭代变量是each,动态块的迭代变量默认和动态块同名,也就是这里要使用metric_query.value取当前遍历到的指标配置,不能用each.value
  • 额外配置错误:原代码中evaluation_periods赋值为each.value.period是错误配置,evaluation_periods是告警评估的周期数,不是单周期时长,结合你配置的datapoints_to_alarm = 2,这里应该改为2,否则会传入21600个评估周期,不符合预期。
修正后的完整资源配置
resource "aws_cloudwatch_metric_alarm" "metrics-withExpression_alarm" {
  for_each            = local.prefix == "production" ? {} : {for index,m in local.alarm_WithExpression : index => m}
  alarm_name          = "${local.prefix}-${each.value.name}"
  comparison_operator = each.value.comparison_operator
  evaluation_periods  = 2 # 可根据实际业务评估需求调整,需大于等于datapoints_to_alarm取值
  threshold           = each.value.threshold
  treat_missing_data  = each.value.treat_missing_data
  datapoints_to_alarm = each.value.data_points

  metric_query {
    id          = "e"
    expression  = each.value.expression
    return_data = true # 布尔值无需加引号
  }

  dynamic "metric_query" {
    # 遍历当前告警对应的metrics列表
    for_each = {for index, metric in each.value.metrics : index => metric}
    content {
      id = metric_query.value.id

      metric {
        metric_name = metric_query.value.name
        namespace   = "${local.prefix}-metrics"
        period      = metric_query.value.period
        stat        = metric_query.value.statistic
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者Akram Dhiabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:15:10