AWS CDK 应用程序 - AWS Cloud Development Kit (AWS CDK) v2

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

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

AWS CDK 应用程序

AWS 云开发工具包 (AWS CDK) 应用程序(或应用)是一个或多个 CDK 堆栈的集合。堆栈是一个或多个构造的集合,用于定义 AWS 资源和属性。因此,堆栈和构造的整体分组称为 CDK 应用程序。

如何创建 CDK 应用程序

您可以通过在项目的应用程序文件中定义应用程序实例来创建应用程序。为此,您需要导入并使用 AWS 构造库中的应用程序构造。App 构造不需要任何初始化参数。它是唯一可以用作根的构造。

AWS 构造库中的 App Stack 类是唯一的构造。与其他构造相比,这两类不会自行配置 AWS 资源。但可用于为其他构造提供上下文。所有代表 AWS 资源的构造必须在 Stack 构造的作用域内直接或间接地定义。Stack 构造在 App 构造的作用域内定义。

然后合成应用程序,为堆栈创建 AWS CloudFormation 模板。以下是示例:

TypeScript
const app = new App(); new MyFirstStack(app, 'hello-cdk'); app.synth();
JavaScript
const app = new App(); new MyFirstStack(app, 'hello-cdk'); app.synth();
Python
app = App() MyFirstStack(app, "hello-cdk") app.synth()
Java
App app = new App(); new MyFirstStack(app, "hello-cdk"); app.synth();
C#
var app = new App(); new MyFirstStack(app, "hello-cdk"); app.Synth();
Go
app := awscdk.NewApp(nil) MyFirstStack(app, "MyFirstStack", &MyFirstStackProps{ awscdk.StackProps{ Env: env(), }, }) app.Synth(nil)

单个应用程序中的堆栈可以轻松地相互引用资源和属性。AWS CDK 推断堆栈之间的依赖项,以便按正确的顺序部署堆栈。只需一个 cdk deploy 命令即可在应用程序中部署任何或全部堆栈。

构造树

构造以 App 类为根,使用传递至各个构造的 scope 参数在其他构造中进行定义。通过这种方式,AWS CDK 应用程序定义称为构造树的构造层次结构。

构造树的根是应用程序,即 App 类的实例。在应用程序中,您可以实例化一个或多个堆栈。在堆栈中,您可以实例化构造,这些构造本身可以实例化资源或其他构造,构造树亦然。

构造始终在另一构造范围内明确定义,这样可在构造之间建立关系。通常将 this(Python,self)作为范围进行传递,表明新构造是当前构造的子级。预期模式是从 Construct 中派生构造,然后实例化其在构造函数中使用的构造。

明确传递范围后,各个构造均可将其添加到树中,这种行为完全包含在 Construct 基类中。其使用 AWS CDK 支持的各种语言按照相同方式运行,无需额外自定义。

重要

从技术上讲,在实例化构造时,除了 this 之外,还可以传递其他范围。您可以在树的任意位置甚至在同一应用程序的其他堆栈中添加构造。例如,您可以编写混合风格函数,将构造添加到作为参数传入的范围中。这里的难点在于,您无法轻易确保为构造选择的 ID 在其他范围内是唯一的。这种做法还会导致代码更难理解、维护和重用。因此,我们建议使用构造树的一般结构。

AWS CDK 使用从树根到各个子构造的路径中所有构造的 ID 生成 AWS CloudFormation 所需的唯一 ID。这种方法意味着,构造 ID 只需在其范围内保持唯一性,而不必像在原生 AWS CloudFormation 中在整个堆栈中保持唯一性。但若将构造移至其他范围,则其生成的堆栈唯一 ID 会发生变化,并且 AWS CloudFormation 不会将其视为同一资源。

构造树与您使用 AWS CDK 代码定义的构造无关。但其可通过任何构造的 node 属性进行访问,该属性引用了树中表示该构造的节点。各节点均为 Node 实例,其属性提供对树根以及该节点的父范围和子级的访问权限。

  1. node.children – 构造的直接子级。

  2. node.id – 构造在其范围内的标识符。

  3. node.path – 构造的完整路径,包括其所有父项的 ID。

  4. node.root – 构造树(应用程序)的根。

  5. node.scope – 构造的范围(父项),如果节点为根,则未定义。

  6. node.scopes – 构造的所有父项,直至根。

  7. node.uniqueId – 树中此构造的唯一字母数字标识符(默认由 node.path 和哈希生成)。

构造树定义了将构造合成为最终 AWS CloudFormation 模板中资源的隐式排序。其中一个资源必须在另一资源之前创建,AWS CloudFormation 或 AWS 构造库通常会推断依赖关系。然后确保按正确的顺序创建资源。

也可以使用 node.addDependency() 在两个节点之间添加显式依赖项。有关更多信息,请参阅《AWS CDK API 参考》中的依赖项

AWS CDK 提供了一种访问构造树各节点与对其执行操作的简单方法。有关更多信息,请参阅方面和 AWS CDK