Terraform Cloud 是 HashiCorp 提供的雲端服務,讓團隊可以在安全、一致的環境中協作管理基礎設施。透過遠端執行、狀態管理和版本控制整合,Terraform Cloud 成為企業級基礎設施即程式碼(IaC)工作流程的核心平台。
Terraform Cloud 是一個託管服務,提供以下核心功能:
| 功能 | 說明 |
|---|
| 遠端狀態管理 | 安全儲存和鎖定 Terraform state |
| 遠端執行 | 在雲端環境中執行 plan 和 apply |
| 版本控制整合 | 與 GitHub、GitLab、Bitbucket 等整合 |
| 團隊協作 | 權限管理和審核工作流程 |
| Private Registry | 私有模組和 Provider 儲存庫 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| ┌─────────────────────────────────────────────────────────────┐
│ 本地執行模式 │
│ ┌─────────┐ ┌─────────┐ ┌─────────────────────────┐ │
│ │ 開發者 │───▶│ Terraform│───▶│ Cloud Provider (AWS等) │ │
│ └─────────┘ └─────────┘ └─────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Local State │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Terraform Cloud 模式 │
│ ┌─────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 開發者 │───▶│ Terraform Cloud │───▶│ Cloud Provider │ │
│ └─────────┘ └─────────────────┘ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Remote State │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
|
免費與付費方案
Terraform Cloud 提供多種方案以滿足不同規模的團隊需求:
方案比較
| 功能 | Free | Team | Business |
|---|
| 使用者數量 | 最多 5 人 | 不限 | 不限 |
| 工作區數量 | 不限 | 不限 | 不限 |
| 遠端狀態管理 | 有 | 有 | 有 |
| 遠端執行 | 有 | 有 | 有 |
| Private Registry | 有 | 有 | 有 |
| 團隊管理 | 基本 | 進階 | 企業級 |
| SSO/SAML | 無 | 無 | 有 |
| Audit Logging | 無 | 無 | 有 |
| Sentinel 策略 | 無 | 有 | 有 |
| Run Tasks | 有限 | 有 | 有 |
選擇建議
- 個人開發者/小型專案:Free 方案已足夠
- 中型團隊:Team 方案提供進階協作功能
- 企業環境:Business 方案包含合規和安全功能
建立組織與工作區
建立組織(Organization)
- 登入 Terraform Cloud
- 點選「Create new organization」
- 設定組織名稱和電子郵件
1
2
3
4
5
6
7
8
9
10
| # 在本地設定 Terraform Cloud 後端
terraform {
cloud {
organization = "my-organization"
workspaces {
name = "my-workspace"
}
}
}
|
工作區類型
Terraform Cloud 支援三種工作區類型:
| 類型 | 說明 | 適用場景 |
|---|
| Version Control | 與 VCS 儲存庫連結 | 主要工作流程 |
| CLI-driven | 透過 CLI 觸發執行 | 本地開發和測試 |
| API-driven | 透過 API 觸發執行 | CI/CD 整合 |
建立工作區範例
1
2
3
4
5
| # 使用 Terraform CLI 登入
terraform login
# 初始化專案(會自動建立工作區)
terraform init
|
連接版本控制
支援的 VCS 提供者
- GitHub / GitHub Enterprise
- GitLab / GitLab CE/EE
- Bitbucket Cloud / Bitbucket Server
- Azure DevOps
設定 GitHub 連接
- 進入 Organization Settings > VCS Providers
- 選擇 GitHub 並授權
- 建立工作區時選擇儲存庫
1
2
3
4
5
6
7
8
9
10
| # 專案結構範例
my-terraform-project/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tf
└── environments/
├── dev.tfvars
├── staging.tfvars
└── prod.tfvars
|
VCS 觸發設定
1
2
3
4
5
6
7
8
9
10
| # terraform.tf
terraform {
cloud {
organization = "my-organization"
workspaces {
tags = ["aws", "production"]
}
}
}
|
工作區可以設定:
- 自動觸發:推送到指定分支時自動執行 plan
- 手動確認:apply 前需要人工審核
- 路徑過濾:只有特定路徑變更時才觸發
設定變數
變數類型
Terraform Cloud 支援兩種變數類型:
| 類型 | 說明 | 範例 |
|---|
| Terraform Variables | 對應 variable 區塊 | instance_type = "t3.micro" |
| Environment Variables | 環境變數 | AWS_ACCESS_KEY_ID |
設定 AWS 認證
1
2
3
4
| # 透過環境變數設定 AWS 認證
AWS_ACCESS_KEY_ID = "AKIA..." # 標記為 Sensitive
AWS_SECRET_ACCESS_KEY = "..." # 標記為 Sensitive
AWS_REGION = "ap-northeast-1"
|
變數優先順序
1
2
3
4
5
6
| 1. 命令列參數 (-var, -var-file)
2. *.auto.tfvars 檔案
3. terraform.tfvars 檔案
4. 環境變數 (TF_VAR_*)
5. Terraform Cloud 工作區變數
6. 變數預設值
|
變數集(Variable Sets)
變數集可以跨多個工作區共用:
1
2
3
4
5
6
7
8
9
10
11
| # 建立變數集用於共用 AWS 認證
Variable Set: "AWS Production Credentials"
├── AWS_ACCESS_KEY_ID (sensitive)
├── AWS_SECRET_ACCESS_KEY (sensitive)
└── AWS_REGION = "ap-northeast-1"
# 套用到多個工作區
Workspaces:
├── production-vpc
├── production-eks
└── production-rds
|
遠端執行模式
執行模式選項
| 模式 | Plan | Apply | State | 適用場景 |
|---|
| Remote | 遠端 | 遠端 | 遠端 | 標準工作流程 |
| Local | 本地 | 本地 | 遠端 | 開發和除錯 |
| Agent | Agent | Agent | 遠端 | 私有網路存取 |
遠端執行配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # main.tf
terraform {
cloud {
organization = "my-organization"
workspaces {
name = "production"
}
}
}
provider "aws" {
region = var.aws_region
}
resource "aws_instance" "web" {
ami = var.ami_id
instance_type = var.instance_type
tags = {
Name = "web-server"
Environment = "production"
ManagedBy = "terraform-cloud"
}
}
|
執行工作流程
1
2
3
4
5
6
7
8
9
| # 1. 初始化並連接到 Terraform Cloud
terraform init
# 2. 在遠端執行 plan
terraform plan
# 3. 檢視 plan 輸出並確認
# 4. 在遠端執行 apply
terraform apply
|
Speculative Plans
透過 Pull Request 自動觸發預覽性 plan:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # GitHub Actions 整合範例
name: Terraform Speculative Plan
on:
pull_request:
branches: [main]
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
with:
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
- run: terraform init
- run: terraform plan
|
Run Triggers
什麼是 Run Triggers?
Run Triggers 允許一個工作區的成功執行自動觸發另一個工作區的執行,建立工作區之間的依賴關係。
設定 Run Triggers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ┌─────────────────┐
│ VPC Workspace │
│ (Upstream) │
└────────┬────────┘
│ Run Trigger
▼
┌─────────────────┐
│ EKS Workspace │
│ (Downstream) │
└────────┬────────┘
│ Run Trigger
▼
┌─────────────────┐
│ Apps Workspace │
│ (Downstream) │
└─────────────────┘
|
跨工作區資料共享
使用 tfe_outputs 資料來源讀取其他工作區的輸出:
1
2
3
4
5
6
7
8
9
10
11
12
| # EKS 工作區讀取 VPC 工作區的輸出
data "tfe_outputs" "vpc" {
organization = "my-organization"
workspace = "production-vpc"
}
module "eks" {
source = "./modules/eks"
vpc_id = data.tfe_outputs.vpc.values.vpc_id
private_subnets = data.tfe_outputs.vpc.values.private_subnet_ids
}
|
Private Registry
私有模組 Registry
Terraform Cloud 提供私有模組 Registry,讓組織可以:
- 集中管理和版本控制內部模組
- 確保模組符合組織標準
- 提供模組文件和使用範例
發布私有模組
1
2
3
4
5
6
7
8
9
10
| # 模組結構
terraform-aws-vpc-internal/
├── main.tf
├── variables.tf
├── outputs.tf
├── versions.tf
├── README.md
└── examples/
└── complete/
└── main.tf
|
使用私有模組
1
2
3
4
5
6
7
8
9
| module "vpc" {
source = "app.terraform.io/my-organization/vpc-internal/aws"
version = "1.2.0"
vpc_name = "production"
vpc_cidr = "10.0.0.0/16"
enable_nat_gateway = true
}
|
私有 Provider
1
2
3
4
5
6
7
8
| terraform {
required_providers {
internal = {
source = "app.terraform.io/my-organization/internal"
version = "1.0.0"
}
}
}
|
團隊權限管理
團隊層級
| 權限等級 | 說明 |
|---|
| Organization Owners | 完整管理權限 |
| Organization Members | 基本存取權限 |
| Team Members | 依團隊設定 |
工作區權限
| 權限 | Read | Plan | Write | Admin |
|---|
| 檢視狀態 | 有 | 有 | 有 | 有 |
| 建立 Plan | 無 | 有 | 有 | 有 |
| 確認 Apply | 無 | 無 | 有 | 有 |
| 管理設定 | 無 | 無 | 無 | 有 |
設定團隊權限範例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 使用 Terraform 管理團隊和權限
resource "tfe_team" "developers" {
name = "developers"
organization = "my-organization"
}
resource "tfe_team_access" "developers_access" {
team_id = tfe_team.developers.id
workspace_id = tfe_workspace.production.id
access = "plan"
}
resource "tfe_team" "operations" {
name = "operations"
organization = "my-organization"
}
resource "tfe_team_access" "operations_access" {
team_id = tfe_team.operations.id
workspace_id = tfe_workspace.production.id
access = "write"
}
|
RBAC 最佳實踐
- 最小權限原則:只授予必要的權限
- 環境分離:開發、測試、生產使用不同團隊
- 審核記錄:啟用 Audit Log 追蹤變更
- 定期檢視:定期審查團隊成員和權限
總結
Terraform Cloud 提供了完整的企業級基礎設施協作平台,主要優勢包括:
- 遠端執行:統一的執行環境,避免本地環境差異
- 狀態管理:安全儲存和自動鎖定
- 版本控制整合:自動化 GitOps 工作流程
- 團隊協作:細緻的權限控制和審核機制
- Private Registry:組織內部模組和 Provider 管理
透過本文介紹的功能和設定,您可以建立一個安全、高效的 Terraform 協作環境,提升團隊的基礎設施管理能力。
參考資料