AWS CDK 與 Terraform:如何抉擇?
雲計算深刻地改變了資訊科技的格局。從應用程式的部署與維護,到開發實務,雲計算的影響無處不在。如今,許多新應用程式都以雲原生為目標,並與雲端服務相容。
雲計算使得我們能夠構建高可用性、可擴展且高效的架構,這也進一步推升了對雲端服務的需求。隨著雲計算的蓬勃發展,以程式碼形式維護基礎架構變得至關重要。透過控制台手動管理雲資源是一項複雜且難以追蹤的任務。
基礎架構即程式碼(Infrastructure as Code, IAC)正是為了解決此問題。透過使用 IAC,我們可以將資源定義為程式碼,並利用這些程式碼來配置雲端服務。使用 IAC 可以讓多位開發人員協同作業於基礎架構,同時追蹤變更。
AWS 中的基礎架構即程式碼
AWS 是全球最大、最廣泛使用的雲端服務供應商。它擁有自己的 IAC 工具,如 AWS CloudFormation 或 AWS CDK,同時也允許使用 Terraform 等第三方 IAC 工具來配置資源。在為 AWS 選擇 IAC 工具時,第三方工具 Terraform 是 AWS 託管工具 AWS CloudFormation 和 AWS CDK 的強力競爭者。
由於這些工具都提供了豐富的選項與功能,因此選擇合適的 IAC 工具可能是一項挑戰。本文將探討 AWS CDK 和 Terraform 之間的差異。 AWS CDK 本質上是基於 CloudFormation 的,若想更深入了解 CloudFormation 和 Terraform,請參考其他相關的 IAC 工具比較文章:CloudFormation 與 Terraform。
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 CloudFormation 的一個封裝,它允許您使用熟悉的程式語言,如 JAVA 或 Python,來配置您的基礎架構。這使得程式碼的編寫和維護更加容易。
Terraform 與 AWS CDK:主要差異
#1. 語言和易用性
語言和易用性對於理解 AWS CDK 和 Terraform 之間的差異至關重要。
先從 Terraform 談起。Terraform 使用類似 JSON 的語言 HCL(即 HashiCorp Configuration Language)來定義資源和其他資料。HCL 相當簡潔,文檔易於理解和遵循,即使對於初學者也如此。
我們來看一段建立 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 更簡潔,但兩種程式碼都相當容易上手。如果您計畫將 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 是 AWS 提供的 IAC 產品。儘管 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 是一個很好的選擇。