20個有效實踐提升Terraform工作流程|Part 2

Seal數澈發表於2023-09-25

在上一部分,我們一同探討了構建 Terraform 專案的一些策略,以及使用 Terraform 管理 IaC 的部分有效實踐。今天,我們將繼續深入研究將 Terraform 程式碼提升到新水平的具體要點,希望能夠為你和你的團隊提供有意義的提示和指導。
 

標記資源

當出現問題或試圖找出基礎設施的哪一部分導致雲費用激增時,強大且一致的標記策略將提供巨大幫助。您還可以在需要時根據標籤制定一些訪問控制策略。像定義命名規則一樣,儘量保持一致並始終相應地標記資源。
 

Terraform 引數標籤應宣告為最後一個引數(如果相關,僅 depends_on或生命週期引數應在標籤之後定義)。
 

在進行標記時,可以定義一些適用於提供者管理的所有資源的 default_tags。如果使用的提供程式不支援預設標籤,則需要手動將這些標籤傳遞到模組並將它們應用到資源。
 

引入策略即程式碼(PaC)

隨著業務團隊和基礎設施規模的擴大,對個人使用者的信任通常會降低。這時應該制定一些政策來確保我們的系統繼續執行且保持安全。制定政策即程式碼流程使我們能夠定義大規模安全和可接受的規則,並自動驗證這些規則。
 

實施機密管理策略

當開始使用 Terraform 時,機密管理可能不是首要任務,但最終還是要回到定義處理機密的策略。
 

如所有教程所說, 切勿以明文形式儲存機密並將其提交到版本控制系統中。可以透過使用  TF_VAR 設定環境變數並使用  sensitive = true 標記敏感變數來傳遞機密。
 

或者採用更成熟的解決方案,即設定一個機密儲存(例如 Hashicorp Vault 或 AWS Secrets Manager)來處理對機密資訊的訪問。這樣,就可以保護靜態機密並強制執行加密。還可以選擇更好的功能,例如金鑰輪換和稽核日誌。不過需要注意的是,這種方法通常會為企業帶來使用此託管服務的成本。
 

測試 Terraform 程式碼

與所有其他程式碼一樣,IaC 程式碼應該經過相應測試。執行  terraform plan 是驗證更改是否能快速按預期工作的最簡單方法。接下來,可以對 Terraform 程式碼執行一些靜態分析而無需應用它。單元測試也是驗證系統不同部分是否正常執行的一種選擇。
 

另一步驟是將  Terraform linter 整合到 CI/CD 流水線中,並嘗試捕獲與雲提供商、已棄用的語法、強制實施有效實踐等相關的任何潛在錯誤。
 

在正式進行以上步驟前,可以透過啟動來設定一些整合測試複製沙箱環境,在此環境中驗證一切是否按預期工作,收集結果,然後銷燬沙箱,並將其應用到生產中。
 

啟用除錯/故障排除

當出現問題時,我們必須快速有效地收集所有必要的資訊來解決問題。你會發現在這些情況下設定 Terraform 日誌級別以進行除錯很有幫助。

TF_LOG=DEBUG

還透過設定 TF_LOG_PATH 環境變數將日誌保留在檔案中。
 

儘可能構建模組

如果社群中沒有適用於你的用例的模組,可以嘗試構建自己的模組。一般會從一些基礎的東西開始構建,隨著基礎設施的成熟,你可能需要回到簡單的模組並向其新增更多功能。當在另一個環境中複製程式碼時,需要做的就是從該模組建立一個物件,並使用新環境的正確引數去進行填充。
 

使用迴圈和條件

你的程式碼應該能夠建立資源的多個例項,因此建議對可能從一種環境更改為另一種環境的例項使用  count 或  for_each 。這樣將能夠靈活地使用相同的程式碼來適應許多不同的用例,併為引數提供通用性。
 

使用函式

除了迴圈和條件之外,Terraform 函式對於在程式碼中實現通用性也至關重要。它們使您的程式碼更加動態並確保您的配置是 DRY(Don't repeat yourself)的。函式允許您執行各種操作,例如將表示式轉換為不同的資料型別、計算長度以及構建複雜變數。
 

充分利用動態模組

如果沒有動態模組,程式碼就無法達到 DRY 狀態。當此功能可用時,能夠實現按照您喜歡的方式構建資源的靈活性。例如,某些雲提供商沒有用於安全組規則的專用資源,並且這些規則通常嵌入在安全組本身中。利用動態模組,你只需要更改輸入即可。但如果沒有動態模組,每當新增新規則時則需要相應更改配置。
 

使用 Terraform WorkSpace

請使用 Terraform Workspace,這樣你將能夠在不同的環境中重複使用相同的配置。
 

使用生命週期模組(Lifecycle Block)

有時程式碼中可能有一些複雜的條件。比如,有一個指令碼必須在資源標籤上更改 Terraform 之外的某些內容(當然並不建議這樣做)。這時可以使用生命週期模組來忽略標籤上的更改,確保不會回滾到以前的版本。
 

如果有些資源,由於某種原因它看似工作正常,但你必須在不停機的情況下重新建立它,那麼生命週期模組也可以提供幫助。這時可以使用  create_before_destroy=true 來實現此目的。
 

使用變數驗證

Terraform 在驗證變數是否接收正確的輸入方面做得非常好,但是如果想要限制某些內容並且沒有實施 PaC 該怎麼辦?這時可以使用變數驗證。此驗證塊存在於變數內部,可以參考 Terraform 官方說明[1]瞭解更多。
 

靈活利用輔助工具

Terraform 是最常用和最受喜愛的 IaC 工具之一,其社群也是非常龐大且活躍的。與這個社群一起,有許多輔助工具被創造以幫助使用者更好地使用 Terraform。當然為我們的工作流程選擇和採用正確的工具並不是件簡單的事,通常需要一個實驗階段。這裡我們總結出一些有用的工具清單供大家參考:

  • tflint – Terraform linter,用於檢查計劃無法捕獲的錯誤。

  • tfenv – Terraform 版本管理器

  • checkov – Terraform 靜態分析工具

  • terratest – 幫助您對 Terraform 進行自動化測試的 Go 庫

  • pre-commit-terraform – 用於自動化的 pre-commit git hooks

  • terraform-docs – 從模組快速生成文件

  • atlantis – Terraform 專案協作工作流程

  • terraform-cost-estimation – 為您的計劃提供成本估算服務
     

利用 IDE 擴充套件

如果你在編寫 Terraform 程式碼時使用 Visual Studio Code 或任何其他 IDE,則可以利用其擴充套件來加快開發過程,並確保程式碼格式正確。在 vscode 上,您可以使用 Anton Kulikov 構建的 Terraform 擴充套件。請記住在本地計算機上安裝 Terraform 以確保其正常工作。
 


 

總 結

我們探索了 Terraform 和 IaC 的許多不同有效實踐,分析了處理和構建 Terraform 專案的各種選項,並瞭解了採用輔助工具如何讓我們的生活更輕鬆。當然這些並不是必須盲目遵循的秘訣,我們希望透過這篇文章,能夠成為提供指導和提示並觸發你構建自己的有效 Terraform 工作流程和專案的指南。
 

原文連結
https://spacelift.io/blog/terraform-best-practices
參考連結
1. https://developer.hashicorp.com/terraform/language/values/variables

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026925/viewspace-2985621/,如需轉載,請註明出處,否則將追究法律責任。

相關文章