理解基礎設施即代碼工具:CloudFormation 與 Terraform

AWS CloudFormation和Terraform — 不確定該選擇哪一個?本文將幫助您做出明智的決定。

雲端運算已經改變了DevOps的世界。它不再只是一個流行詞;它已經開始改變我們開發和維護應用程式的方式。儘管有無數理由讓您在各種規模的企業中使用雲端運算,但存在著一個小小的限制:您必須手動配置基礎設施。

您必須進入您的雲服務提供商的控制台,並告訴他們您確切需要什麼。這對於小型用例來說效果很好,但如果有不同的人在控制台上進行配置更改呢?您最終可能會得到一個極其複雜的基礎設施,而這將變得越來越難以維護。沒有有效的協作方式或跟踪雲基礎設施的更改。好吧,這就是基礎設施即代碼。

基礎設施即代碼(IaC)是雲端運算中的一個時髦術語。這是管理您的IT IaC的過程。是的,沒錯。與其手動進入控制台並進行所有操作,IaC允許您編寫配置文件以配置您的雲基礎設施。IaC給我們帶來了一致性、簡單快速的維護,並且不容許出現人為錯誤的好處。

使用IaC與亞馬遜網絡服務

AWS是全球領先的雲端運算服務,市佔率是下一個雲端服務提供商的兩倍。它提供超過200種服務,可以滿足數百甚至數千種用例。

開始使用AWS的IaC時,您往往會將選擇範圍縮小到AWS CloudFormation和開源工具Terraform之間。如果您想在這兩者之間做出選擇,了解這兩個工具提供的眾多功能可能會讓您感到不知所措。在本文中,我們將檢視AWS CloudFormation和Terraform之間的差異,以幫助您決定哪個工具更適合您的需求。

Terraform vs. AWS CloudFormation:差異

模塊化

在大型組織中使用IaC時,模塊化可以是選擇合適工具的一個重要因素。

CloudFormation

CloudFormation並不支持模塊。相反,它允許您使用稱為嵌套堆棧的東西作為模塊。

例如,您可以為您的組織創建一個標準的 CloudFormation 模板來配置 S3 存儲桶。當終端用戶希望創建 S3 存儲桶時,他們可以使用這個 CloudFormation 模板作為嵌套堆疊來配置標準的 S3 存儲桶。

還有一個 AWS 服務,即 AWS 服務目錄,它可以幫助 CloudFormation 的模組化。AWS 服務目錄是為需要限制 AWS 服務範圍以滿足合規性、安全性、成本或性能要求的組織設計的。它在後端使用 CloudFormation 模板。

讓我們通過一個例子快速理解這一點。如果不當使用,S3 存儲桶可能會對您的機密數據造成災難性影響。我們以相同的例子來說明。您希望以標準方式在您的組織中使用 S3。第一個選擇是創建嵌套堆疊模板,這可以在其他 CloudFormation 堆疊中使用,效果同樣良好。

或者,您可以使用 AWS 服務目錄,這允許用戶從控制台 UI 使用這個標準模板並指定一些參數以進行輕微的自定義。這將使您能夠控制在您的 AWS 帳戶中基礎設施的配置方式,並防止任何不必要的情況發生。

CloudFormation 的嵌套堆疊和 AWS 服務目錄的使用也可以支持大型組織中的標準配置,儘管可能需要更多的手動配置。

Terraform

Terraform 原生支持模組。它允許您創建類似於 AWS CloudFormation 的標準配置,並在其他 Terraform 配置中使用它們。

由於Terraform是一個開源工具,你可以在Terraform Registry 中找到並使用一些預製的開源模組。你也可以使用自己的配置創建自己的模組,並將它們托管在私有模組庫中。

Terraform 對模組的本地支持提供了一種直接的模塊化方法。但是,在大型團隊中管理模組可能需要額外的治理以確保正確的使用。

在 CloudFormation 中使用嵌套堆棧不像在 Terraform 中使用模組那樣容易。主要因素是從 CFN 模板傳遞數據到嵌套堆棧可能會變得復雜。

CloudFormation 沒有用於共享模板的集中存儲庫。AWS 服務目錄允許你管理這個過程,但主要通過控制台強制執行規則。雖然 CloudFormation 模板可以封裝復雜的任務,但用戶在創建資源時仍需要指定參數。

另一方面,Terraform 有一套用於創建、維護和共享模組的方法。你可以在 Terraform Module Registry 中查看模組的確切要求,並在你的 Terraform 文件中輕鬆使用它們。

基礎設施的控制和治理

如果你想限制你的團隊在你的 AWS 帳戶中可以創建哪些資源,AWS CloudFormation 和 Terraform 為你提供了實珲的手段來實現這一點。

CloudFormation

CloudFormation通過IAM政策提供控制,允許您管理用戶對資源的訪問。然而,這種控制是AWS特定的,如果您的基礎設施完全基於AWS,這可能是理想的。

在我們的S3存儲桶示例中,您可能希望限制用戶的所有”S3 Create”權限,並僅允許他們從AWS服務目錄或嵌套堆棧創建S3存儲桶。

Terraform

Terraform允許您使用一個政策作為代碼工具Sentinel來控制用戶可以創建哪些資源。Sentinel將使您能夠實施基於邏輯的細粒度政策,以通過Terraform允許或拒絕用戶操作。例如,您可以拒絕所有創建S3存儲桶的資源,並僅允許用戶從標準模塊創建S3存儲桶。

狀態管理

AWS CloudFormation和Terraform需要跟蹤它們維護的資源。

Terraform

Terraform將您基礎設施的狀態存儲在一個狀態文件中。默認情況下,此文件存儲在本地;但是,您可以將其存儲在像S3這樣的遠端後端,並讓多個用戶對相同集合的基礎設施進行更改。

CloudFormation

CloudFormation在後台內部進行狀態維護,因此用戶無需擔心手動管理狀態文件。這對於希望獲得全面管理服務的人來說是一個好選擇。

AWS CloudFormation 和 Terraform 都允許你檢查對基礎設施將進行的更改。在 Terraform 中,你可以運行命令「terraform plan」來查看 Terraform 如何計劃應用你的配置更改。在 CloudFormation 中,用戶可以通過變更集查看這些信息。

語言

Terraform

Terraform 使用 HashiCorp 配置語言 HCL,這是一種由 HashiCorp 創建的語言。它與 JSON 非常相似,並具有額外的內置功能和能力。

CloudFormation

CloudFormation 模板以 YAML 或 JSON 格式編寫。

日誌和回滾

AWS CloudFormation 和 Terraform 都具有良好的日誌記錄能力。根據我的經驗,大多數錯誤和問題都相對簡單明瞭。

CloudFormation

默認情況下,CloudFormation 在堆棧變更失敗時會回滾所有更改。這是一個不錯的特性,但可以為了除錯目的而禁用。

Terraform

如果 Terraform 失敗,則不會自動回滾更改。這不是問題,因為你總是可以運行 Terraform destroy 命令來刪除部分配置並重新啟動 Terraform 運行。

範圍

Terraform

Terraform 的多雲支持允許你在 AWS、Azure、Google Cloud 和其他平台上部署基礎設施,並在多雲環境中提供靈活性。

CloudFormation

CloudFormation與AWS緊密整合,適用於AWS專用基礎架構,但在多雲端設置上受限。

功能支援

CloudFormation

AWS CloudFormation通常率先接收新服務和功能的更新,因為它與AWS密切整合。

Terraform

在Terraform缺乏某些AWS功能的情況下,您可以將CloudFormation堆直接整合到您的Terraform代碼中作為解決方案。

技術支援

CloudFormation

付費的AWS技術支援計劃也涵蓋CloudFormation支援。

Terraform

HashiCorp也提供Terraform的付費技術支援計劃。

結論

AWS CloudFormation和Terraform都是強大且成熟的工具,各自具有優勢。上述差異可以幫助您確定哪種工具最適合您的需求。如果您計劃使用多個雲端平台,Terraform提供多雲端支援,而AWS CloudFormation適用於AWS特定環境。最終,這兩種工具都可以有效管理IaC。正確的選擇取決於您的要求,無論您專注於AWS還是與多個雲端提供商合作。

Source:
https://dzone.com/articles/understanding-iac-tools-cloudformation-vs-terraform