什麼是 AWS CDK? - AWS Cloud Development Kit (AWS CDK) v2

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

什麼是 AWS CDK?

這 AWS Cloud Development Kit (AWS CDK) 是一個開放原始碼軟體開發架構,用於在程式碼中定義雲端基礎架構,並透過 AWS CloudFormation.

AWS CDK 由兩個主要部分組成:

  • AWS CDK 建構程式庫 — 預先撰寫的模組化且可重複使用的程式碼集合 (稱為建構),您可以使用、修改和整合以快速開發基礎結構。 AWS CDK 建構程式庫的目標是降低在建置應用程式時定義和整合 AWS 服務所需的複雜性 AWS。

  • AWS CDK 命令行界面(AWS CDKCLI)— 用於與CDK應用程序交互的命令行工具。使用建CDKCLI立、管理和部署您的 AWS CDK 專案。也稱為「CDKCLICDK工具組」。

支 AWS CDK 撐TypeScript、JavaScriptPython、Java、C#/.Net、和Go。您可以使用任何這些支援的程式設計語言來定義稱為建構可重複使用的雲端元件。您可以將這些組合成堆疊應用程式。然後,您將CDK應用程式部署 AWS CloudFormation 到佈建或更新資源。

AWS CDK app structure with stacks, constructs, and deployment to CloudFormation.

的好處 AWS CDK

使用在雲端中 AWS CDK 開發可靠、可擴充且具成本效益的應用程式,並具備程式設計語言的顯著表現力。這種方法產生了許多好處,包括:

開發和管理您的基礎架構即程式碼 (IaC)

練習基礎結構即程式碼,以程式設計、描述性和宣告式的方式建立、部署和維護基礎結構。有了 IaC,您可以像開發人員處理程式碼一樣對待基礎結構。這導致了一種可擴展的結構化方法來管理基礎結構。要了解有關 IaC 的更多信息,請參閱 AWS 白皮書簡介中的基礎結構即 DevOps 代碼

有了 AWS CDK,您可以將基礎結構、應用程式程式碼和組態集中在一個位置,確保您在每個里程碑都擁有完整、可雲端部署的系統。運用軟體工程最佳實務,例如程式碼檢閱、單元測試和原始檔控制,讓您的基礎架構更加穩固。

使用一般用途程式設計語言定義雲端基礎架構

透過 AWS CDK,您可以使用下列任何一種程式設計語言來定義雲端基礎結構:TypeScriptJavaScriptPython、Java、C#/.Net、、和Go。選擇您偏好的語言,並使用參數、條件、迴圈、組合和繼承等程式設計元素來定義基礎結構所需的結果。

使用相同的程式設計語言來定義基礎結構和應用程式邏輯。

獲得在您偏好的 IDE (整合式開發環境) 中開發基礎結構的好處,例如語法醒目提示和智慧型程式碼完成。

Code snippet showing AWS CDK setup for ECS 叢集 with VPC and Fargate service configuration.
部署基礎架構 AWS CloudFormation

AWS CDK 與整合 AWS CloudFormation 以部署和佈建您的基礎架構 AWS。 AWS CloudFormation 是一個託管的 AWS 服務 ,提供對資源和屬性配置的廣泛支持,用於佈建服務 AWS。使用時 AWS CloudFormation,您可以預測並重複執行基礎結構部署,並發生錯誤的復原。如果您已經熟悉了 AWS CloudFormation,您不必在 AWS CDK開始使用時學習新的 IaC 管理服務。

使用建構快速開發應用程式

使用和共用稱為建構的可重複使用元件,加快開發速度。使用低階建構來定義個別 AWS CloudFormation 資源及其屬性。使用高階建構來快速定義應用程式的較大元件,為您的 AWS 資源提供合理且安全的預設值,以較少的程式碼定義更多的基礎結構。

建立您自己的建構,並針對您的獨特使用案例進行自訂,並在整個組織或甚至公眾共用這些建構。

的例子 AWS CDK

以下是使用建 AWS CDK 構函式庫建立具有 AWS Fargate 啟動類型的 Amazon 彈性容器服務 (AmazonECS) 服務的範例。如需此範例的詳細資訊,請參閱範例: AWS Fargate 使用 AWS CDK

TypeScript
export class MyEcsConstructStack extends Stack { constructor(scope: App, id: string, props?: StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, "MyVpc", { maxAzs: 3 // Default is all AZs in region }); const cluster = new ecs.Cluster(this, "MyCluster", { vpc: vpc }); // Create a load-balanced Fargate service and make it public new ecs_patterns.ApplicationLoadBalancedFargateService(this, "MyFargateService", { cluster: cluster, // Required cpu: 512, // Default is 256 desiredCount: 6, // Default is 1 taskImageOptions: { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample") }, memoryLimitMiB: 2048, // Default is 512 publicLoadBalancer: true // Default is false }); } }
JavaScript
class MyEcsConstructStack extends Stack { constructor(scope, id, props) { super(scope, id, props); const vpc = new ec2.Vpc(this, "MyVpc", { maxAzs: 3 // Default is all AZs in region }); const cluster = new ecs.Cluster(this, "MyCluster", { vpc: vpc }); // Create a load-balanced Fargate service and make it public new ecs_patterns.ApplicationLoadBalancedFargateService(this, "MyFargateService", { cluster: cluster, // Required cpu: 512, // Default is 256 desiredCount: 6, // Default is 1 taskImageOptions: { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample") }, memoryLimitMiB: 2048, // Default is 512 publicLoadBalancer: true // Default is false }); } } module.exports = { MyEcsConstructStack }
Python
class MyEcsConstructStack(Stack): def __init__(self, scope: Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) vpc = ec2.Vpc(self, "MyVpc", max_azs=3) # default is all AZs in region cluster = ecs.Cluster(self, "MyCluster", vpc=vpc) ecs_patterns.ApplicationLoadBalancedFargateService(self, "MyFargateService", cluster=cluster, # Required cpu=512, # Default is 256 desired_count=6, # Default is 1 task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions( image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")), memory_limit_mib=2048, # Default is 512 public_load_balancer=True) # Default is False
Java
public class MyEcsConstructStack extends Stack { public MyEcsConstructStack(final Construct scope, final String id) { this(scope, id, null); } public MyEcsConstructStack(final Construct scope, final String id, StackProps props) { super(scope, id, props); Vpc vpc = Vpc.Builder.create(this, "MyVpc").maxAzs(3).build(); Cluster cluster = Cluster.Builder.create(this, "MyCluster") .vpc(vpc).build(); ApplicationLoadBalancedFargateService.Builder.create(this, "MyFargateService") .cluster(cluster) .cpu(512) .desiredCount(6) .taskImageOptions( ApplicationLoadBalancedTaskImageOptions.builder() .image(ContainerImage .fromRegistry("amazon/amazon-ecs-sample")) .build()).memoryLimitMiB(2048) .publicLoadBalancer(true).build(); } }
C#
public class MyEcsConstructStack : Stack { public MyEcsConstructStack(Construct scope, string id, IStackProps props=null) : base(scope, id, props) { var vpc = new Vpc(this, "MyVpc", new VpcProps { MaxAzs = 3 }); var cluster = new Cluster(this, "MyCluster", new ClusterProps { Vpc = vpc }); new ApplicationLoadBalancedFargateService(this, "MyFargateService", new ApplicationLoadBalancedFargateServiceProps { Cluster = cluster, Cpu = 512, DesiredCount = 6, TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions { Image = ContainerImage.FromRegistry("amazon/amazon-ecs-sample") }, MemoryLimitMiB = 2048, PublicLoadBalancer = true, }); } }
Go
func NewMyEcsConstructStack(scope constructs.Construct, id string, props *MyEcsConstructStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) vpc := awsec2.NewVpc(stack, jsii.String("MyVpc"), &awsec2.VpcProps{ MaxAzs: jsii.Number(3), // Default is all AZs in region }) cluster := awsecs.NewCluster(stack, jsii.String("MyCluster"), &awsecs.ClusterProps{ Vpc: vpc, }) awsecspatterns.NewApplicationLoadBalancedFargateService(stack, jsii.String("MyFargateService"), &awsecspatterns.ApplicationLoadBalancedFargateServiceProps{ Cluster: cluster, // required Cpu: jsii.Number(512), // default is 256 DesiredCount: jsii.Number(5), // default is 1 MemoryLimitMiB: jsii.Number(2048), // Default is 512 TaskImageOptions: &awsecspatterns.ApplicationLoadBalancedTaskImageOptions{ Image: awsecs.ContainerImage_FromRegistry(jsii.String("amazon/amazon-ecs-sample"), nil), }, PublicLoadBalancer: jsii.Bool(true), // Default is false }) return stack }

這個類生成超過 500 行的 AWS CloudFormation 模板。部署 AWS CDK 應用程式會產生以下類型的 50 多種資源。

AWS CDK features

AWS CDKGitHub儲存庫

如需官方 AWS CDK GitHub儲存庫,請參閱 aws-cdk。在這裡,您可以提交問題,查看我們的許可證,跟踪版本等。

由於它 AWS CDK 是開源的,因此該團隊鼓勵您為使其成為更好的工具做出貢獻。如需詳細資訊,請參閱貢獻給 AWS Cloud Development Kit (AWS CDK).

該 AWS CDK API參考

AWS CDK 構造庫提供了APIs定義您的CDK應用程序並將CDK構造添加到應用程序。如需詳細資訊,請AWS CDK API參閱參考

構建編程模型

構造編程模型(CPM)將背後的概念擴展 AWS CDK 到其他領域中。其他使用的工具CPM包括:

構建樞紐

構造中心是一個在線註冊表,您可以在其中查找,發布和共享開源 AWS CDK 庫。

後續步驟

若要開始使用 AWS CDK,請參閱開始使用 AWS CDK

進一步了解

若要繼續瞭解 AWS CDK,請參閱下列內容:

若要進一步了解的相關主題 AWS CDK,請參閱下列內容:

  • AWS CloudFormation 概念 — 由於專 AWS CDK 為搭配使用而建置 AWS CloudFormation,因此我們建議您學習並瞭解關鍵 AWS CloudFormation 概念。

  • AWS 詞彙表 — 所用關鍵詞彙的定義 AWS。

若要深入了解與可用來簡化無伺服器應用程式開發和部署的相關工具,請參閱下列內容: AWS CDK

  • AWS Serverless Application Model— 一種開放原始碼開發人員工具,可簡化並改善在上建置和執行無伺服器應用程式的 AWS體驗。

  • AWSChalice-用於編寫無服務器應用程序的框架。Python