在 Day 17 我們透過 Terraform 成功建立了雲端資源,像是 VPC、子網與 Load Balancer,初步感受到 Infrastructure as Code(IaC) 的威力。
今天來聊聊 為什麼 IaC 世界裡,同時需要 Terraform 與 Helm。
Infrastructure as Code(基礎建設即程式碼),是一種把基礎建設與系統設定寫成程式碼的方式,好處包含:
🔹 自動化:避免手動點選介面造成錯誤
🔹 版本控制:基礎建設變更可追蹤(GitOps)
🔹 可重現性:任何人都能用同一份程式碼重建環境
👉 但光有「Infra as Code」還不夠,因為現代應用程式需要有「App as Code」來接手部署與設定。
在專案中,Terraform 負責:
🔹 VPC、子網、路由表、DNS
🔹 IAM / RBAC / 安全性設定
🔹 Kubernetes Cluster(EKS/GKE/AKS)建立
🔹 Load Balancer、Storage、Database
👉 你可以把 Terraform 看作是「打地基、蓋骨架」的角色。
相對地,Helm 專注在 Kubernetes 世界的「應用部署」:
🔹 Deployment / Service / Ingress
🔹 ConfigMap / Secret / Volume
🔹 Chart 套件化(像 npm 一樣安裝/更新 App)
🔹 多環境覆蓋(values.dev.yaml / values.prod.yaml)
👉 Helm 更像是「在建好的房子裡裝潢、擺設傢俱」。
🔎 如果只用 Terraform:能建好雲端基礎設施,但應用層部署還需要手動操作
🔎 如果只用 Helm:能部署 App,但沒辦法自動建立底層 Infra(例如 VPC、Cluster)
📌 當兩者搭配:
🔹 Terraform 建立雲端環境 + Cluster
🔹 Terraform 呼叫 helm_release → 自動在 Cluster 部署應用
🔹 所有基礎建設與應用,都納入同一個 state 與 Git 管理
minikube start
terraform {
required_providers {
helm = {
source = "hashicorp/helm"
version = "2.12.1"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = "2.29.0"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
config_context = "minikube"
}
provider "helm" {
kubernetes {
config_path = "~/.kube/config"
config_context = "minikube"
}
}
resource "helm_release" "nginx_demo" {
name = "nginx-demo"
namespace = "default"
# 推薦:先用本機 chart 避開 provider 解析 bug
chart = "./charts/nginx"
wait = false
atomic = false
set {
name = "service.type"
value = "ClusterIP"
}
set {
name = "resources.requests.cpu"
value = "50m"
}
set {
name = "resources.requests.memory"
value = "64Mi"
}
}
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
mkdir -p charts
helm pull bitnami/nginx --untar --untardir ./charts
terraform init
terraform plan
terraform apply
🥏 執行後,Terraform 不只會管 infra,也能把 Helm 的應用部署進 Kubernetes。
terraform state list
terraform show -no-color | sed -n '1,120p'
helm list -n default
helm status nginx-demo -n default
🔹 Terraform = 管 Infra(打地基)
🔹 Helm = 管 App(裝潢內部)
🔹 IaC 的雙核心:兩者結合,才是真正完整的 IaC
Day 19|我們會進一步把 Terraform + Helm 串進 CI/CD,讓基礎建設與應用部署都能隨著程式碼更新而自動化完成