什麼是 Terragrunt?

Terragrunt 是 Terraform 的輕量級封裝工具,旨在幫助管理和降低基礎設施即代碼(IaC)工作流程的複雜性。它透過推動 DRY(Don’t Repeat Yourself,不要重複自己)原則、強制執行最佳實踐以及更高效地處理遠端狀態管理來簡化 Terraform 配置。

為什麼要使用 Terragrunt?

Terraform 是管理雲端基礎設施的強大工具,但隨著專案規模的擴大,管理多個配置、環境和模組變得更加繁瑣。這就是 Terragrunt 發揮作用的地方,它提供:

  • 代碼重用:避免在不同環境間重複配置。
  • 遠端狀態管理:強制執行一致的後端配置。
  • 依賴管理:確保模組執行的正確順序。
  • 簡化工作流程:減少樣板代碼並在團隊間強制執行標準。

Terragrunt 的關鍵功能

1. DRY Terraform 配置

Terragrunt 透過 terragrunt.hcl 文件實現層次化配置,使團隊能夠在單一位置存儲通用配置。

範例:

remote_state {
  backend = "s3"
  config = {
    bucket         = "my-terraform-state"
    key            = "state/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "terraform-lock"
  }
}

這可確保每個環境使用相同的遠端狀態配置,而無需在每個 Terraform 模組中重複配置。

2. 管理多個環境

透過 Terragrunt,團隊可以使用單一配置結構來管理多個環境(例如 devstagingprod)。

目錄結構:

infra/
├── terragrunt.hcl  # 通用配置
├── dev/
│   ├── terragrunt.hcl  # 開發環境配置
│   ├── app/
│   ├── database/
├── prod/
    ├── terragrunt.hcl  # 生產環境配置
    ├── app/
    ├── database/

每個環境都繼承根目錄的配置,但允許進一步自定義。

3. 處理依賴關係

Terragrunt 幫助管理模組之間的依賴關係。例如,一個應用模組可能依賴於資料庫模組。

範例:

dependency "database" {
  config_path = "../database"
}
inputs = {
  db_endpoint = dependency.database.outputs.db_endpoint
}

這確保 Terraform 在部署應用程式之前先應用資料庫配置。

4. 自動化遠端狀態配置

Terragrunt 可將後端配置集中在 terragrunt.hcl,並自動應用它們,而無需手動在每個 Terraform 模組中定義後端。

如何開始使用 Terragrunt

1. 安裝 Terragrunt

你可以使用 Homebrew(適用於 macOS)安裝 Terragrunt,或從官方發布頁面下載:

brew install terragrunt

或手動安裝:

wget https://github.com/gruntwork-io/terragrunt/releases/latest/download/terragrunt_linux_amd64
chmod +x terragrunt
mv terragrunt /usr/local/bin/

2. 設置專案

  • 定義 Terraform 模組。
  • 在每個環境中創建 terragrunt.hcl
  • 配置遠端狀態和依賴關係。

3. 執行 Terragrunt 命令

與直接執行 Terraform 不同,使用 Terragrunt 來運行:

terragrunt run-all plan
terragrunt run-all apply

這將在多個模組間執行 Terraform,並確保依賴關係的正確執行順序。

最佳實踐

  • 使用一致的目錄結構:為環境和模組遵循可預測的目錄結構。
  • 利用輸入和輸出:透過 Terragrunt 依賴關係在模組間傳遞變數。
  • 強制執行遠端狀態:使用集中化後端防止狀態漂移。
  • 與 CI/CD 自動化集成:將 Terragrunt 整合至 GitHub Actions、GitLab CI 或 Jenkins。

結論

Terragrunt 透過簡化配置管理、強制執行最佳實踐並精簡工作流程來增強 Terraform。對於管理大規模基礎設施的 DevOps 團隊來說,這是一款不可或缺的工具。

如果你正在大規模使用 Terraform,考慮採用 Terragrunt 來提高效率和可維護性。