Terraform Heredoc与缩进Heredoc行为不符预期的问题排查
Terraform Heredoc 与缩进Heredoc 行为误解解析
我原本以为Terraform中普通Heredoc和带-的缩进Heredoc对缩进的处理逻辑不同,但实际测试后二者表现一致,困惑点在于缩进Heredoc并没有按照正文首行的缩进级别修剪后续行的前导空格。
测试代码
locals { here = <<EOF One two three four EOF } locals { here_indented = <<-EOF One two three four EOF } output "here" { value = local.here } output "here_indented" { value = local.here_indented }
执行terraform plan的输出
+ here = <<-EOT One two three four EOT + here_indented = <<-EOT One two three four EOT
我的预期
- 普通Heredoc应因分隔符
EOF缩进而报错 - 缩进Heredoc应因首行无缩进,修剪第2至4行的前导空格
尝试用插值字符串${local.here_indented}输出,结果仍一致,请问哪里理解有误?
核心误解点纠正
1. 普通Heredoc不会报错的原因
Terraform普通Heredoc(不带-)并没有强制要求结束标记顶格,它的规则是结束标记必须与所在行的内容完全匹配。你代码里普通Heredoc的结束标记是带4个前导空格的 EOF,Terraform能正确识别这个标记,所以不会报错。只有当你定义的结束标记是顶格EOF,但实际写的时候加了缩进,才会出现无法匹配的报错。
2. 缩进Heredoc的修剪逻辑不是看正文首行
缩进Heredoc(带-)的修剪依据是结束标记的缩进级别,而非正文首行的缩进。它会自动移除所有正文行开头、与结束标记前导空格数量相同的空格。
以你的代码为例,结束标记EOF前面有4个空格:
- 第一行
One开头无空格,保持原样 - 第二到第四行
two等开头的4个空格,会被完全修剪,最终变成two、three、four
你看到的terraform plan输出是Terraform格式化后的展示形式,并非字符串的真实内容。要查看实际值,可通过terraform console验证:
> local.here "One\n two\n three\n four" > local.here_indented "One\ntwo\nthree\nfour"
3. 插值字符串测试的结果说明
用${local.here_indented}输出结果看似一致,是因为插值字符串只是直接引用变量值,不会改变字符串本身的内容。plan的展示格式让你产生了误解,实际值已经完成了缩进修剪。
内容的提问来源于stack exchange,提问作者codeforester
相关产品推荐
相关产品推荐

