在現代 DevOps 實踐中,基礎設施即程式碼(Infrastructure as Code,IaC)已成為不可或缺的技術。而透過 GitHub Actions 與 Terraform 的結合,我們可以建立一個強大與可靠的自動化佈署流程。本文將詳細介紹如何設定這個自動化工作流程,確保基礎設施變更的安全性和可控性。
GitHub Actions 工作流程設計
在這個自動化佈署方案中,我們將建立兩個主要的工作流程:
- Pull Request 驗證工作流程
- 正式環境佈署工作流程
這樣的設計能確保程式碼品質,同時維持佈署過程的可控性。
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
})
這個工作流程的主要功能包括:
觸發條件:當有新的 Pull Request 建立或更新時自動執行。
許可權設定:
contents: read
:允許讀取儲存函式庫pull-requests: write
:允許在 PR 中新增評論id-token: write
:允許使用 OIDC 身份驗證
執行步驟:
- 簽出程式碼
- 設定 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 }}
這個佈署工作流程的特點是:
觸發時機:僅在程式碼合併到 main 分支時執行。
安全性考量:
- 採用最小許可權原則
- 使用 GitHub 的 OIDC 提供者進行 AWS 身份驗證
- 所有敏感資訊都儲存在 GitHub Secrets 中
自動化流程:
- 自動簽出最新的程式碼
- 設定必要的 AWS 認證
- 執行 Terraform 佈署
最佳實踐建議
在實作這套自動化工作流程時,玄貓(BlackCat)建議注意以下幾點:
版本控制策略:
- 為 Terraform 狀態檔案使用遠端後端(如 S3)
- 實施狀態檔案鎖定機制避免平行操作衝突
安全性考量:
- 使用 OIDC 進行身份驗證而非長期認證
- 實施最小許可權原則
- 定期輪換所有存取金鑰
工作流程最佳化:
- 善用 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 中加入工作流程狀態徽章:

這個徽章能即時顯示佈署流程的狀態,讓團隊成員快速瞭解目前的佈署情況。在實際使用時,請記得將 {owner}、{repo} 和 {workflow-name} 替換為實際的值。
Pull Request 的計劃輸出
在現代化的 Terraform 工作流程中,自動化的計劃輸出評論功能特別重要。當開發者提交 Pull Request 時,系統會自動執行 Terraform plan 並將結果作為評論發布,這讓審查者能夠:
- 直接在 PR 介面檢視預期的基礎設施變更
- 評估變更的影響範圍
- 及早發現潛在問題
提升佈署的安全性與效率
為了建立一個更加健全的佈署流程,我們可以採取以下措施:
OIDC 認證整合
- 實作更安全的雲端資源存取
- 避免使用靜態存取憑證
- 強化整體安全性
遠端狀態管理
- 確保狀態檔案的安全儲存
- 支援團隊協作
- 維護狀態一致性
環境特定設定
- 根據不同環境(開發、測試、生產)客製化工作流程
- 實施適當的存取控制
- 確保佈署流程的可追蹤性
自動化佈署的最佳實踐
在實施自動化佈署時,玄貓建議採用以下最佳實踐:
分層式審查機制
- 建立明確的變更審查流程
- 設定適當的審查者許可權
- 確保關鍵變更的多重確認
佈署前檢查
- 執行程式碼風格檢查
- 進行安全性掃描
- 驗證組態一致性
監控與回復機制
- 實施完整的佈署監控
- 準備快速回復方案
- 建立問題通知機制
透過這些最佳化措施,我們能夠建立一個更加可靠與高效的 Terraform 佈署流程。這不僅能提高團隊的工作效率,也能確保基礎設施變更的安全性和可靠性。在實踐過程中,持續改進和調整這些流程,將能夠讓團隊在基礎設施管理上達到更高的自動化和標準化水平。
在這個快速發展的技術領域中,自動化佈署流程的最佳化永無止境。透過持續整合最新的工具和最佳實踐,我們可以不斷提升佈署流程的效能和可靠性。讓我們一起努力,開發更優質的基礎設施佈署體系。