这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS CDK 是什么?
C AWS loud Development Kit (AWS CDK) 是一个开源软件开发框架,用于在代码中定义云基础架构并通过它进行 AWS CloudFormation配置。
AWS CDK 由两个主要部分组成:
-
AWS CDK Construct Library — 一组预先编写的模块化和可重复使用的代码,称为构造,您可以使用、修改和集成这些代码来快速开发基础架构。 AWS CDK Construct Library 的目标是降低在构建应用程序时定义和集成 AWS 服务所需的复杂性。 AWS
-
AWS CDK Toolkit-可用于管理 CDK 应用程序并与之交互的工具,例如执行合成或部署。CDK 工具包由命令行工具 (CDK CLI) 和编程库(CDK 工具包库)组成。
AWS CDK 支持 TypeScript、、Python JavaScript、Java、C#/Net 和。Go您可以使用其中任何一种编程语言中来定义称为构造的可重用的云组件。您可以将构造组合成堆栈和应用程序。然后,您可以通过部署 CDK 应用程序 AWS CloudFormation 来配置或更新您的资源。
AWS CDK 的好处
借助编程语言的强大表现力,使用 AWS CDK 在云端开发可靠、可扩展、经济实惠的应用程序。这种方法有许多好处,包括:
- 开发和管理您的基础设施即代码 (IaC)
-
实践基础设施即代码,以编程、描述性和声明性的方式创建、部署和维护基础设施。通过 IaC,您可以像开发人员对待代码一样对待基础设施。这为您提供了一种可扩展的结构化方法来管理基础设施。要了解有关 IaC 的更多信息,请参阅 AWS 白皮书简介中的基础设施即 DevOps 代码。
借助 AWS CDK,您可以将基础架构、应用程序代码和配置全部放在一个地方,确保在每个里程碑上都有一个完整的、可在云端部署的系统。采用代码审查、单元测试和源代码控制等软件工程最佳实践,使您的基础设施更可靠。
- 使用通用编程语言定义您的云基础架构
-
使用 AWS CDK,您可以使用以下任何一种编程语言来定义您的云基础架构: TypeScript、、Python、 JavaScript Java、C#/Net 和。Go选择首选语言,并使用参数、条件、循环、组合和继承等编程元素来定义基础设施的预期结果。
使用相同的编程语言来定义基础设施和应用程序逻辑。
享受在首选集成式开发环境(IDE)中开发基础设施的好处,例如语法高亮显示和智能代码补全。
- 通过以下方式部署基础架构 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 ECS) 服务的示例。有关此示例的更多详细信息,请参阅示例:使用 CDK 创建 AWS Fargate 服务。 AWS
- 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 功能
AWS CDK 存储库 GitHub
有关官方 AWS CDK GitHub 存储库,请参阅 aw s-cdk。您可以在其中提交问题、查看我们的许可证、跟踪版本等。
由于 AWS CDK 是开源的,因此团队鼓励您做出贡献,使其成为更好的工具。如需了解详情,请参阅为 C AWS loud Development Kit (AWS CDK) 做出贡献。
AWS CDK API 参考资料
AWS CDK 构造库用于定义您的 CDK 应用程序并 APIs 向应用程序添加 CDK 结构。如需了解更多信息,请参阅 AWS CDK API 参考。
构造编程模型
构造编程模型 (CPM) 将 AWS CDK 背后的概念扩展到其他领域。使用 CPM 的其他工具包括:
Construct Hub
C onstru ct Hub 是一个在线注册表,您可以在其中查找、发布和共享开源 AWS CDK 库。
后续步骤
要开始使用 AWS CDK,请参阅 AWS CDK 入门。
了解更多
要继续了解 AWS CDK,请参阅以下内容:
要了解有关 AWS CDK 相关主题的更多信息,请参阅以下内容:
要详细了解可用于简化无服务器应用程序开发和部署的 AWS CDK 相关工具,请参阅以下内容: