

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

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

# AWS CDK 应用程序
<a name="apps"></a>

AWS 云开发工具包 (AWS CDK) 应用程序（或*应用*）是一个或多个 CDK [堆栈](stacks.md)的集合。堆栈是一个或多个[构造](constructs.md)的集合，用于定义 AWS 资源和属性。因此，堆栈和构造的整体分组称为 CDK 应用程序。

## 如何创建 CDK 应用程序
<a name="apps-define"></a>

您可以通过在[项目](projects.md)的应用程序文件中定义应用程序实例来创建应用程序。为此，您需要导入并使用 AWS 构造库中的[应用程序](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.App.html)构造。`App` 构造不需要任何初始化参数。它是唯一可以用作根的构造。

AWS 构造库中的 ` [App](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.App.html) ` 和 ` [Stack](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Stack.html) ` 类是唯一的构造。与其他构造相比，这两类不会自行配置 AWS 资源。但可用于为其他构造提供上下文。所有代表 AWS 资源的构造必须在 `Stack` 构造的作用域内直接或间接地定义。`Stack` 构造在 `App` 构造的作用域内定义。

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

**Example**  

```
const app = new App();
new MyFirstStack(app, 'hello-cdk');
app.synth();
```

```
const app = new App();
new MyFirstStack(app, 'hello-cdk');
app.synth();
```

```
app = App()
MyFirstStack(app, "hello-cdk")
app.synth()
```

```
App app = new App();
new MyFirstStack(app, "hello-cdk");
app.synth();
```

```
var app = new App();
new MyFirstStack(app, "hello-cdk");
app.Synth();
```

```
app := awscdk.NewApp(nil)

MyFirstStack(app, "MyFirstStack", &MyFirstStackProps{
  awscdk.StackProps{
    Env: env(),
  },
})

app.Synth(nil)
```

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

## 构造树
<a name="apps-tree"></a>

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

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

构造*始终*在另一构造范围内明确定义，这样可在构造之间建立关系。通常将 `this`（Python，`self`）作为范围进行传递，表明新构造是当前构造的子级。预期模式是从 [https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.Construct.html](https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.Construct.html) 中派生构造，然后实例化其在构造函数中使用的构造。

明确传递范围后，各个构造均可将其添加到树中，这种行为完全包含在 [`Construct` 基类](https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.Construct.html)中。其使用 AWS CDK 支持的各种语言按照相同方式运行，无需额外自定义。

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

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

构造树与您使用 AWS CDK 代码定义的构造无关。但其可通过任何构造的 `node` 属性进行访问，该属性引用了树中表示该构造的节点。各节点均为 [https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.Node.html](https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.Node.html) 实例，其属性提供对树根以及该节点的父范围和子级的访问权限。

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

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

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

1.  `node.root` – 构造树（应用程序）的根。

1.  `node.scope` – 构造的范围（父项），如果节点为根，则未定义。

1.  `node.scopes` – 构造的所有父项，直至根。

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

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

也可以使用 `node.addDependency()` 在两个节点之间添加显式依赖项。有关更多信息，请参阅《AWS CDK API 参考》**中的[依赖项](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#dependencies)。

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