多環境管理
Vibe Prompt
「幫我建立 Terraform 多環境架構:dev/staging/prod 三個環境使用同一份模組但不同變數。」
# environments/dev/main.tf
module "vpc" {
source = "../../modules/vpc"
vpc_cidr = "10.0.0.0/16"
environment = "dev"
public_subnets = ["10.0.1.0/24"]
private_subnets = ["10.0.10.0/24"]
}
# environments/prod/main.tf
module "vpc" {
source = "../../modules/vpc"
vpc_cidr = "10.0.0.0/16"
environment = "prod"
public_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
private_subnets = ["10.0.10.0/24", "10.0.20.0/24", "10.0.30.0/24"]
}
部署指令
terraform -chdir=environments/dev init
terraform -chdir=environments/dev plan -var-file="dev.tfvars"
terraform -chdir=environments/dev apply -var-file="dev.tfvars" -auto-approve
最佳實踐
- dev: 最小資源,節省成本
- staging: 與 prod 相同規格但不同域名
- prod: 完整 HA 架構
關鍵要點
- ✅ Terraform = Infrastructure as Code (IaC) 的業界標準
- ✅ HCL (HashiCorp Configuration Language) 宣告式定義基礎設施
- ✅
terraform plan顯示將要做的變更,apply執行變更 - ✅ State File (terraform.tfstate) 是真實世界的來源比對
- ✅ Module 讓基礎設施程式碼可以重用
常用命令
| 命令 | 用途 |
|------|------|
| terraform init | 初始化工作目錄,下載 Provider |
| terraform fmt | 格式化程式碼 |
| terraform validate | 驗證語法正確性 |
| terraform plan | 顯示執行計畫 |
| terraform apply | 執行變更 |
| terraform destroy | 刪除所有資源 |
| terraform state list | 列出 State 中的所有資源 |
目錄結構最佳實踐
terraform/
├── modules/
│ ├── networking/ # VPC, subnets, firewall
│ ├── compute/ # EC2, ASG, ECS
│ └── database/ # RDS, ElastiCache
├── environments/
│ ├── dev/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── terraform.tfvars # dev-specific values
│ │ └── backend.tf
│ ├── staging/
│ └── production/
└── global/
├── iam.tf
└── route53.tf
Workspace vs 目錄
| 方法 | 適合規模 | 程式碼重複 | 管理複雜度 | |:----:|:--------:|:---------:|:----------:| | Workspace | 小型專案 | 低(共用程式碼) | 低 | | 目錄結構 | 中大型專案 | 中(部分重複) | 中 | | Terragrunt | 大型專案 | 極低(DRY) | 高 |
環境差異建議
# dev/main.tf
module "app" {
source = "../../modules/compute"
env = "dev"
instance_type = "t3.micro"
min_size = 1
max_size = 2
}
# production/main.tf
module "app" {
source = "../../modules/compute"
env = "prod"
instance_type = "t3.large"
min_size = 3
max_size = 10
}
多環境管理:開發、測試、正式
為什麼需要多環境?
直接改正式環境是災難。多環境管理讓你在開發環境測試變更,確認沒問題後再部署到正式環境。
多環境策略
# environments/dev/network.tf
module "network" {
source = "../modules/network"
env = "dev"
vpc_cidr = "10.0.0.0/16"
}
# environments/prod/network.tf
module "network" {
source = "../modules/network"
env = "prod"
vpc_cidr = "10.1.0.0/16"
instance_type = "t3.large"
}
環境目錄結構
terraform/
├── modules/ # 共用模組
│ ├── network/ # 網路模組
│ ├── compute/ # 運算模組
│ └── database/ # 資料庫模組
├── environments/
│ ├── dev/ # 開發環境
│ │ └── terragrunt.hcl
│ ├── staging/ # 測試環境
│ │ └── terragrunt.hcl
│ └── prod/ # 正式環境
│ └── terragrunt.hcl
下一章預告
這堂 Terraform 課從基礎、State、Module 到多環境 ——你現在可以用程式碼管理雲端基礎設施。