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

Terraform本地变量转换报错:metrics属性不存在问题求助

问题:Terraform遍历metrics_config创建metric_info时触发属性不存在错误

我想借助local.metrics_config变量的值创建metric_info变量,试了好几种方法都失败了,猜测可能需要把metrics进一步提取,比如写成metric_config = [ + metrics = {]而不是metric_config = [ + { + metrics = {]。


尝试的metric_info代码

# Metrics info
    metric_info = [
          {
            metrics = merge([
              for metric_config in local.metrics_config :
              {
                for metric_name, metric_data in metric_config.metrics :
                metric_name => {
                  name          = metric_data.name
                  metric_table  = metric_config.metrics_table_id
                  numerator     = metric_data.numerator
                  denominator   = metric_data.denominator
                }
              }
              ]...)
          }
        ]

metrics_config的取值

metrics_config = [
  {
    "metrics" = {
      "time_to_first_play_per_login" = {
        "active" = 1
        "category" = "Métrica de vídeo"
        "denominator" = "experiment_login_count"
        "description" = "Tempo médio que cada usuário leva para dar o primeiro play em algum vídeo"
        "metric_title" = "Tempo para o Primeiro Play por Usuário"
        "metric_type_id" = 2
        "name" = "time_to_first_play_per_login"
        "numerator" = "total_time_to_first_play"
      }
      "time_to_first_play_per_session" = {
        "active" = 1
        "category" = "Métrica de vídeo"
        "denominator" = "experiment_session_count"
        "description" = "Tempo médio que cada sessão leva para dar o primeiro play em algum vídeo"
        "metric_title" = "Tempo para o Primeiro Play por Sessão"
        "metric_type_id" = 2
        "name" = "time_to_first_play_per_session"
        "numerator" = "total_time_to_first_play"
      }
      "time_to_first_play_per_user" = {
        "active" = 1
        "category" = "Métrica de vídeo"
        "denominator" = "experiment_user_count"
        "description" = "Tempo médio que cada usuário leva para dar o primeiro play em algum vídeo"
        "metric_title" = "Tempo para o Primeiro Play por Usuário"
        "metric_type_id" = 2
        "name" = "time_to_first_play_per_user"
        "numerator" = "total_time_to_first_play"
      }
    }
    "subfolder" = "time_to_first_play"
  },
  {
    "metrics_table_id" = "time_to_first_play"
    "routine_id" = "proc_globo_ab_time_to_first_play"
    "subfolder" = "time_to_first_play"
    "time_partitioning" = "DAY"
  },
  {
    "metrics" = {
      "time_to_second_play_per_creator" = {
        "active" = 1
        "category" = "Métrica de vídeo"
        "denominator" = "experiment_user_count"
        "description" = "Tempo médio que cada usuário leva para dar o primeiro play em algum vídeo"
        "metric_title" = "Tempo para o Primeiro Play por Usuário"
        "metric_type_id" = 2
        "name" = "time_to_second_play_per_user"
        "numerator" = "total_time_to_second_play"
      }
      "time_to_second_play_per_login" = {
        "active" = 1
        "category" = "Métrica de vídeo"
        "denominator" = "experiment_user_count"
        "description" = "Tempo médio que cada usuário leva para dar o primeiro play em algum vídeo"
        "metric_title" = "Tempo para o Primeiro Play por Usuário"
        "metric_type_id" = 2
        "name" = "time_to_second_play_per_user"
        "numerator" = "total_time_to_second_play"
      }
      "time_to_second_play_per_name" = {
        "active" = 1
        "category" = "Métrica de vídeo"
        "denominator" = "experiment_session_count"
        "description" = "Tempo médio que cada sessão leva para dar o primeiro play em algum vídeo"
        "metric_title" = "Tempo para o Primeiro Play por Sessão"
        "metric_type_id" = 2
        "name" = "time_to_second_play_per_session"
        "numerator" = "total_time_to_second_play"
      }
    }
    "subfolder" = "time_to_second_play"
  },
  {
    "metrics_table_id" = "time_to_second_play"
    "routine_id" = "proc_globo_ab_time_to_second_play"
    "subfolder" = "time_to_second_play"
    "time_partitioning" = "DAY"
  },
]

报错信息(翻译后)

│ 错误:不支持的属性
│ 
│   在 main.tf 第64行,locals块中:
│   64:           for metric_name, metric_data in metric_config.metrics :
│ 
│ 该对象没有名为"metrics"的属性。
╵

问题原因与解决方案

问题根源

你的metrics_config列表里并非所有元素都包含metrics属性——比如第2、4个元素只有metrics_table_id、routine_id等字段,没有metrics。直接遍历所有元素并访问metric_config.metrics会触发属性不存在错误。

方案1:仅处理包含metrics的条目

如果暂时不需要关联metrics_table_id,可以先过滤出有metrics属性的元素再处理:

# Metrics info
metric_info = [
  {
    metrics = merge([
      # 过滤出包含metrics属性的配置项
      for metric_config in local.metrics_config :
      if contains(keys(metric_config), "metrics")
      {
        for metric_name, metric_data in metric_config.metrics :
        metric_name => {
          name          = metric_data.name
          # 若当前元素无metrics_table_id,设为空值或后续补充
          metric_table  = lookup(metric_config, "metrics_table_id", "")
          numerator     = metric_data.numerator
          denominator   = metric_data.denominator
        }
      }
    ]...)
  }
]

方案2:关联同subfolder的metrics_table_id

如果需要把metrics和对应subfolder的metrics_table_id关联,先构建映射表再处理:

locals {
  # 先创建subfolder到metrics_table_id的映射
  subfolder_to_table = {
    for item in local.metrics_config :
    item.subfolder => item.metrics_table_id
    if contains(keys(item), "metrics_table_id")
  }

  # 构建最终的metric_info
  metric_info = [
    {
      metrics = merge([
        for metric_config in local.metrics_config :
        if contains(keys(metric_config), "metrics")
        {
          for metric_name, metric_data in metric_config.metrics :
          metric_name => {
            name          = metric_data.name
            # 通过subfolder获取对应表ID
            metric_table  = local.subfolder_to_table[metric_config.subfolder]
            numerator     = metric_data.numerator
            denominator   = metric_data.denominator
          }
        }
      ]...)
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:45:08