20個(gè)最佳實(shí)踐提升Terraform工作流程|Part 2

在上一部分,我們一同探討了構(gòu)建 Terraform 項(xiàng)目的一些策略,以及使用 Terraform 管理 IaC 的部分最佳實(shí)踐。今天,我們將繼續(xù)深入研究將 Terraform 代碼提升到新水平的具體要點(diǎn),希望能夠?yàn)槟愫湍愕膱F(tuán)隊(duì)提供有意義的提示和指導(dǎo)。
?
標(biāo)記資源
當(dāng)出現(xiàn)問題或試圖找出基礎(chǔ)設(shè)施的哪一部分導(dǎo)致云費(fèi)用激增時(shí),強(qiáng)大且一致的標(biāo)記策略將提供巨大幫助。您還可以在需要時(shí)根據(jù)標(biāo)簽制定一些訪問控制策略。像定義命名規(guī)則一樣,盡量保持一致并始終相應(yīng)地標(biāo)記資源。
?
Terraform 參數(shù)標(biāo)簽應(yīng)聲明為最后一個(gè)參數(shù)(如果相關(guān),僅depends_on
或生命周期參數(shù)應(yīng)在標(biāo)簽之后定義)。
?
在進(jìn)行標(biāo)記時(shí),可以定義一些適用于提供者管理的所有資源的default_tags
。如果使用的提供程序不支持默認(rèn)標(biāo)簽,則需要手動(dòng)將這些標(biāo)簽傳遞到模塊并將它們應(yīng)用到資源。
?
引入策略即代碼(PaC)
隨著業(yè)務(wù)團(tuán)隊(duì)和基礎(chǔ)設(shè)施規(guī)模的擴(kuò)大,對(duì)個(gè)人用戶的信任通常會(huì)降低。這時(shí)應(yīng)該制定一些政策來確保我們的系統(tǒng)繼續(xù)運(yùn)行且保持安全。制定政策即代碼流程使我們能夠定義大規(guī)模安全和可接受的規(guī)則,并自動(dòng)驗(yàn)證這些規(guī)則。
?
實(shí)施機(jī)密管理策略
當(dāng)開始使用 Terraform 時(shí),機(jī)密管理可能不是首要任務(wù),但最終還是要回到定義處理機(jī)密的策略。
?
如所有教程所說,切勿以明文形式存儲(chǔ)機(jī)密并將其提交到版本控制系統(tǒng)中??梢酝ㄟ^使用?TF_VAR
?設(shè)置環(huán)境變量并使用?sensitive = true
?標(biāo)記敏感變量來傳遞機(jī)密。
?
或者采用更成熟的解決方案,即設(shè)置一個(gè)機(jī)密存儲(chǔ)(例如 Hashicorp Vault 或 AWS Secrets Manager)來處理對(duì)機(jī)密信息的訪問。這樣,就可以保護(hù)靜態(tài)機(jī)密并強(qiáng)制執(zhí)行加密。還可以選擇更高級(jí)的功能,例如密鑰輪換和審核日志。不過需要注意的是,這種方法通常會(huì)為企業(yè)帶來使用此托管服務(wù)的成本。
?
測(cè)試 Terraform 代碼
與所有其他代碼一樣,IaC 代碼應(yīng)該經(jīng)過相應(yīng)測(cè)試。運(yùn)行?terraform plan
?是驗(yàn)證更改是否能快速按預(yù)期工作的最簡(jiǎn)單方法。接下來,可以對(duì) Terraform 代碼執(zhí)行一些靜態(tài)分析而無需應(yīng)用它。單元測(cè)試也是驗(yàn)證系統(tǒng)不同部分是否正常運(yùn)行的一種選擇。
?
另一步驟是將?Terraform linter
?集成到 CI/CD 流水線中,并嘗試捕獲與云提供商、已棄用的語法、強(qiáng)制實(shí)施最佳實(shí)踐等相關(guān)的任何潛在錯(cuò)誤。
?
在正式進(jìn)行以上步驟前,可以通過啟動(dòng)來設(shè)置一些集成測(cè)試復(fù)制沙箱環(huán)境,在此環(huán)境中驗(yàn)證一切是否按預(yù)期工作,收集結(jié)果,然后銷毀沙箱,并將其應(yīng)用到生產(chǎn)中。
?
啟用調(diào)試/故障排除
當(dāng)出現(xiàn)問題時(shí),我們必須快速有效地收集所有必要的信息來解決問題。你會(huì)發(fā)現(xiàn)在這些情況下設(shè)置 Terraform 日志級(jí)別以進(jìn)行調(diào)試很有幫助。
TF_LOG=DEBUG
還通過設(shè)置 TF_LOG_PATH 環(huán)境變量將日志保留在文件中。
?
盡可能構(gòu)建模塊
如果社區(qū)中沒有適用于你的用例的模塊,可以嘗試構(gòu)建自己的模塊。一般會(huì)從一些基礎(chǔ)的東西開始構(gòu)建,隨著基礎(chǔ)設(shè)施的成熟,你可能需要回到簡(jiǎn)單的模塊并向其添加更多功能。當(dāng)在另一個(gè)環(huán)境中復(fù)制代碼時(shí),需要做的就是從該模塊創(chuàng)建一個(gè)對(duì)象,并使用新環(huán)境的正確參數(shù)去進(jìn)行填充。
?
使用循環(huán)和條件
你的代碼應(yīng)該能夠創(chuàng)建資源的多個(gè)實(shí)例,因此建議對(duì)可能從一種環(huán)境更改為另一種環(huán)境的實(shí)例使用?count
?或?for_each
?。這樣將能夠靈活地使用相同的代碼來適應(yīng)許多不同的用例,并為參數(shù)提供通用性。
?
使用函數(shù)
除了循環(huán)和條件之外,Terraform 函數(shù)對(duì)于在代碼中實(shí)現(xiàn)通用性也至關(guān)重要。它們使您的代碼更加動(dòng)態(tài)并確保您的配置是 DRY(Don't repeat yourself)的。函數(shù)允許您執(zhí)行各種操作,例如將表達(dá)式轉(zhuǎn)換為不同的數(shù)據(jù)類型、計(jì)算長(zhǎng)度以及構(gòu)建復(fù)雜變量。
?
充分利用動(dòng)態(tài)模塊
如果沒有動(dòng)態(tài)模塊,代碼就無法達(dá)到 DRY 狀態(tài)。當(dāng)此功能可用時(shí),能夠?qū)崿F(xiàn)按照您喜歡的方式構(gòu)建資源的靈活性。例如,某些云提供商沒有用于安全組規(guī)則的專用資源,并且這些規(guī)則通常嵌入在安全組本身中。利用動(dòng)態(tài)模塊,你只需要更改輸入即可。但如果沒有動(dòng)態(tài)模塊,每當(dāng)添加新規(guī)則時(shí)則需要相應(yīng)更改配置。
?
使用 Terraform WorkSpace
請(qǐng)使用 Terraform Workspace,這樣你將能夠在不同的環(huán)境中重復(fù)使用相同的配置。
?
使用生命周期模塊(Lifecycle Block)
有時(shí)代碼中可能有一些復(fù)雜的條件。比如,有一個(gè)腳本必須在資源標(biāo)簽上更改 Terraform 之外的某些內(nèi)容(當(dāng)然并不建議這樣做)。這時(shí)可以使用生命周期模塊來忽略標(biāo)簽上的更改,確保不會(huì)回滾到以前的版本。
?
如果有些資源,由于某種原因它看似工作正常,但你必須在不停機(jī)的情況下重新創(chuàng)建它,那么生命周期模塊也可以提供幫助。這時(shí)可以使用?create_before_destroy=true
?來實(shí)現(xiàn)此目的。
?
使用變量驗(yàn)證
Terraform 在驗(yàn)證變量是否接收正確的輸入方面做得非常好,但是如果想要限制某些內(nèi)容并且沒有實(shí)施 PaC 該怎么辦?這時(shí)可以使用變量驗(yàn)證。此驗(yàn)證塊存在于變量?jī)?nèi)部,可以參考 Terraform 官方說明[1]了解更多。
?
靈活利用輔助工具
Terraform 是最常用和最受喜愛的 IaC 工具之一,其社區(qū)也是非常龐大且活躍的。與這個(gè)社區(qū)一起,有許多輔助工具被創(chuàng)造以幫助用戶更好地使用 Terraform。當(dāng)然為我們的工作流程選擇和采用正確的工具并不是件簡(jiǎn)單的事,通常需要一個(gè)實(shí)驗(yàn)階段。這里我們總結(jié)出一些有用的工具清單供大家參考:
tflint?– Terraform linter,用于檢查計(jì)劃無法捕獲的錯(cuò)誤。
tfenv?– Terraform 版本管理器
checkov?– Terraform 靜態(tài)分析工具
terratest?– 幫助您對(duì) Terraform 進(jìn)行自動(dòng)化測(cè)試的 Go 庫
pre-commit-terraform?– 用于自動(dòng)化的 pre-commit git hooks
terraform-docs?– 從模塊快速生成文檔
atlantis?– Terraform 項(xiàng)目協(xié)作工作流程
terraform-cost-estimation?– 為您的計(jì)劃提供成本估算服務(wù)
?
利用 IDE 擴(kuò)展
如果你在編寫 Terraform 代碼時(shí)使用 Visual Studio Code 或任何其他 IDE,則可以利用其擴(kuò)展來加快開發(fā)過程,并確保代碼格式正確。在 vscode 上,您可以使用 Anton Kulikov 構(gòu)建的 Terraform 擴(kuò)展。請(qǐng)記住在本地計(jì)算機(jī)上安裝 Terraform 以確保其正常工作。
?

?
總 結(jié)
我們探索了 Terraform 和 IaC 的許多不同最佳實(shí)踐,分析了處理和構(gòu)建 Terraform 項(xiàng)目的各種選項(xiàng),并了解了采用輔助工具如何讓我們的生活更輕松。當(dāng)然這些并不是必須盲目遵循的秘訣,我們希望通過這篇文章,能夠成為提供指導(dǎo)和提示并觸發(fā)你構(gòu)建自己的最佳 Terraform 工作流程和項(xiàng)目的指南。
?
原文鏈接:
https://spacelift.io/blog/terraform-best-practices
參考鏈接:
1.https://developer.hashicorp.com/terraform/language/values/variables
?