了解 IaC 工具:AWS CDK 與 Terraform

已發表: 2022-03-31

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

雲計算徹底改變了信息和技術的世界。 從我們部署和維護應用程序的方式到開發實踐,一切都受到雲計算的高度影響。 所有新應用程序都開發為雲原生並與雲服務兼容。

雲計算幫助我們開發高可用、可擴展和高效的架構,這使得云服務的需求越來越大。 隨著雲計算的蓬勃發展,需要將基礎設施作為代碼進行維護。 通過控制台手動維護雲資源可能是一項很難跟踪的複雜任務。

基礎設施即代碼,即 IAC 或 IAAC,解決了這個問題。 通過使用 IAC,我們可以將我們的資源定義為代碼,並使用此代碼來提供雲服務。 使用基礎架構即代碼允許多個開發人員在基礎架構上進行協作並跟踪開發人員所做的更改。

AWS 中的基礎設施即代碼

AWS 是全球最大、使用最廣泛的雲提供商。 它有自己的 IAC 工具 AWS CloudFormation 或 AWS CDK,還允許 Terraform 等 3rd 方 IAC 工具預置資源。 在為 AWS 選擇 IAC 工具時,第三方工具 Terraform 是 AWS 託管工具、AWS CloudFormation 和 AWS CDK 的有力競爭者。

由於這些工具中的每一個都提供瞭如此多的選擇和功能,因此選擇正確的 IAC 工具可能具有挑戰性。 在本文中,我們將討論 AWS CDK 和 Terraform 之間的區別。 AWS CDK 內部使用 Cloudformation,因此要更深入地了解 Cloudformation 和 Terraform,請參閱相關文章了解 IAC 工具:CloudFormation 與 Terraform。

地形

Terraform 是最初由 Hashicorp 開發的開源基礎設施即代碼工具。 它是一個高度準確且成熟的工具,不僅支持 AWS,還支持其他雲提供商。 Terraform 支持所有 AWS 服務,開發社區可以快速了解 AWS 添加到其服務中的任何新功能。 它允許我們用 Hashicorp 開發語言 (HCL) 編寫代碼。 HCL 是一種類似 JSON 的語言,用於定義基礎設施資源。

AWS CDK

AWS CDK 是 AWS CloudFormation 的包裝器。 要了解 AWS CDK 的工作原理,您應該對 AWS CloudFormation 有所了解。 AWS CloudFormation 是 AWS 託管的工具,允許我們以 YML 或 JSON 格式定義 AWS 基礎設施。 儘管閱讀 JSON 和 YML 很容易,但它們並不是真正的編程語言。 沒有對循環和函數的原生支持,這使得維護大型基礎設施變得越來越困難。 這就是 AWS CDK 的用武之地。

AWS CDK 是圍繞 AWS CloudFromation 的包裝器,它允許您使用熟悉的編程語言(如 JAVA 或 Python)來預置您的基礎設施。 這使得編寫和維護代碼變得更加容易。

Terraform 與 AWS CDK:差異

#1。 語言和易用性

語言和易用性對於理解 AWS CDK 和 Terraform 之間的區別至關重要。

讓我們先談談 Terraform。 Terraform 使用類似 JSON 的語言、HCL 或 HashiCorp 配置語言來定義資源和其他數據。 它非常簡單,文檔易於理解和遵循,即使對於初學者也是如此。

讓我們看看創建 S3 存儲桶的代碼。

 resource "aws_s3_bucket" "my_s3_bucket" { bucket = "my-tf-bucket" tags = { Name = "My bucket" Environment = "Dev" } }

該代碼非常易於閱讀,您可以在 Terraform 文檔中查看此資源支持的其他參數。

如前所述,AWS CDK 是一個 CloudFormation 包裝器,它允許我們以編程語言定義我們的資源。 讓我們看看創建 S3 存儲桶的 AWS CDK 代碼。

 import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class BucketStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { bucketName: 'my-first-bucket', }); } }

Terraform 代碼看起來比 CDK 更簡潔,但 Terraform 和 CDK 代碼都非常簡單。 如果您打算將 IAC 用於小型項目,就語言和易用性而言,Terraform 和 CDK 都是不錯的選擇。

但是,在為一個有很多開發人員的大型項目選擇合適的 IAC 工具時,Terraform 有一個缺點。 就像 Terraform 一樣簡單,它是一種新語言,您需要用一種與其他正在使用的編程語言不同的全新語言來培訓您的開發人員。 更重要的是,Terraform 中的數據操作不像其他編程語言那麼簡單。 例如,遍歷列表和對象並轉換值並不是那麼簡單,尤其是對於初學者而言。

就個人而言,如果考慮到易用性,我更喜歡 AWS CDK 而不是 Terraform。 使用 Terraform 時,有時我不得不使用變通方法或複雜的腳本來獲得所需的結果。 我們對數據的控制以及以 AWS CDK 語言輕鬆操作數據的能力是 AWS CDK 的一大勝利。

#2。 範圍

Terraform 是一個多雲 IAC 工具,這意味著您不僅可以將 Terraform 與 AWS 一起使用,還可以與 Azure 或 GCP 等其他雲提供商一起使用。 Terraform 是創建多雲部署並為您的應用程序提供任意數量的雲提供商的絕佳工具。

有時,由於雲提供商的服務出現問題,廣泛使用的全球平台出現故障。 在當今時代,為您的應用程序擁有多個雲提供商是一個明智的決定。

AWS CDK 是適用於 IAC 的 AWS 產品。 儘管 CDK 功能強大且成熟,但它僅限於 AWS 雲。

在考慮 IAC 工具的範圍時,Terraform 顯然是兩者的贏家。 讓您的開發人員為所有云平台使用單一工具是很有意義的。

#3。 表現

在選擇正確的 IAC 工具時,性能通常不是最重要的標準,但在大型項目中可能很重要。 Terraform 使用 AWS 開發工具包部署資源,而 CDK 代碼首先轉換為 CloudFormation 模板,然後再應用。

Terraform 的運行速度會比 AWS CDK 稍快,特別是因為 CDK 需要花費時間將代碼轉換為 CloudFormation 模板。

#4。 模塊化

Terraform 和 AWS CDK 都可以用來創建模塊。 Terraform 具有對模塊的原生支持。 您可以創建自己的模塊並將它們託管在私有模塊註冊表中,以在您的組織內使用。 Terraform 還有一個公共模塊註冊表,用於託管和使用公共模塊。

在 AWS CDK 中,您可以創建可重用的函數、類並在您的組織內共享此代碼以實現相同的結果。 這是 AWS CDK 作為其他 AWS IAC 工具的一大優勢 – CloudFormation 不允許您將代碼創建和重用為模塊。 您可以使用 CloudFormation 中的嵌套堆棧來實現此要求,但使用 AWS CDK 是更合適的替代方案。

總而言之,這兩種工具在這方面都是相似的。

#5。 控制和治理

最終,對 AWS 控制台的所有訪問都由 AWS 的身份管理服務 IAM 控制。 您可以將 IAM 策略與 AWS CDK 和 Terraform 結合使用,以允許和拒絕某些操作。 IAM 允許您對可以對您的帳戶執行的操作進行細粒度控制。

除了使用 IAM 來控制對賬戶資源的訪問之外,Terraform 還提供了一個策略即代碼框架Sentinel 。 Sentinel 允許您編寫細粒度的策略,以通過 Terraform 正確控制用戶的操作。

結論

由於 AWS CDK 內部使用 CloudFormation,我建議您閱讀 CloudFormation 與 Terraform 文章,以更好地了解 AWS CDK 和 Terraform 之間的區別。

總體而言,AWS CDK 和 Terraform 都是成熟而強大的工具。 在數據操作方面,Terraform 有一個輕微的缺點。 但是,根據我的經驗,一旦您對編寫 Terraform 更加熟悉,使用變通方法和執行數據轉換就會變得更加容易。 對於多雲操作,Terraform 是一個顯而易見的選擇; 但是,如果您希望使用 AWS 作為您的雲提供商,AWS CDK 是一個很好的選擇。