

这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段，并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 什么是 AWS CDK？
<a name="home"></a>

AWS 云开发工具包 (AWS CDK) 是一种开源软件开发框架，用于在代码中定义云基础设施和通过 AWS CloudFormation 对其进行预置。

AWS CDK 包含两个主要部分：
+  **[AWS CDK 构造库](constructs.md) ** – 一组预先编写的模块化和可重用代码，称为构造，您可以使用、修改它，也可将其集成以便快速开发基础设施。AWS CDK 构造库的目标是降低在 AWS 上构建应用程序时同时定义和集成 AWS 服务的复杂性。
+  AWS CDK 工具包 - 可用于管理 CDK 应用程序并与之交互的工具，例如执行合成或部署。CDK 工具包由命令行工具 ([CDK CLI](ref-cli-cmd.md)) 和编程库（[CDK 工具包库](toolkit-library.md)）组成。

AWS CDK 支持 TypeScript、JavaScript、Python、Java、C\#/.Net 和 Go。您可以使用其中任何一种编程语言中来定义称为[构造](constructs.md)的可重用的云组件。您可以将构造组合成[堆栈](stacks.md)和[应用程序](apps.md)。然后，通过 AWS CloudFormation 部署您的 CDK 应用程序以预置或更新资源。

![CDK 应用程序和流程概述](http://docs.aws.amazon.com/zh_cn/cdk/v2/guide/images/AppStacks.png)


## AWS CDK 的好处
<a name="home-benefits"></a>

通过 AWS CDK，您可借助编程语言的强大表达能力，在云中构建可靠、可扩展且成本高效的应用程序。这种方法有许多好处，包括：<a name="home-benefits-iac"></a>

 **开发和管理基础设施即代码（IaC）**   
实践*基础设施即代码*，以编程、描述性和声明性的方式创建、部署和维护基础设施。通过 IaC，您可以像开发人员对待代码一样对待基础设施。这为您提供了一种可扩展的结构化方法来管理基础设施。要了解有关 IaC 的更多信息，请参阅《AWS 上的 DevOps 简介白皮书》**中的[基础设施即代码](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)。  
通过 AWS CDK，您可以将基础设施、应用程序代码和配置集中放置于一处，确保在每个里程碑上都获得可在云上部署的完整系统。采用代码审查、单元测试和源代码控制等软件工程最佳实践，使您的基础设施更可靠。<a name="home-benefits-languages"></a>

 **使用通用编程语言定义您的云基础设施**   
通过 AWS CDK，您可以使用以下任何一种编程语言来定义云基础设施：TypeScript、JavaScript、Python、Java、C\#/.Net 和 Go。选择首选语言，并使用参数、条件、循环、组合和继承等编程元素来定义基础设施的预期结果。  
使用相同的编程语言来定义基础设施和应用程序逻辑。  
享受在首选集成式开发环境（IDE）中开发基础设施的好处，例如语法高亮显示和智能代码补全。  

![代码片段显示带有 VPC 和 Fargate 服务配置的 ECS 集群的 CDK 设置。](http://docs.aws.amazon.com/zh_cn/cdk/v2/guide/images/CodeCompletion.png)
<a name="home-benefits-cfn"></a>

 **通过 AWS CloudFormation 部署基础设施**   
 AWS CDK 与 AWS CloudFormation 集成，可在 AWS 上部署和预置您的基础设施。AWSCloudFormation 是一项托管式 AWS 服务，可为在 AWS 上预置服务提供广泛的资源和属性配置支持。通过 AWS CloudFormation，您可以可预测地重复执行基础设施部署，并在出错时进行回滚。如果您已经熟悉 AWS CloudFormation，则无需了解新的 IaC 管理服务即可开始使用 AWS CDK。<a name="home-benefits-constructs"></a>

 **使用构造快速开始开发应用程序**   
通过使用和共享称为构造的可重用组件加快开发速度。使用低级别构造定义单个 AWS CloudFormation 资源及其属性。使用高级别构造快速定义应用程序的较大组件，为 AWS 资源设置合理、安全的默认值，进而用更少的代码定义更多的基础设施。  
根据您的独特用例自行创建构造，并在组织内共享甚至与公众共享。

## AWS CDK 的示例
<a name="home-example"></a>

以下是使用 AWS CDK 构造库创建启动类型为 AWS 的 Amazon Elastic Container Service (Amazon ECS) 服务的示例。有关此示例的更多详细信息，请参阅[示例：使用 AWS CDK 创建 AWS Fargate 服务](ecs-example.md)。

**Example**  

```
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
    });
  }
}
```

```
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 }
```

```
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
```

```
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();
  }
}
```

```
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,
        });
    }
}
```

```
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 多种以下类型的资源：
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-route-table-assoc.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-route-table-assoc.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) 
+  [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html) 

## AWS CDK 功能
<a name="home-features"></a>

### AWS CDK GitHub 存储库
<a name="home-features-repo"></a>

有关官方 AWS CDK GitHub 存储库，请参阅 [aws-cdk](https://github.com/aws/aws-cdk)。您可以在其中提交[问题](https://github.com/aws/aws-cdk/issues)、查看我们的[许可证](https://github.com/aws/aws-cdk/blob/main/LICENSE)、跟踪[版本](https://github.com/aws/aws-cdk/releases)等。

由于 AWS CDK 是开源的，其开发团队鼓励您贡献内容，使其成为更好的工具。有关详细信息，请参阅 [Contributing to the AWS Cloud Development Kit (AWS CDK)](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md)。

### AWS CDK API 参考
<a name="home-features-api"></a>

AWS CDK 构造库提供了各种 API，供您定义 CDK 应用程序并向应用程序添加 CDK 构造。有关更多信息，请参阅 [AWS CDK API 参考](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html)。

### 构造编程模型
<a name="home-features-cpm"></a>

构造编程模型 (CPM) 将 AWS CDK 背后的相关概念扩展到其他领域。使用 CPM 的其他工具包括：
+  [适用于 Terraform 的 CDK](https://www.terraform.io/docs/cdktf/index.html)（CDKtf）
+  [适用于 Kubernetes 的 CDK](https://cdk8s.io/)（CDK8s）
+  [Projen](https://github.com/projen/projen)，用于构建项目配置

### Construct Hub
<a name="home-features-hub"></a>

[Construct Hub](https://constructs.dev/) 是一个在线注册表，您可以在其中查找、发布和共享开源 AWS CDK 库。

## 后续步骤
<a name="home-next"></a>

要开始使用 AWS CDK，请参阅[开始使用 AWS CDK](getting-started.md)。

## 了解更多
<a name="home-learn"></a>

要进一步了解 AWS CDK 的更多信息，请参阅以下资源：
+  **[了解 AWS CDK 核心概念](core-concepts.md)** – AWS CDK 的重要概念和术语。
+  **[AWS CDK 讲习会](https://cdkworkshop.com/)** – 动手实践讲习会，可供学习和使用 AWS CDK。
+  **[AWS CDK 模式](https://cdkpatterns.com/)** – 由 AWS 专家为 AWS CDK 构建的 AWS 无服务器架构模式的开源集合。
+  **[AWS CDK 代码示例](https://github.com/aws-samples/aws-cdk-examples) ** – 示例 AWS CDK 项目的 GitHub 存储库。
+  **[cdk.dev](https://cdk.dev/)** – AWS CDK 的社区驱动的中心，包括社区 Slack 工作区。
+  **[Awesome CDK](https://github.com/kalaiser/awesome-cdk)** – 包含精选 AWS CDK 开源项目、指南、博客和其他资源的 GitHub 存储库。
+  **[AWS 解决方案构造](https://aws.amazon.com/solutions/constructs/) ** – 经过审查的配置基础设施即代码 (IaC) 模式，可以轻松组装到生产就绪的应用程序中。
+  **[AWS 开发人员工具博客](https://aws.amazon.com/blogs/developer/category/developer-tools/aws-cloud-development-kit/)** – 针对 AWS CDK 筛选的博客文章。
+  **[Stack Overflow 上的 AWS CDK](https://stackoverflow.com/questions/tagged/aws-cdk)** – Stack Overflow 上带有 **aws-cdk** 标签的问题。
+  **[适用于 AWS Cloud9 的 AWS CDK 教程](https://docs.aws.amazon.com/cloud9/latest/user-guide/sample-cdk.html)** – 关于在 AWS Cloud9 开发环境中使用 AWS CDK 的教程。

要了解 AWS CDK 相关主题的更多信息，请参阅以下资源：
+  **[AWS CloudFormation 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html)** – 由于 AWS CDK 支持与 AWS CloudFormation 搭配使用，我们建议您了解和理解关键 AWS CloudFormation 概念。
+  **[AWS 术语表](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html)** – AWS 中使用的关键术语的定义。

要了解可用于简化无服务器应用程序开发和部署的 AWS CDK 相关工具的更多信息，请参阅以下资源：
+  ** [AWS Serverless Application Model](https://aws.amazon.com/serverless/sam/) ** – 一种开源开发人员工具，可简化和改善在 AWS 上构建和运行无服务器应用程序的体验。
+  ** [AWS Chalice](https://github.com/aws/chalice) ** – 用于在 Python 中编写无服务器应用程序的框架。