Terragrunt最佳实践:多环境模块间依赖配置的DRY优化方案
问题解答
方案可行性结论
你期望在Terraform模块中直接引用dependency.vpc.outputs.vpc_id的实现方式不可行:dependency是Terragrunt专属的运行时语法,仅在Terragrunt解析配置阶段生效,Terraform核心本身不识别该关键字,Terraform模块执行时脱离Terragrunt上下文,无法获取对应依赖输出。
最优DRY实践(无需引入terraform_remote_state)
利用Terragrunt原生的公共配置继承+路径动态解析能力即可解决重复配置问题,不需要额外引入其他组件:
- 把通用的依赖声明、输入参数配置统一放到根目录的
terragrunt.hcl中,通过动态路径变量适配不同环境:
# 根目录terragrunt.hcl新增内容 locals { # 动态获取当前运行的模块名,比如envs/dev/rds-sg解析后为rds-sg current_module = basename(get_terragrunt_dir()) # 动态获取当前环境的根目录,比如envs/dev/rds-sg解析后为envs/dev current_env_root = dirname(get_terragrunt_dir()) } # 仅对rds-sg模块注入依赖和对应输入 if local.current_module == "rds-sg" { dependencies { paths = ["${local.current_env_root}/vpc"] } dependency "vpc" { config_path = "${local.current_env_root}/vpc" } inputs = merge(inputs, { vpc_id = dependency.vpc.outputs.vpc_id }) }
- 调整后所有环境下
rds-sg目录的terragrunt.hcl可以精简到仅保留必要的环境差异化配置,没有重复代码,后续修改依赖、新增输入只需要修改根目录的公共配置即可。
- 如果有多个模块有公共依赖配置,也可以单独创建公共配置文件,对应模块通过
include指令引入,比条件判断逻辑更清晰。
terraform_remote_state方案的劣势
如果用terraform_remote_state实现,需要硬编码状态存储的桶名、路径前缀等信息,还要额外处理不同环境的状态路径区分,反而会引入更多冗余配置,维护成本高于Terragrunt原生的dependency方案,不推荐使用。
内容的提问来源于stack exchange,提问作者Truemoonfans
相关产品推荐
相关产品推荐

