

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護，並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS CDK 應用程式
<a name="apps"></a>

 AWS 雲端開發套件 (AWS CDK) 應用程式或*應用程式*是一或多個 CDK [堆疊](stacks.md)的集合。Stacks 是一或多個[建構的](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>

建構是使用傳遞給每個建構的`scope`引數在其他建構中定義，並將 `App`類別作為根。如此一來， 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`時之外，可以傳遞一些範圍。您可以在樹狀目錄中的任何位置新增建構，甚至在同一應用程式中的另一個堆疊中新增建構。例如，您可以撰寫混合樣式函數，將建構新增至傳遞為引數的範圍。這裡的實際困難在於，您無法輕鬆確保為建構選擇的 IDs 在其他人的範圍內是唯一的。此實務也讓您的程式碼更難以理解、維護和重複使用。因此，我們建議您使用建構樹的一般結構。

 AWS CDK 會使用從樹狀結構根到每個子建構的路徑中所有建構的 IDs，來產生 AWS CloudFormation 所需的唯一 IDs。此方法表示建構 IDs只需要在其範圍內是唯一的，而不需要像在 native 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` – 建構的完整路徑，包括其所有父項IDs。

1.  `node.root` – 建構樹 （應用程式） 的根目錄。

1.  `node.scope` – 建構的範圍 （父），如果節點是根，則為未定義。

1.  `node.scopes` – 建構的所有父系，直到根。

1.  `node.uniqueId` – 樹狀結構中此建構的唯一英數字元識別符 （預設為從 產生`node.path`和雜湊）。

建構樹會定義隱含順序，將建構合成至 final AWS CloudFormation 範本中的資源。其中一個資源必須在另一個資源之前建立， AWS CloudFormation 或 AWS Construct Library 通常會推斷相依性。然後，他們會確保以正確的順序建立資源。

您也可以使用 在兩個節點之間新增明確相依性`node.addDependency()`。如需詳細資訊，請參閱 * AWS CDK API 參考*中的[相依性](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#dependencies)。

 AWS CDK 提供一個簡單的方法來造訪建構樹中的每個節點，並對每個節點執行操作。如需詳細資訊，請參閱 [Aspects 和 AWS CDK](aspects.md)。