Terraform locals作用域是否覆盖子模块?澄清根模块局部值可见误解
Terraform 根模块Local值能否被子模块访问?
Terraform的局部值(locals)作用域严格限定在其声明的模块内,根模块的local值无法直接在子模块内部访问,你遇到的是对代码上下文的误解。
HashiCorp官方文档明确说明:
局部值仅能在其声明所在模块的表达式中访问
分析你的代码示例
你提供的代码里,local.a和local.b是在根模块的module "child"调用块中使用的,这个调用块属于根模块的配置上下文,完全符合局部值的作用域规则——根模块的local自然能在根模块内部的任何表达式里使用,包括模块调用的参数(比如for_each)。
而你的子模块./child的代码(some.tf)中,根本没有尝试访问根模块的local.a或local.b,子模块的资源配置完全独立,没有引用父模块的局部值。你之前误以为根模块的local在子模块可见,本质是混淆了「模块调用的上下文(父模块)」和「子模块内部的上下文」。
正确的跨模块传递方式
如果需要让子模块使用父模块的局部值,必须通过**子模块的输入变量(variable)**显式传递:
- 在子模块
./child中定义变量:
variable "parent_a" { type = number }
- 在根模块的调用块中传递值:
module "child" { source = "./child" parent_a = local.a }
此时子模块才能通过var.parent_a访问到根模块的local.a。
内容的提问来源于stack exchange,提问作者Alexander Ites
相关产品推荐
相关产品推荐

