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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:44:56