如何通过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
```
---
