在現代 DevOps 實踐中,基礎設施即程式碼(Infrastructure as Code,IaC)已成為不可或缺的技術。而透過 GitHub Actions 與 Terraform 的結合,我們可以建立一個強大與可靠的自動化佈署流程。本文將詳細介紹如何設定這個自動化工作流程,確保基礎設施變更的安全性和可控性。

GitHub Actions 工作流程設計

在這個自動化佈署方案中,我們將建立兩個主要的工作流程:

  1. Pull Request 驗證工作流程
  2. 正式環境佈署工作流程

這樣的設計能確保程式碼品質,同時維持佈署過程的可控性。

Pull Request 驗證工作流程

首先,讓我們在 .github/workflows 目錄下建立 terraform-plan.yml 檔案,用於 Pull Request 的自動驗證:

name: 'Terraform Plan'
on:
  pull_request:

jobs:
  terraform:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      id-token: write
    
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: us-west-2

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      - name: Terraform Init
        run: terraform init

      - name: Terraform Format
        run: terraform fmt -check

      - name: Terraform Plan
        run: terraform plan -out=tfplan

      - name: Add Plan Comment
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const output = `#### Terraform Plan Output\n\`\`\`\n${process.env.PLAN_OUTPUT}\n\`\`\``;
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: output
            })

這個工作流程的主要功能包括:

  1. 觸發條件:當有新的 Pull Request 建立或更新時自動執行。

  2. 許可權設定

    • contents: read:允許讀取儲存函式庫
    • pull-requests: write:允許在 PR 中新增評論
    • id-token: write:允許使用 OIDC 身份驗證
  3. 執行步驟

    • 簽出程式碼
    • 設定 AWS 認證
    • 安裝並初始化 Terraform
    • 執行程式碼格式檢查
    • 產生執行計劃
    • 將計劃結果作為評論新增到 PR 中

正式環境佈署工作流程

接下來,我們建立 terraform-apply.yml 用於處理正式環境的佈署:

name: 'Terraform Apply'
on:
  push:
    branches:
      - main

jobs:
  terraform:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
      
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}

這個佈署工作流程的特點是:

  1. 觸發時機:僅在程式碼合併到 main 分支時執行。

  2. 安全性考量

    • 採用最小許可權原則
    • 使用 GitHub 的 OIDC 提供者進行 AWS 身份驗證
    • 所有敏感資訊都儲存在 GitHub Secrets 中
  3. 自動化流程

    • 自動簽出最新的程式碼
    • 設定必要的 AWS 認證
    • 執行 Terraform 佈署

最佳實踐建議

在實作這套自動化工作流程時,玄貓(BlackCat)建議注意以下幾點:

  1. 版本控制策略

    • 為 Terraform 狀態檔案使用遠端後端(如 S3)
    • 實施狀態檔案鎖定機制避免平行操作衝突
  2. 安全性考量

    • 使用 OIDC 進行身份驗證而非長期認證
    • 實施最小許可權原則
    • 定期輪換所有存取金鑰
  3. 工作流程最佳化

    • 善用 GitHub Actions 的快取功能加速建置
    • 實施平行作業以提升效率
    • 建立完善的錯誤處理機制

透過這套自動化工作流程,我們不僅能夠提高佈署效率,還能確保基礎設施變更的安全性和可靠性。在實際運作中,這套系統能夠有效降低人為錯誤,同時提供完整的變更追蹤和稽核記錄。

持續整合和持續佈署(CI/CD)流程對於現代基礎設施管理來說至關重要。透過 GitHub Actions 和 Terraform 的整合,我們能夠建立一個可靠、安全與高效的基礎設施佈署流程。這不僅提高了團隊的工作效率,更確保了基礎設施變更的品質和可追蹤性。隨著雲端技術的不斷發展,這樣的自動化實踐將變得越來越重要,成為 DevOps 團隊的標準配備。 actions.githubusercontent.com"},“Action”: “sts:AssumeRoleWithWebIdentity”,“Condition”: {“StringLike”: {“token.actions.githubusercontent.com:sub”: “repo:your-org/your-repo:*”}}}]}```

3.Attach policies to the role that grant necessary permissions for Terraform operations.

Creating the GitHub Actions Workflow

Let’s build a workflow that automates Terraform operations. Create .github/workflows/terraform.yml:

name: 'Terraform CI/CD'

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

permissions:
  id-token: write
  contents: read

jobs:
  terraform:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v2
      with:
        role-to-assume: arn:aws:iam::123456789012:role/github-actions
        aws-region: us-west-2

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v2
      with:
        terraform_version: 1.5.0

    - name: Terraform Format
      run: terraform fmt -check

    - name: Terraform Init
      run: terraform init

    - name: Terraform Plan
      run: terraform plan -input=false
      if: github.event_name == 'pull_request'

    - name: Terraform Apply
      run: terraform apply -auto-approve -input=false
      if: github.ref == 'refs/heads/main' && github.event_name == 'push'

Pipeline Workflow Stages

1. 程式碼品品檢查(Format Check)

- name: Terraform Format
  run: terraform fmt -check

這個步驟確保所有 Terraform 程式碼遵循標準格式。它會檢查縮排、空白和其他格式問題,維持程式碼一致性。

2. 初始化(Initialize)

- name: Terraform Init
  run: terraform init

初始化步驟會下載必要的供應商套件、設定後端狀態,並準備工作目錄。這是任何 Terraform 操作的必要前置步驟。

3. 規劃(Plan)

當建立 Pull Request 時,工作流程會執行 terraform plan,預覽將要進行的基礎設施變更。這讓團隊成員可以在合併前審查變更內容。

4. 套用(Apply)

只有當程式碼合併到主分支時,工作流程才會自動執行 terraform apply。這確保了變更經過適當的審查流程。

安全性最佳實踐

敏感資訊管理

使用 GitHub 的加密機密(Encrypted Secrets)來儲存敏感資訊:

env:
  TF_VAR_database_password: ${{ secrets.DATABASE_PASSWORD }}

存取控制

  • 限制具有寫入許可權的分支
  • 實施必要的程式碼審查
  • 使用環境保護規則控制佈署
  • 定期稽核 IAM 角色許可權

持續改進策略

監控與警示

設定監控以追蹤:

  • 管道執行時間
  • 失敗率
  • 資源成本變化
  • 安全掃描結果

測試整合

加入額外的測試步驟:

  • Terraform 驗證測試
  • 安全性掃描
  • 成本估算
  • 合規性檢查

在現代 DevOps 實踐中,基礎設施即程式碼(Infrastructure as Code,IaC)已成為不可或缺的一環。今天玄貓要和大家分享如何透過 GitHub Actions 來最佳化 Terraform 的佈署流程,讓團隊能夠更有信心地進行基礎設施的自動化佈署。

Terraform 佈署流程的基礎設定

首先,我們需要在 GitHub Actions 工作流程中設定 Terraform 環境。以下是基本的設定步驟:

- name: Setup Terraform
  uses: hashicorp/setup-terraform@v1

- name: Terraform Init
  run: terraform init

- name: Terraform Apply
  run: terraform apply -auto-approve

這個基本設定包含了 Terraform 的初始化和自動套用變更。其中 setup-terraform 動作會安裝指定版本的 Terraform CLI,確保我們能夠執行後續的 Terraform 命令。

強化佈署流程的可見性

狀態徽章整合

為了提升專案的可見性,我們可以在 README.md 中加入工作流程狀態徽章:

![Terraform CI](https://github.com/{owner}/{repo}/actions/workflows/{workflow-name}/badge.svg)

這個徽章能即時顯示佈署流程的狀態,讓團隊成員快速瞭解目前的佈署情況。在實際使用時,請記得將 {owner}、{repo} 和 {workflow-name} 替換為實際的值。

Pull Request 的計劃輸出

在現代化的 Terraform 工作流程中,自動化的計劃輸出評論功能特別重要。當開發者提交 Pull Request 時,系統會自動執行 Terraform plan 並將結果作為評論發布,這讓審查者能夠:

  • 直接在 PR 介面檢視預期的基礎設施變更
  • 評估變更的影響範圍
  • 及早發現潛在問題

提升佈署的安全性與效率

為了建立一個更加健全的佈署流程,我們可以採取以下措施:

  1. OIDC 認證整合

    • 實作更安全的雲端資源存取
    • 避免使用靜態存取憑證
    • 強化整體安全性
  2. 遠端狀態管理

    • 確保狀態檔案的安全儲存
    • 支援團隊協作
    • 維護狀態一致性
  3. 環境特定設定

    • 根據不同環境(開發、測試、生產)客製化工作流程
    • 實施適當的存取控制
    • 確保佈署流程的可追蹤性

自動化佈署的最佳實踐

在實施自動化佈署時,玄貓建議採用以下最佳實踐:

  1. 分層式審查機制

    • 建立明確的變更審查流程
    • 設定適當的審查者許可權
    • 確保關鍵變更的多重確認
  2. 佈署前檢查

    • 執行程式碼風格檢查
    • 進行安全性掃描
    • 驗證組態一致性
  3. 監控與回復機制

    • 實施完整的佈署監控
    • 準備快速回復方案
    • 建立問題通知機制

透過這些最佳化措施,我們能夠建立一個更加可靠與高效的 Terraform 佈署流程。這不僅能提高團隊的工作效率,也能確保基礎設施變更的安全性和可靠性。在實踐過程中,持續改進和調整這些流程,將能夠讓團隊在基礎設施管理上達到更高的自動化和標準化水平。

在這個快速發展的技術領域中,自動化佈署流程的最佳化永無止境。透過持續整合最新的工具和最佳實踐,我們可以不斷提升佈署流程的效能和可靠性。讓我們一起努力,開發更優質的基礎設施佈署體系。