Terragrunt疑问:root.hcl中find_in_parent_folders()为何能找到子目录配置文件?
我在使用Terragrunt时遇到一个疑问:我的root.hcl配置里用find_in_parent_folders()函数读取account.hcl、region.hcl和env.hcl文件,按函数设计它是从当前目录向上(从下到上)查找文件,但我发现它确实能找到目标配置文件,想知道具体原因和工作原理。
我的root.hcl配置如下:
locals { account_vars = read_terragrunt_config(find_in_parent_folders("account.hcl")) region_vars = read_terragrunt_config(find_in_parent_folders("region.hcl")) env_vars = read_terragrunt_config(find_in_parent_folders("env.hcl")) }
项目目录结构:
├── demo │ ├── account.hcl │ └── us-east-1 │ ├── dev │ │ ├── env.hcl │ │ └── vpc │ │ └── terragrunt.hcl │ └── region.hcl └── root.hcl
我猜测它的工作方式类似C++的include——当在底层文件夹(比如vpc)执行terragrunt apply时,会向上遍历目录并将配置内容导入自身,但没找到相关依据,想了解具体工作原理。
解答
find_in_parent_folders()的核心工作逻辑非常直接:从执行Terragrunt命令的当前工作目录开始,逐层向上遍历父目录,直到找到指定文件名的文件,或者到达文件系统根目录为止。
结合你的场景,当你在vpc目录下执行terragrunt apply时:
- 查找
account.hcl:遍历路径为vpc→dev→us-east-1→demo,最终在demo目录下找到目标文件 - 查找
region.hcl:遍历路径为vpc→dev→us-east-1,在us-east-1目录下找到目标文件 - 查找
env.hcl:遍历路径为vpc→dev,在dev目录下找到目标文件
另外需要明确一个关键细节:你的root.hcl能被加载执行,是因为子目录的terragrunt.hcl通常会通过include块引入根配置(比如include "root" { path = find_in_parent_folders("root.hcl") })。此时root.hcl中find_in_parent_folders()的执行上下文,依然是你执行命令时的当前工作目录(即vpc目录),而不是root.hcl所在的目录——这就是它能精准定位到各层级配置文件的核心原因。
这种设计的目的,就是为了让多环境、多区域的Terraform配置能通过目录层级自动关联,无需手动硬编码文件路径,大幅提升配置的可维护性。
内容的提问来源于stack exchange,提问作者dim

