Terraform Cloud 遠端執行與協作

Terraform Cloud Remote Execution and Collaboration

Terraform Cloud 是 HashiCorp 提供的雲端服務,讓團隊可以在安全、一致的環境中協作管理基礎設施。透過遠端執行、狀態管理和版本控制整合,Terraform Cloud 成為企業級基礎設施即程式碼(IaC)工作流程的核心平台。

Terraform Cloud 概述

什麼是 Terraform Cloud?

Terraform Cloud 是一個託管服務,提供以下核心功能:

功能說明
遠端狀態管理安全儲存和鎖定 Terraform state
遠端執行在雲端環境中執行 plan 和 apply
版本控制整合與 GitHub、GitLab、Bitbucket 等整合
團隊協作權限管理和審核工作流程
Private Registry私有模組和 Provider 儲存庫

Terraform Cloud 與本地執行的差異

 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 提供多種方案以滿足不同規模的團隊需求:

方案比較

功能FreeTeamBusiness
使用者數量最多 5 人不限不限
工作區數量不限不限不限
遠端狀態管理
遠端執行
Private Registry
團隊管理基本進階企業級
SSO/SAML
Audit Logging
Sentinel 策略
Run Tasks有限

選擇建議

  • 個人開發者/小型專案:Free 方案已足夠
  • 中型團隊:Team 方案提供進階協作功能
  • 企業環境:Business 方案包含合規和安全功能

建立組織與工作區

建立組織(Organization)

  1. 登入 Terraform Cloud
  2. 點選「Create new organization」
  3. 設定組織名稱和電子郵件
 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 連接

  1. 進入 Organization Settings > VCS Providers
  2. 選擇 GitHub 並授權
  3. 建立工作區時選擇儲存庫
 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

遠端執行模式

執行模式選項

模式PlanApplyState適用場景
Remote遠端遠端遠端標準工作流程
Local本地本地遠端開發和除錯
AgentAgentAgent遠端私有網路存取

遠端執行配置

 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依團隊設定

工作區權限

權限ReadPlanWriteAdmin
檢視狀態
建立 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 最佳實踐

  1. 最小權限原則:只授予必要的權限
  2. 環境分離:開發、測試、生產使用不同團隊
  3. 審核記錄:啟用 Audit Log 追蹤變更
  4. 定期檢視:定期審查團隊成員和權限

總結

Terraform Cloud 提供了完整的企業級基礎設施協作平台,主要優勢包括:

  • 遠端執行:統一的執行環境,避免本地環境差異
  • 狀態管理:安全儲存和自動鎖定
  • 版本控制整合:自動化 GitOps 工作流程
  • 團隊協作:細緻的權限控制和審核機制
  • Private Registry:組織內部模組和 Provider 管理

透過本文介紹的功能和設定,您可以建立一個安全、高效的 Terraform 協作環境,提升團隊的基礎設施管理能力。

參考資料

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy