那是什么 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 C@@ onstruct Library — 一组预先编写的模块化和可重复使用的代码,称为构造,您可以使用、修改和集成这些代码来快速开发基础架构。Constru AWS CDK ct Library 的目标是降低在构建应用程序时定义和集成 AWS 服务所需的复杂性 AWS。

  • AWS CDK 命令行界面 (AWS CDKCLI)-用于与CDK应用程序交互的命令行工具。CDKCLI使用创建、管理和部署您的 AWS CDK 项目。CDKCLI也称为 “CDK工具包”。

AWS CDK 支持TypeScript、JavaScript、Python、JavaC#/.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,您可以使用以下任何一种编程语言来定义您的云基础架构:TypeScriptJavaScript、Python、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,那么在开始使用时,您不必学习新的 IaC 管理服务。 AWS CDK

使用构造快速开始开发应用程序

通过使用和共享称为构造的可重复使用的组件,加快开发速度。使用低级结构来定义单个 AWS CloudFormation 资源及其属性。使用高级结构快速定义应用程序的较大组件,为您的 AWS 资源设置合理、安全的默认值,用更少的代码定义更多的基础架构。

根据您的独特用例创建您自己的构造,并在组织内甚至与公众共享。

的示例 AWS CDK

以下是使用 AWS CDK 构造库创建 AWS Fargate (Fargate) 启动类型的亚马逊弹性容器服务 (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 }

该类生成的 AWS CloudFormation 模板超过 500 行。部署该 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包括:

建筑中心

C onstruc t Hub 是一个在线注册表,您可以在其中查找、发布和共享开源 AWS CDK 库。

后续步骤

要开始使用 AWS CDK,请参阅开始使用 AWS CDK

了解更多

要继续了解 AWS CDK,请参阅以下内容:

  • 学习 AWS CDK 核心概念— 的重要概念和术语 AWS CDK.

  • AWS CDK 研讨会 —动手研讨会,用于学习和使用 AWS CDK.

  • AWS CDK P@@ at terns — AWS CDK 由 AWS 专家为用户构建的 AWS 无服务器架构模式的开源集合。

  • AWS CDK 代码示例 — 示例 AWS CDK 项目的GitHub存储库。

  • cdk.dev — 社区驱动的中心 AWS CDK,包括社区工作区。Slack

  • 太棒了 CDK — 包含开 AWS CDK 源项目、指南、博客和其他资源的精选列表的GitHub存储库。

  • AWS 解决方案构造 — 经过审查的配置基础设施即代码 (IaC) 模式,可以轻松组装到生产就绪的应用程序中。

  • AWS 开发者工具博客 —针对以下内容筛选的博客文章 AWS CDK.

  • AWS CDK on Stack Overflow — 用 aws-cd k 标记的问题已开启。Stack Overflow

  • AWS CDK 的教程 AWS Cloud9— 关于在 AWS Cloud9 开发环境中 AWS CDK 使用的教程。

要了解有关相关主题的更多信息 AWS CDK,请参阅以下内容:

  • AWS CloudFormation 概念 — 由于 AWS CDK 是为使用而构建的 AWS CloudFormation,因此我们建议您学习和理解关键 AWS CloudFormation 概念。

  • AWS 词汇表-使用的关键术语的定义 AWS。

要详细了解可用于简化无服务器应用程序开发和部署的相关工具,请参阅以下内容: AWS CDK

  • AWS Serverless Application Model— 一种开源开发者工具,可简化和改善在上 AWS构建和运行无服务器应用程序的体验。

  • AWSChalice— 用于在中编写无服务器应用程序的Python框架。