核心概念:宣告式 (Declarative)

Terraform 採用的是 Declarative(宣告式) 設計。

可以把它想像成去餐廳點餐。

你只需要告訴服務生:

我要一個起司漢堡

你不需要管:

  • 廚房怎麼開火
  • 肉要煎幾分鐘
  • 麵包怎麼烤

Terraform 也是一樣。

你只需要描述:

「我需要一台 EC2」

Terraform 就會負責確保這台伺服器存在。

如果資源已經存在,它也不會再多建立一份


為什麼要學 Terraform?

  1. 更快速

不需要再手動點擊 AWS Console。 一行 terraform apply 就能完成整個架構部署。

  1. 可重複性 (Reproducibility)

同一份 Terraform code 可以快速建立:

  • Dev 環境
  • Staging 環境
  • Production 環境

確保每個環境的設定完全一致。

  1. 版本控制 (Version Control)

Terraform code 可以放在 GitHub。 你可以清楚看到:

  • 誰改了 infrastructure
  • 改了什麼設定
  • 什麼時候改的

這對團隊協作非常重要。

快速上手:三個基礎指令

在 Terraform 專案中,你只需要記住三個最重要的指令:

  1. terraform init

初始化專案。

Terraform 會下載所需的 Provider(雲端插件)

1terraform init
  1. terraform plan

預覽 Terraform 即將做的變更。

例如:

1terraform plan
1+ create 1 resource
2~ update 0 resource
3- destroy 0 resource

這可以避免誤刪重要資源。

  1. terraform apply

真正執行 Infrastructure 建立。

1terraform apply

輸入 yes 後,Terraform 就會開始建立資源。

實踐範例:建立第一台 EC2

建立一個 main.tf 檔案:

  1. 定義雲端供應商
 1provider "aws" {
 2  region = "ap-northeast-1"
 3}
 4
 5# 2. 定義資源
 6resource "aws_instance" "my_web_server" {
 7  ami           = "ami-0d52744d605140123"
 8  instance_type = "t2.micro"
 9
10  tags = {
11    Name = "MyFirstTerraformServer"
12  }
13}

接著執行:

1terraform init
2terraform plan
3terraform apply

Terraform 就會幫你建立一台 EC2。

進階技巧

使用變數 (Variables)

如果不想每次都修改 main.tf,可以使用變數:

1variable "server_size" {
2  default = "t2.micro"
3}
4
5resource "aws_instance" "my_web_server" {
6  instance_type = var.server_size
7}

這樣就可以透過變數控制伺服器規格。

狀態管理 (State File)

Terraform 在執行後會產生一個檔案:terraform.tfstate

這個檔案非常重要,因為它記錄了:

  • Terraform 管理的雲端資源
  • 目前資源的實際狀態
  • Terraform 與雲端資源之間的對應關係

Terraform 會透過這個 state file 來判斷:

  • 哪些資源需要建立
  • 哪些資源需要更新
  • 哪些資源需要刪除

在團隊開發時,通常不會把 terraform.tfstate 放在本地端,而是會使用 Remote State,例如:

  • S3:存放 State File
  • DynamoDB:提供 State Lock(避免多人同時修改)

這樣可以確保多人操作 Terraform 時,不會發生衝突或覆蓋彼此的變更。

結語:如何「毀滅」所有資源?

當測試結束後,如果不再需要這些資源,可以使用:

1terraform destroy

Terraform 會把剛剛建立的所有資源 完整刪除。

這可以避免:

  • 忘記關 EC2
  • 忘記刪 Load Balancer

月底收到高額帳單

恭喜你!

現在你已經理解 Terraform 的核心概念。