Terraform嵌套条件表达式语法错误排查求助
Terraform嵌套条件表达式语法错误排查
问题场景
需排查一段模拟else-if逻辑的Terraform嵌套条件表达式语法错误,逻辑本身无问题,但分支间的语法连接导致逻辑失效。执行terraform init时触发以下错误:
- “此字符未在语言中使用”
- “引号字符串不能跨行”
- “预期表达式开头但找到无效表达式标记”
问题代码
"(${length(regexall("(?i)READ$", "${trimspace(each.value.access_type)}" )) > 0 ? "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__R" : ( ${length(regexall("(?i)READ_WRITE", "${trimspace(each.value.access_type)}" )) > 0 "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__RW" : ( ${length(regexall("(?i)READ_WRITE_CTRL", "${trimspace(each.value.access_type)}" )) > 0 "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__RWC" : null))})"
可运行的非嵌套版本代码
"${length(regexall("(?i)READ$", "${trimspace(each.value.access_type)}" )) > 0 ? "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__R" : "TEST"}"
错误分析与修正
核心错误点
- 嵌套条件语法缺失:Terraform三元表达式结构为
条件 ? 结果1 : 结果2,嵌套时每个后续条件判断必须保留完整的?符号,问题代码中第二、第三个条件前均缺少该符号。 - 括号配对错误:嵌套分支的括号未正确闭合,导致语法解析混乱。
- 字符串跨行问题:双引号包裹的字符串直接跨行,Terraform默认不允许这种写法,需确保插值表达式内的换行不破坏字符串结构。
修正后的代码
"${length(regexall("(?i)READ$", trimspace(each.value.access_type))) > 0 ? "_AR_${substr(split(",", trimspace(each.value.parameter_names))[0], 9, -1)}__${substr(split(",", trimspace(each.value.parameter_names))[1], 7, -1)}__R" : length(regexall("(?i)READ_WRITE", trimspace(each.value.access_type))) > 0 ? "_AR_${substr(split(",", trimspace(each.value.parameter_names))[0], 9, -1)}__${substr(split(",", trimspace(each.value.parameter_names))[1], 7, -1)}__RW" : length(regexall("(?i)READ_WRITE_CTRL", trimspace(each.value.access_type))) > 0 ? "_AR_${substr(split(",", trimspace(each.value.parameter_names))[0], 9, -1)}__${substr(split(",", trimspace(each.value.parameter_names))[1], 7, -1)}__RWC" : null }"
额外优化
- 移除不必要的嵌套插值(如
"${trimspace(...)}"可直接写trimspace(...)),简化表达式结构。 - 调整换行缩进,让嵌套层级更清晰,避免语法解析歧义。
内容的提问来源于stack exchange,提问作者Tomas Gryzbon
相关产品推荐
相关产品推荐

