使用基礎結構即程式代碼的建議
適用於此 Azure 架構完善的架構營運卓越檢查清單建議:
OE:05 | 使用標準化基礎結構即程式代碼 (IaC) 方法來準備資源及其設定。 與其他程式代碼一樣,使用一致的樣式、適當的模組化和品質保證設計 IaC。 盡可能偏好宣告式方法。 |
---|
本指南說明使用 IaC 作為基礎結構部署標準的建議。 使用 IaC 可讓您將基礎結構部署和管理整合到現有的軟體開發實務中。 它會針對工作負載的所有元件,提供一致的標準開發與部署方法。 依賴手動部署可讓工作負載面臨設定不一致的風險,且可能不安全的設計。
定義
詞彙 | 定義 |
---|---|
宣告式工具 | 定義部署結束狀態的工具類別,並依賴系統來判斷如何部署資源以符合定義的結束狀態。 |
不可變的基礎結構 | 要以每個部署執行新組態的新基礎結構取代的基礎結構。 它不得就地變更。 |
命令式工具 | 列出產生所需結束狀態之執行步驟的工具類別。 |
模組 | 分割資源群組以簡化複雜部署的抽象單位。 |
可變基礎結構 | 要就地變更的基礎結構。 部署會變更基礎結構的組態,而不是將它取代為新的基礎結構。 |
關鍵設計策略
如供應鏈和標準化工具和程式指南中所述,您應該只透過程式代碼來部署基礎結構變更(包括組態變更)的嚴格原則。 您應該透過持續整合和持續傳遞 (CI/CD) 管線來部署 IaC。 採用這些原則會在所有 IaC 部署的程式中強制執行一致性,將設定漂移的風險降到最低,並確保整個環境的基礎結構一致性。 此外,您應該在樣式指南中標準化 IaC 開發和部署工具和程式。 您的樣式指南建議包括:
偏好宣告式而不是命令式工具
宣告式工具及其相關聯的檔案比命令式工具更適合用於部署和管理 IaC 的整體選擇。 宣告式工具會針對其定義檔案使用更簡單的語法,在部署完成之後只定義環境所需的狀態。 命令式工具取決於您定義取得所需結束狀態所需的步驟,因此檔案可能比宣告式檔案更複雜。 宣告式定義檔也有助於減少維護命令式程式代碼的技術債務,例如部署腳本,可能會隨著時間累積。
使用原生和業界標準工具
使用雲端平臺的原生工具和原生整合至平臺的其他業界證明工具。 您的雲端平臺提供工具,讓 IaC 部署變得簡單明瞭。 利用這些工具和其他具有原生整合的第三方工具,例如 Terraform,而不是開發您自己的解決方案。 平台支援原生工具,並包含您大部分需求的內建功能。 平臺提供者會持續更新它們,讓平臺隨著平台的發展而更加有用。
注意
請注意,當雲端提供者和第三方開發人員更新其工具和 API 時,您可以在工作負載中使用最新版本時,執行非預期問題的風險。 請務必先徹底測試新版本的工具和 API,再加以採用。 同樣地,請在部署程序代碼中的工具或 API 上呼叫 時,避免使用「最新」旗標。 請刻意呼叫您工作負載的最新已知良好版本。
為工作使用正確的工具
針對特定工作和基礎結構類型使用正確的工具。 除了部署之外,還牽涉到基礎結構生命週期中的多個工作。 例如,必須套用和維護組態,以及您用來編寫腳本部署的工具,例如 Bicep,可能不是每個管理作業的最佳工具。
同樣地,針對不同的基礎結構類型套用所需的狀態設定 (DSC)可能需要不同的工具。 例如,有特定的工具,例如 Ansible 來管理 VM 的 DSC,而 Flux 是管理 Kubernetes 叢集上的 DSC 的好工具。 平臺即服務 (PaaS) 服務可能會為可透過 IaC 處理的組態管理(例如 Azure 應用程式組態)提供不同的工具。 軟體即服務 (SaaS) 服務可能會更加有限,因為它們受到平臺更嚴格控制。
請思考 IaC 做法範圍內的所有工作和基礎結構類型,並針對執行所需工作的工具進行標準化,並整合到您的開發和管理實務中。
支援多個環境
您的腳本和範本應具有足夠的彈性,以便輕鬆地部署各種環境。 使用參數、變數和組態檔來部署一組標準資源,這些資源可修改以在程式代碼升級堆疊中部署任何環境。 抽象設定,例如資源大小、計數、名稱、要部署的位置,以及某些組態設定。 不過,請小心不要抽象太多。 有些設定可以使用參數或變數來抽象化,這些設定可能不會在工作負載生命週期過程中實際變更,或可能很少變更。 它們不應該被抽象化。
注意
請避免針對不同的環境使用不同的 IaC 資產。 例如,您不應該針對生產與測試環境使用不同的 Terraform 檔案。 所有環境都應該使用一個檔案。 您可以視需要操作該檔案以部署到不同的環境。
封裝功能時,請使用正確的平衡
對模組的使用進行策略化和標準化。 如同參數和變數,模組可讓您的基礎結構部署重複執行。 不過,請仔細考慮如何使用它們。 標準化的抽象策略可協助確保已建置模組,以符合特定、已達成一致的目標。 使用模組來封裝複雜的組態或資源組合。 如果您只使用資源的預設組態,請避免模組。 此外,在開發新模組時,請明智地進行。 適當時,請使用維護的開放原始碼模組,例如,不區分案例。
檔手動步驟
手動步驟的文件標準。 部署和維護環境特定的基礎結構,以及需要手動介入的步驟可能會相關。 請確定這些步驟盡可能最小化並清楚記載。 在您的樣式指南和標準作業程式中,標準化手動步驟,以確保工作能安全地且一致地執行。
處理孤立資源的文件標準。 根據您用於設定管理的工具及其限制,您的工作負載可能不再需要特定資源,而且您的 IaC 工具無法自動移除資源。 例如,假設您要從 VM 移至 PaaS 服務以進行某些函式,而 IaC 工具則沒有邏輯可移除已淘汰的資源。 如果工作負載小組不記得手動刪除這些資源,這些資源可能會變成孤立資源。 若要處理這些案例,請標準化策略以掃描孤立的資源並加以刪除。 您也需要考慮如何確保範本是最新的。 研究 IaC 工具的限制,以瞭解在這些情況下可能需要規劃的內容。
請考慮下列適用於針對工作負載使用 IaC 的建議。
使用 IaC 管線的分層方法
使用分層方法,在工作負載堆疊內對齊您的 IaC 管線。 將 IaC 管線分為階層可協助您管理複雜的環境。 將數十或數百個資源部署為整合型套件不僅缺乏效率,而且可能會造成多個問題,例如中斷的相依性。 使用多個管線,這些管線會與資源組成的圖層一致,其部署生命週期或功能等因素緊密相符,可讓管理 IaC 部署變得更容易。
網路資源等核心基礎結構很少需要比組態更新更複雜的變更,因此這些資源應該構成 低觸控 的 IaC 管線。 視工作負載的複雜度而定,您可能有一或多個中觸控和高觸控 IaC 管線的資源。 使用以 Kubernetes 為基礎的應用程式堆疊作為範例,一個中點觸控層可能會由叢集、記憶體資源和資料庫服務組成。 高接觸層是由持續傳遞模式中經常更新的應用程式容器所組成。
將 IaC 和應用程式程式代碼視為相同
將 IaC 成品視為與應用程式程式碼成品相同,可協助您套用相同的嚴謹性來管理所有管線的程式碼。 此外,IaC 開發和部署做法應該鏡像應用程式做法。 版本控制、分支、程式代碼升級和品質的標準都應該相同。 也請考慮將 IaC 資產與應用程式程式代碼資產共置。 這樣做有助於確保每個部署都遵循相同的程式,並協助您避免在必要的應用程式程序代碼之前不小心部署基礎結構之類的問題,反之亦然。
使用集中式標準和資源
與組織中的其他小組共同作業,以標準化和重複使用。 大型組織有時會有多個小組開發和支援工作負載。 跨小組共同作業以達成標準,可協助您重複使用連結庫、範本和模組,以提升工作負載環境的效率與一致性。 同樣地,IaC 工具應該在整個組織中標準化,這樣做是實用的。
在 IaC 程式代碼中強制執行安全性
套用「安全性即程式碼」原則,以確保安全性是部署管線的一部分。 包含弱點掃描和設定強化,作為 IaC 開發程式的一部分。 掃描您的 IaC 存放庫,以取得公開的金鑰和秘密。 使用 IaC 的優點之一是,以安全性為主的小組成員可以在部署之前檢閱程式代碼,以確保安全性核准發行的設定實際上是部署到生產環境。 如需詳細指引,請參閱 保護開發生命周期的建議。
測試例程和非例行活動。 測試部署、組態更新和復原程式,包括部署復原程式。
採用不可變的部署模型
部署可變基礎結構與不可變基礎結構之間的選擇取決於幾個因素。 如果您的工作負載是業務關鍵,最好使用不可變的基礎結構。 同樣地,如果您有以部署戳記為基礎的成熟基礎結構設計,則使用不可變的基礎結構可能會有意義,因為您可以可靠地部署應用程式程式代碼和新的基礎結構。 相反地,如果您的 安全部署做法 規定在發生可誤導的部署問題時向前推進部署是慣用的選項,則使用可變基礎結構可能是較佳的選擇。 在此情況下,您可能會就地更新基礎結構。
考量
增加特製化: 在某些情況下,在您的工作負載小組中引進新語言時,會有學習曲線,而廠商鎖定可能會讓它成為一個不佳的選擇。 需要訓練小組成員,並根據雲端提供者的工具支援分析正確的工具。
增加維護工作: 需要程式代碼基底和工具維護,才能讓您的 IaC 實作保持最新且安全。 正確追蹤您的技術債務,並培養一種可獎勵減少債務的文化。
設定變更的時間增加: 使用命令行指示部署基礎結構,或直接從入口網站部署基礎結構時,不需要撰寫程式代碼時間和/或測試成品。 遵循程式代碼檢閱和品質保證做法等建議做法,將部署時間降至最低。
模組化的複雜性增加: 使用更多模組和參數化會增加偵錯和記錄系統所需的時間,並新增一層抽象概念。 平衡模組化的使用,以減少複雜性並避免過度工程。
Azure 便利化
Azure Resource Manager 範本 (ARM 範本) 和 Bicep 是使用宣告式語法部署基礎結構的 Azure 原生工具。 ARM 範本是以 JSON 撰寫,而 Bicep 則是網域特定的語言。 這兩者都可以輕鬆地整合到 Azure 管線 或 GitHub Actions CI/CD 管線中。
Terraform 是 Azure 中完全支援的另一個宣告式 IaC 工具。 它可用來部署和管理基礎結構,並可整合到 CI/CD 管線中。
您可以使用 適用於雲端的 Microsoft Defender 來探索 IaC 中的設定錯誤。
範例
如需可透過提供的 Resource Manager、Bicep 或 Terraform 檔案部署的虛擬桌面實作範例,請參閱 Azure 虛擬桌面登陸區域加速器架構和相關聯的參考實作。
相關連結
- 什麼是基礎結構即程序代碼 (IaC)?
- 使用 Bicep 和 Azure Container Registry 作為程式代碼的企業基礎結構
- 探索 IaC 中的設定錯誤
- 設計工作負載開發供應鏈的建議
- 標準化工具和程序的建議
- 保護開發生命周期的建議
- 使用安全部署做法的建議
- 部署戳記模式
- Azure Resource Manager 範本 (ARM 範本)
- Bicep
- Azure 管線
- GitHub 動作
- Terraform
卓越營運檢查清單
請參閱一組完整的建議。