
「我 SSH 上去改一下設定就好」——這句話是基礎設施災難的起點。手動改的東西沒有版本、沒有審核、出事沒辦法回退。IaC 和 CI/CD 不是因為潮流,是因為你的手動操作遲早會出事。
先講結論
把基礎設施當程式碼管理(IaC)、用 pipeline 自動化交付(CI/CD)、讓 Git 成為唯一真相來源(GitOps)。做到這三件事,你的基礎設施就是可重現、可回退、可追蹤的產品,而不是「只有那個人知道怎麼弄」的黑箱。
IaC:State 管理才是重點
大家都知道 Terraform 好用,但很多人忽略了最關鍵的部分:state。
Terraform state 是 IaC 的心臟。它記錄「現實世界長什麼樣子」。State 放在本地?那你跟同事同時 apply 就會互相覆蓋。State 沒有 lock?兩個 pipeline 同時跑就是災難。
terraform {
backend "s3" {
bucket = "infra-tfstate"
key = "prod/vpc.tfstate"
region = "ap-northeast-1"
dynamodb_table = "tfstate-lock"
encrypt = true
}
}Remote backend + state lock,這是最低要求。沒有這個,你的 IaC 只是「比較好看的腳本」。
Pipeline:先測試,再驗證,才部署
CI/CD 不是「自動部署」這麼簡單。它是一個品質閘門。
name: infra-ci
on:
push:
paths:
- "infra/**"
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- run: terraform fmt -check
- run: terraform validate
- run: terraform plan -out tfplanterraform plan 是你的安全網。它告訴你「如果你 apply,會發生什麼」。我見過有人把 plan 跳過直接 apply,然後把 prod 的 VPC 刪掉。那天整個團隊的臉色很精彩。
GitOps:Git 就是真相
GitOps 的核心很簡單:Git repo 裡的東西 = 實際環境的狀態。所有改動走 PR、有審核、有紀錄。自動化 agent(Argo CD、Flux)負責把 Git 的狀態同步到環境。
比起「某個人 SSH 上去改了什麼」,GitOps 讓你永遠可以回答:現在跑的是什麼版本、誰批准的、什麼時候改的。
Drift Detection:你改了,但忘了同步
有人手動在 AWS console 改了 security group,但 Terraform code 沒更新。下次 apply 的時候——啪,手動改的東西全部被覆蓋。
做法:定期跑 terraform plan,有差異就告警。更理想的做法是禁止手動改動,所有變更都走 PR。
環境分層和部署策略
dev、staging、prod 要有獨立資源、獨立權限、獨立監控。不要共用。我看過 staging 和 prod 共用同一個 DB,有人在 staging 跑 migration 結果把 prod 資料改了。
部署策略的選擇:藍綠部署適合「要嘛全切、要嘛全退」的場景;金絲雀適合「先讓 5% 流量試試水溫」。選哪個取決於你的風險容忍度和回退速度。
交付指標:不量化就無法改善
DORA 四大指標:Lead time(從 commit 到上線多久)、Deploy frequency(多常部署)、Change failure rate(部署失敗率)、MTTR(故障恢復時間)。
不用每個都追蹤。但至少知道你的 lead time 是 1 小時還是 1 週——差距很大,改善方向也完全不同。
手動操作就像用記憶力管帳。小額沒問題,但金額一大、筆數一多,你一定會記錯。IaC 和 CI/CD 就是你的帳本和自動轉帳。