通过 Terragrunt 管理 Terraform S3 后端的最佳实践
Terragrunt 简介
Terragrunt 是一个对 Terraform 的轻量级封装器,旨在实现配置的 DRY(Don't Repeat Yourself) 原则。它提供了对多个 Terraform 模块的统一管理能力,并简化了远程状态存储的配置与维护。
🚀 安装 Terragrunt
-
安装 Terraform
-
安装 Terragrunt
-
建议在
~/.bashrc
添加以下内容,用tg
简化terragrunt
命令:# terragrunt bash 补全支持 alias tg=terragrunt complete -C /usr/bin/terraform tg
注:Bash 合并 Terraform 与 Terragrunt 补全较困难,Zsh 更容易实现。详见 Issue #689
-
使用示例(等价于 Terraform 命令):
terragrunt fmt terragrunt init terragrunt plan terragrunt apply
👉 快速开始文档
🗂️ 使用 Terragrunt 构建 Terraform 项目结构
- 每个 Terraform 项目都需要一个最底层的
terragrunt.hcl
文件,供 Terragrunt 读取配置。 - 该文件可以通过
include
引用上层目录的配置,从而实现结构化管理和配置复用。 - 推荐的项目结构如下:
./environments/ ├── prod/ │ └── terraform/ │ ├── beijing/ │ │ ├── 1.vpc/ │ │ │ ├── main.tf │ │ │ └── terragrunt.hcl # 底层配置 │ └── terragrunt.hcl # 区域/环境级别配置 ├── qa/ │ └── terraform/ │ ├── global/ │ │ └── route53-acm/ │ │ ├── main.tf │ │ └── terragrunt.hcl │ └── terragrunt.hcl
- 示例底层
terragrunt.hcl
文件内容:include "root" { path = find_in_parent_folders() }
- 使用
terragrunt hclfmt
格式化.hcl
文件(类似terraform fmt
)
📖 更多信息
☁️ 使用 Terragrunt 配置 S3 后端存储(Remote State)
-
在上层
terragrunt.hcl
中添加remote_state
配置块:remote_state { backend = "s3" generate = { path = "terraform-backend.tf" if_exists = "overwrite" } config = { profile = "pad" allowed_account_ids = ["464542629384"] region = "ap-southeast-1" bucket = "pad-terraform-state" encrypt = true bucket_sse_algorithm = "AES256" dynamodb_table = "terraform-state-locks" key = "pad-deploy/${get_path_from_repo_root()}/terraform.tfstate" } }
key
的含义:coinbridge-deploy
:Git 仓库名${get_path_from_repo_root()}
:当前模块相对于仓库根目录的路径terraform.tfstate
:状态文件名
更多内置函数参考:Terragrunt Built-in Functions
-
在模块目录中执行:
terragrunt init
Terragrunt 会根据配置生成
terraform-backend.tf
,并将状态文件保存至 S3。- 若 S3 bucket 或 DynamoDB 表不存在,Terragrunt 会提示是否创建
- 若已有本地状态文件,Terraform 会提示迁移至远程 S3
-
.terraform/terraform.tfstate
文件仍存在本地,用于记录后端配置,判断是否需要迁移。
📖