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 和目錄結構來管理多個環境。

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!