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

首次使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:06:46