如何通过Terraform和Terragrunt高效管理AWS基础设施项目?

摘要:# IaC - 基础设施即代码 > 使用 Terraform + Terragrunt 管理 AWS 基础设施 ## 目录 - [一、概述](#一概述) - [二、可用模块](#二可用模块) - [三
# IaC - 基础设施即代码 > 使用 Terraform + Terragrunt 管理 AWS 基础设施 --- ## 目录 - [一、概述](#一概述) - [二、可用模块](#二可用模块) - [三、项目结构](#三项目结构) - [四、快速开始](#四快速开始) - [五、模块使用示例](#五模块使用示例) - [六、贡献指南](#六贡献指南) - [七、最佳实践](#七最佳实践) --- ## 一、概述 ### 1.1 文档资源 | 文档 | 说明 | |------|------| | [devops-iac-terraform-modules](https://github.com/LiquidityTech/devops-iac-terraform-modules/tree/main) | Terraform 模块仓库 | | IaC 完整使用指南 | 涵盖所有 IaC 项目的完整文档 | | IaC 快速参考手册 | 常用命令和配置速查 | ### 1.2 技术栈 | 工具 | 版本要求 | |------|---------| | **Terraform** | >= 1.8.0 | | **AWS Provider** | >= 6.0.0 | | **Terragrunt** | >= 0.72.0 | --- ## 二、可用模块 ### 2.1 AWS 模块 | 模块 | 路径 | 说明 | 使用项目 | |------|------|------|----------| | **EC2** | `modules/aws/ec2` | EC2 实例管理 | devops-iac-ec2 | | **EKS** | `modules/aws/eks` | EKS 集群管理 | devops-iac-eks | | **IAM** | `modules/aws/iam` | IAM 权限管理 | devops-iac-iam | | **Route53** | `modules/aws/route53` | DNS 管理 | devops-iac-dns | | **Secrets Manager** | `modules/aws/secrets-manager` | 密钥管理 | devops-iac-secrets | ### 2.2 相关项目 | 项目 | 说明 | |------|------| | **devops-iac-secrets** | AWS Secrets Manager 密钥管理 | | **devops-iac-dns** | Route53 DNS 管理 | | **devops-iac-ec2** | EC2 实例管理 | | **devops-iac-eks** | EKS 集群管理 | | **devops-iac-iam** | IAM 权限管理 | --- ## 三、项目结构 ``` devops-terraform-modules/ ├── modules/ # Terraform 模块 │ └── aws/ # AWS 相关模块 │ ├── ec2/ # EC2 实例模块 │ ├── eks/ # EKS 集群模块 │ ├── iam/ # IAM 权限模块 │ ├── route53/ # DNS 管理模块 │ └── secrets-manager/ # 密钥管理模块 ├── examples/ # 使用示例 └── docs/ # 文档目录 ├── IaC-Complete-Guide.md # 完整使用指南 └── IaC-Quick-Reference.md # 快速参考手册 ``` --- ## 四、快速开始 ### 4.1 使用模块 在 Terragrunt 配置中引用模块: ```hcl terraform { source = "git::https://github.com/LiquidityTech/devops-iac-terraform-modules.git//modules/aws/ec2?ref=v1.0.0" } ``` ### 4.2 版本管理 推荐使用特定版本或 tag: ```hcl # 使用 tag 版本(推荐) source = "...?ref=v1.0.0" # 使用分支(开发环境) source = "...?ref=main" # 使用 commit hash(精确控制) source = "...?ref=abc123" ``` --- ## 五、模块使用示例 ### 5.1 EC2 模块 ```hcl terraform { source = "git::https://github.com/LiquidityTech/devops-iac-terraform-modules.git//modules/aws/ec2?ref=main" } inputs = { instance_list = { "my-server" = { ami_id = "ami-xxxxx" instance_type = "t3.medium" subnet_id = "subnet-xxxxx" security_groups = ["sg-xxxxx"] tags = { Name = "my-server" Env = "prod" } } } } ``` ### 5.2 Secrets Manager 模块 ```hcl terraform { source = "git::https://github.com/LiquidityTech/devops-iac-terraform-modules.git//modules/aws/secrets-manager?ref=main" } inputs = { secrets = { "prod/app/db-password" = { description = "Database password" recovery_window_in_days = 7 secret_string = jsonencode({ username = "admin" password = "secure-password" }) create_read_only_policy = true } } } ``` ### 5.3 Route53 模块 ```hcl terraform { source = "git::https://github.com/LiquidityTech/devops-iac-terraform-modules.git//modules/aws/route53/private-zone?ref=main" } inputs = { zone_name = "internal.example.com" primary_vpc_id = "vpc-xxxxx" primary_vpc_region = "ap-northeast-1" dns_records = { "api.internal.example.com" = { type = "CNAME" ttl = 300 records = ["lb.amazonaws.com"] } } } ``` ### 5.4 IAM 模块 ```hcl terraform { source = "git::https://github.com/LiquidityTech/devops-iac-terraform-modules.git//modules/aws/iam?ref=main" } inputs = { roles = { "my-app-role" = { assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } Action = "sts:AssumeRole" }] }) policies = { "s3-access" = { policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = ["s3:GetObject", "s3:ListBucket"] Resource = ["arn:aws:s3:::my-bucket/*"] }] }) } } } } } ``` --- ## 六、贡献指南 ### 6.1 添加新模块 1. 在 `modules/aws/` 下创建模块目录 2. 编写模块代码(main.tf, variables.tf, outputs.tf) 3. 添加 README.md 说明 4. 在 `examples/` 中添加使用示例 5. 提交 Pull Request ### 6.2 更新现有模块 1. 创建功能分支 2. 修改模块代码 3. 更新版本号和 CHANGELOG 4. 测试模块功能 5. 提交 Pull Request ### 6.3 版本发布 ```bash # 1. 更新版本号 git tag -a v1.0.0 -m "Release version 1.0.0" # 2. 推送 tag git push origin v1.0.0 # 3. 创建 GitHub Release ``` --- ## 七、最佳实践 ### 7.1 模块设计 | 原则 | 说明 | |------|------| | 保持模块简单和专注 | 单一职责 | | 提供清晰的输入和输出 | 文档完善 | | 使用有意义的变量名 | 可读性强 | | 添加详细的文档和示例 | 易于使用 | | 支持标签和命名规范 | 便于管理 | ### 7.2 版本管理 | 原则 | 说明 | |------|------| | 使用语义化版本(Semantic Versioning) | MAJOR.MINOR.PATCH | | 维护 CHANGELOG | 记录变更历史 | | 向后兼容性 | 避免破坏性变更 | | 在 README 中说明破坏性变更 | 提前告知用户 | ### 7.3 测试 | 原则 | 说明 | |------|------| | 在开发环境测试新功能 | 先测后用 | | 验证向后兼容性 | 升级无影响 | | 测试边界情况 | 覆盖异常场景 | | 文档化测试步骤 | 可重复验证 | --- ## 八、常用命令 ### 8.1 Terragrunt 命令 ```bash # 初始化 terragrunt init # 计划 terragrunt plan # 应用 terragrunt apply # 销毁 terragrunt destroy # 格式化 terragrunt fmt # 验证 terragrunt validate ``` ### 8.2 批量操作 ```bash # 在所有子目录执行 plan terragrunt run-all plan # 在所有子目录执行 apply terragrunt run-all apply # 查看依赖图 terragrunt graph-dependencies ``` ---