了解 IaC 工具:Cloudformation 與 Terraform

已發表: 2022-03-10

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

雲計算徹底改變了 DevOps 的世界。 它不再只是一個流行詞。 它就在這裡,它在這裡改變了我們開發和維護我們的應用程序的方式。 雖然有無數理由說明您應該為各種規模的企業使用雲計算,但有一點限制,您必須手動配置您的基礎架構。

你必須去你的雲提供商的控制台,告訴他們你想要什麼。 這適用於小型用例,但如果您有不同的人在控制台中進行配置更改怎麼辦。 你最終可能會得到一個超級複雜的基礎設施,而且只會變得越來越難以維護。 沒有有效的方法來協作或跟踪雲中基礎設施的變化。 嗯,實際上是有的。 基礎設施即代碼。

基礎設施即代碼是雲計算中非常流行的術語。 這是使用代碼管理 IT 基礎架構的過程。 是的,這是正確的。 而不是去控制台並手動執行所有操作; 基礎架構即代碼,即 IAAC 或 IAC,允許您編寫配置文件,然後配置您的雲基礎架構。 IAC 為我們帶來了一致性、簡單快速的維護以及沒有人為錯誤的餘地等好處。

將 IAC 與 Amazon Web Services 結合使用

AWS 是全球領先的雲計算服務,其市場份額是僅次於它的下一個雲提供商的兩倍。 AWS 上有超過 200 種服務可以滿足成百上千的用例。

在開始將 IAC 與 AWS 結合使用時,您通常會將選擇範圍縮小到 AWS CloudFormation 和開源工具 Terraform。 在嘗試在兩者之間做出選擇時,了解這兩種工具提供的眾多功能可能會讓人不知所措。 在本文中,我們將了解 AWS CloudFormation 和 Terraform 之間的差異,以幫助您確定哪種工具更適合您的需求。

Terraform 與 AWS CloudFormation:差異

模塊化

在大型組織中使用 IAC 時,模塊化可能是選擇正確工具的重要因素。

雲形成

CloudFormation 沒有對模塊的本機支持。 它允許您使用稱為嵌套堆棧的東西作為模塊。

例如,您可以對如何在組織中預置 S3 存儲桶進行標準配置。 因此,您創建了一個標準 CloudFormation 模板來創建 S3 存儲桶。 現在,當最終用戶想要創建 S3 存儲桶時,他們可以將此 CloudFormation 模板用作嵌套堆棧並創建標準 S3 存儲桶。

AWS 還有一項鮮為人知的服務,即 AWS Service Catalog,它可以幫助您實現 AWS CloudFormation 的模塊化。 Service Catalog 是一項 AWS 服務,專為希望限制 AWS 服務範圍以滿足合規性、安全性、成本或性能要求的組織而設計。 你猜怎麼著? AWS Service Catalog 在後端使用 CloudFormation 模板。

讓我們通過一個例子快速理解這一點。 如果使用不當,S3 存儲桶很快就會對您的機密數據造成災難性影響。 讓我們舉同樣的例子,您希望有一個標準的方式來說明您希望如何在您的組織中使用 S3。 第一個選項是創建嵌套堆棧模板,它可以在其他 CloudFormation 堆棧中使用並且同樣出色。

如果您不希望用戶必須將此標準模板用作嵌套堆棧,您可以使用 AWS Service Catalog。 服務目錄將允許用戶從控制台的 UI 中使用此標準模板並指定一些參數,以進行輕微的自定義。 這將允許您控制如何在您的 AWS 賬戶中預置基礎設施並防止出現任何不需要的情況。

地形

Terraform 具有對模塊的原生支持。 它允許您創建與 AWS CloudFormation 非常相似的標準配置,並將其用於其他 terraform 配置。

由於 Terraform 是一個開源工具,您還可以在 Terraform Registry 中找到並使用一些預製的開源模塊。 您還可以使用自己的配置創建自己的模塊,並將它們託管在私有模塊註冊表上。

就個人而言,如果模塊化是一個很大的要求,我更喜歡使用 Terraform 而不是 CloudFormation。

在 CloudFormation 中使用嵌套堆棧不像在 Terraform 中使用模塊那麼容易。 主要因素是將數據從 CFN 模板傳遞到嵌套堆棧可能相當複雜。

沒有可以共享 CloudFormation 模板的標準位置。 您擁有 AWS 服務目錄,但這只是您通過控制台執行一些創建基礎設施的規則的一種方式。 我們都是關於代碼的。 在使用 Service Catalog 時,雖然一些複雜的任務被 CloudFormation 文件封裝了,但您仍然需要通過手動任務去控制台並指定參數來製作您的 Infrastructure。

另一方面,Terraform 有一套創建、維護和共享模塊的方法。 您可以在 Terraform 模塊註冊表中查看模塊的確切要求,並非常輕鬆地在您的 terraform 文件中使用它們。

對基礎設施的控制和治理

如果您想限制您的人員可以在您的 AWS 賬戶中創建的資源:AWS CloudFormation 和 Terraform 都為您提供了這樣做的方法。

讓我們先談談 CloudFormation。 CloudFormation 本身不對模板的使用方式提供任何控制,但您可以使用 AWS IAM 策略僅允許您的 AWS 賬戶中的用戶僅使用標準 CloudFormation 模板來創建資源。 在我們的 S3 存儲桶示例中,您可能希望限制用戶的所有“S3 創建”權限,只允許他們從 AWS Service Catalog 或嵌套堆棧創建 S3 存儲桶。

Terraform 允許您使用策略作為代碼工具 Sentinel 來控制用戶可以創建哪些資源。 Sentinel 允許您執行細粒度、基於邏輯的策略,以允許或拒絕用戶通過 Terraform 執行的操作。 例如,您可以拒絕所有創建 S3 存儲桶的資源,只允許用戶從標準模塊創建 S3 存儲桶。

狀態管理

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

Terraform將基礎設施的狀態存儲在狀態文件中。 該文件默認存儲在本地,但是您可以將其存儲在 S3 等遠程後端,並讓多個用戶對同一組基礎架構進行更改。

CloudFormation不維護狀態文件,至少不是我們可以看到的。 CloudFormation 是一項託管服務,因此它會在後台進行所有狀態維護和檢查。

AWS CloudFormation 和 Terraform 都可以讓您檢查將對您的基礎設施進行哪些更改。 在 Terraform 中,您可以運行命令 - “terraform plan”以及 Terraform 計劃如何應用您的配置更改。 在 CloudFormation 中,用戶可以通過更改集查看此信息。

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

CloudFormation 模板以 YAML 或 JSON 格式編寫

日誌記錄和回滾

AWS CloudFormation 和 Terraform 都具有良好的日誌記錄功能。 以我的經驗,錯誤和問題很簡單(大部分)。

CloudFormation:默認情況下,CloudFormation 會在堆棧更改失敗的情況下回滾您的所有更改。 這是一個很好的功能,可以出於任何調試目的禁用。

Terraform: Terraform 不會在失敗時自動回滾您的更改。 這不是問題,因為您始終可以運行 terraform destroy 命令來刪除半配置的配置並再次重新啟動 Terraform 運行。

範圍

Terraform 不僅限於 AWS 雲。 在 Terraform 和 CloudFormation 之間進行選擇時,最重要的因素是 Terraform 支持其他雲提供商和服務。

因此,如果您打算將 IAC 用於多個雲平台,Terraform 是您的最佳選擇。 CloudFormation 雖然是一個強大的工具,但僅限於 AWS。 通過使用 Terraform,您可以設置基礎架構並將應用程序部署在多個雲平台中,從而使您的應用程序更加可用和健壯。

功能支持

通常,隨著 AWS 推出新的服務和功能,CloudFormation 將在 Terraform 之前更新,因為它是 AWS 服務。 截至目前,這兩種工具都涵蓋了這些服務的大部分服務和功能。 這可能是使用 Terraform 的一個小缺點,但是我們確實有一個解決方案。

您還可以在 Terraform 代碼中創建 CloudFormation 堆棧。 因此,如果您使用 Terraform 並且它沒有功能,您可以在 Terraform 代碼中臨時設置 CloudFormation 堆棧。

技術支援

付費 AWS 技術支持計劃還涵蓋 CloudFormation 支持。

HashiCorp 也為 Terraform 支付了技術支持計劃。

結論

AWS CloudFormation 和 Terraform 都是功能強大且完全開發的工具。 上述差異將幫助您做出明智的決定,根據您的要求選擇工具。 作為個人建議,如果您計劃在未來使用多個雲平台或當前正在使用多個雲,您應該使用 Terraform 作為滿足您所有需求的一站式商店。 如果您正在尋找僅適用於 AWS 的 IAC 工具,AWS CloudFormation 和 Terraform 都是不錯的選擇。

如果您有興趣學習 Terraform,請查看這些在線課程。