Terraform local variable with map

109 views Asked by At

I want to create this metric_info variable using the values of the metric_config variable I tried some ways but without success. The reported error is there below. Maybe bringing the metrics out further like this metric_config = [ + metrics = { and not metric_config = [ + { + metrics = {

    # 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
                }
              }
              ]...)
          }
        ]
metric_config receives this value:
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"
  },
]

I am getting the following error:

    │ Error: Unsupported attribute
    │ 
    │   on main.tf line 64, in locals:
    │   64:           for metric_name, metric_data in metric_config.metrics :
    │ 
    │ This object does not have an attribute named "metrics".
    ╵
1

There are 1 answers

0
lubi_nascimento On

Its working! I add the lookup for "metric" keys.


    metric_info = [
      {
        metrics = merge([
          for metric_config in local.metrics_config :
            lookup(metric_config, "metrics", null) != null ? {
              for metric_name, metric_data in metric_config.metrics :
              metric_name => {
                name          = metric_data.name
                # metric_table  = metric_config.metric_table
                numerator     = metric_data.numerator
                denominator   = metric_data.denominator
              }
            } : {}
          ]...)
      }
    ]