Terraform 基礎
Vibe Prompt
「幫我寫 Terraform 設定檔:在 AWS 建立一個 t3.micro EC2,安裝 Nginx,開啟 80 埠。」
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_security_group" "web_sg" {
name = "web-server-sg"
description = "Allow HTTP"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "web" {
ami = "ami-0d527b8c"
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.web_sg.id]
user_data = <<-EOF
#!/bin/bash
apt update && apt install -y nginx
systemctl start nginx
EOF
tags = { Name = "Vibe Tutor Web" }
}
output "public_ip" {
value = aws_instance.web.public_ip
}
常用指令
terraform init # 初始化
terraform plan # 預覽變更
terraform apply # 套用變更
terraform destroy # 銷毀資源
terraform fmt # 格式化程式碼
關鍵要點
- ✅ 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 中的所有資源 |
為什麼 Infrastructure as Code 改變了一切?
在 Terraform 出現之前,部署基礎設施是這樣的:
- 工程師登入 AWS 主控台
- 手動點擊建立 VPC
- 手動點擊建立 EC2
- 手動設定 Security Group
- ...(誰記得他點了什麼?)
六個月後,某台 EC2 掛了。沒有人知道它是怎麼建立的。
這就是 Snowflake Server(雪球伺服器)問題——每一台伺服器都是獨一無二的雪花,沒有人能複製它。
Terraform 解決的問題
| 問題 | 傳統方式 | Terraform |
|:----:|:--------:|:---------:|
| 可重複性 | 每次手動點擊,結果可能不同 | 同一份程式碼永遠產生同樣的結果 |
| 可版本控制 | 沒有人記錄建立過程 | .tf 檔案放在 Git 中,完整歷史紀錄 |
| 可審計 | 誰在什麼時候改了什麼?不知道 | Git log 一目了然 |
| 可摧毀 | 一個一個手動刪除 | terraform destroy 一鍵刪除所有資源 |
| 可共享 | 寄送截圖和說明文件 | 直接分享 .tf 檔案 |
下一章預告:從基礎到 State
Terraform 的核心概念你已經掌握了——宣告式配置、Provider、資源定義。但 Terraform 真正強大的地方在於它的 State 管理——Terraform 怎麼知道哪些資源是真實存在的?多人協作時怎麼避免衝突?
下一章 Terraform State 將深入探討這些問題。