首次使用Terragrunt,如何实现Terraform根模块架构?
在Terragrunt中保留Terraform单根模块+子模块结构的实现方案
核心思路澄清
Terragrunt是Terraform的封装工具,不需要强制改成多独立模块的live示例结构。如果你习惯Terraform官方推荐的「单根模块(根main.tf)调用子模块」模式,完全可以沿用该结构,只需要通过根目录的terragrunt.hcl做全局配置,无需使用run-all命令(该命令针对多独立Terraform配置场景)。
具体实现步骤
1. 调整项目结构
保留原有Terraform模块结构,同时在根目录添加terragrunt.hcl作为全局配置文件:
├── terragrunt.hcl # 根Terragrunt全局配置 ├── main.tf # Terraform根模块(调用子模块) ├── variables.tf # 根模块变量定义 ├── outputs.tf # 根模块输出 └── modules/ # 子模块目录 ├── module1/ │ ├── main.tf │ ├── variables.tf │ └── outputs.tf └── module2/ ├── main.tf ├── variables.tf └── outputs.tf
2. 配置根terragrunt.hcl
该文件用来统一管理全局配置,解决重复初始化、密钥共享问题:
# 配置远程状态存储(统一管理状态文件,避免多模块分散) remote_state { backend = "s3" config = { bucket = "your-state-bucket-name" key = "${path_relative_to_include()}/terraform.tfstate" region = "your-region" encrypt = true dynamodb_table = "your-state-lock-table" # 可选,用于状态锁 } } # 自动生成Provider配置(无需在Terraform文件中重复编写) generate "provider" { path = "provider.tf" if_exists = "overwrite_terragrunt" contents = <<EOF provider "aws" { region = "your-region" # 密钥通过环境变量、AWS凭证文件或IAM角色自动获取,避免硬编码 # 例如:profile = "${get_env("AWS_PROFILE", "default")}" } EOF } # 可选:全局变量传递(统一管理环境变量、通用参数) terraform { extra_arguments "global_vars" { commands = get_terraform_commands_that_need_vars() arguments = [ "-var=environment=${get_env("ENV", "dev")}", "-var-file=./common.tfvars" # 通用变量文件 ] } }
3. 日常操作方式
直接在根目录执行Terragrunt命令,和原生Terraform操作完全一致,只会执行一次初始化,密钥全局生效:
- 初始化:
terragrunt init - 执行计划:
terragrunt plan - 应用变更:
terragrunt apply
关键问题解决
- 重复初始化问题:因为是单根Terraform配置,
terragrunt init只会执行一次,无需每个子模块单独初始化。 - 密钥共享问题:通过环境变量(如
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY)、AWS凭证文件或IAM角色统一提供密钥,整个根模块共用一套凭证,无需在每个模块中重复配置。
与live示例结构的区别
Terragrunt的live示例是为多独立Terraform项目设计的(比如app、mysql、vpc各自是独立的Terraform配置),这类场景需要用run-all批量操作;而你的场景是单一Terraform配置(根模块调用子模块),属于单体项目,直接使用Terragrunt的普通命令即可。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

