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
相关产品推荐
相关产品推荐

