Terraform Modules
Vibe Prompt
「幫我建立一個 Terraform Module 用於建立標準的 VPC 架構,包含公有/私有子網、NAT Gateway。」
# modules/vpc/main.tf
variable "vpc_cidr" {}
variable "public_subnets" { type = list(string) }
variable "private_subnets" { type = list(string) }
variable "environment" {}
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = { Name = "vpc-${var.environment}" }
}
resource "aws_subnet" "public" {
count = length(var.public_subnets)
vpc_id = aws_vpc.main.id
cidr_block = var.public_subnets[count.index]
map_public_ip_on_launch = true
tags = { Name = "public-${var.environment}-${count.index}" }
}
resource "aws_subnet" "private" {
count = length(var.private_subnets)
vpc_id = aws_vpc.main.id
cidr_block = var.private_subnets[count.index]
tags = { Name = "private-${var.environment}-${count.index}" }
}
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
tags = { Name = "igw-${var.environment}" }
}
output "vpc_id" { value = aws_vpc.main.id }
output "public_subnet_ids" { value = aws_subnet.public[*].id }
output "private_subnet_ids" { value = aws_subnet.private[*].id }
使用 Module
module "vpc" {
source = "./modules/vpc"
vpc_cidr = "10.0.0.0/16"
public_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
private_subnets = ["10.0.10.0/24", "10.0.20.0/24"]
environment = "production"
}
output "vpc_id" { value = module.vpc.vpc_id }
關鍵要點
- ✅ 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 Module:寫一次,用千次
想像你需要在多個專案中建立同樣的 VPC 架構:
- 一個 VPC 包含 public/private subnet
- 一個 Internet Gateway
- 一個 NAT Gateway
- 適當的路由表
如果你每次都複製貼上同樣的程式碼,當你需要修改時(例如加入一個新的 subnet),你必須手動修改每一個複製的檔案。
Module 解決了這個問題——將共用的基礎設施封裝成一個 Module,然後在不同的環境中重複使用。
Module 的最佳實踐
| 實踐 | 說明 |
|:----:|------|
| Module Registry | 將 Module 發布到 Terraform Registry 或私有 Git 倉庫 |
| 語意化版本 | 使用 ~> 1.0 來鎖定 Major 版本 |
| 最小暴露 | 只暴露必要的變數,內部實作細節盡量隱藏 |
| 文件化 | 每個 Module 需要 README 說明用途和用法 |
| 測試 | 使用 terraform plan 驗證 Module 的輸出結果 |
已發布的 Module 範例
# 使用 AWS VPC Module(來自 Terraform Registry)
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["us-west-2a", "us-west-2b", "us-west-2c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
enable_vpn_gateway = true
tags = {
Environment = "production"
}
}
下一章預告:從 Module 到多環境管理
Module 讓你寫一次程式碼就能在多處使用。但不同環境(dev/staging/prod)需要不同的設定值。下一章 多環境管理 將教你如何使用 Workspace 和目錄結構來管理多個環境。