这是 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
利用编程语言的 AWS CDK 强大表现力,使用在云端开发可靠、可扩展、经济实惠的应用程序。这种方法有许多好处,包括:
- 开发和管理您的基础设施即代码 (IaC)
-
实践基础架构即代码,以编程、描述性和声明性的方式创建、部署和维护基础架构。使用 IaC,您可以像开发人员对待代码一样对待基础架构。这就形成了一种可扩展的结构化方法来管理基础架构。要了解有关 IaC 的更多信息,请参阅 AWS 白皮书简介中的基础设施即 DevOps 代码。
借助 AWS CDK,您可以将基础架构、应用程序代码和配置全部放在一个地方,确保在每个里程碑上都有一个完整的、可在云端部署的系统。采用软件工程最佳实践,例如代码审查、单元测试和源代码控制,使您的基础架构更加强大。
- 使用通用编程语言定义您的云基础架构
-
借助 AWS CDK,您可以使用以下任何一种编程语言来定义您的云基础架构:TypeScriptJavaScript、Python、Java、C#/.Net、和Go。选择您的首选语言,并使用参数、条件、循环、组合和继承等编程元素来定义基础设施的预期结果。
使用相同的编程语言来定义您的基础架构和应用程序逻辑。
享受在首选IDE(集成开发环境)中开发基础设施的好处,例如语法高亮显示和智能代码完成。
- 通过以下方式部署基础架构 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