

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

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

# 識別符和 AWS CDK
<a name="identifiers"></a>

建置 AWS 雲端開發套件 (AWS CDK) 應用程式時，您會使用許多類型的識別符和名稱。若要有效使用 AWS CDK 並避免錯誤，請務必了解識別符的類型。

識別符在建立它們的範圍內必須是唯一的；它們不需要在您的 AWS CDK 應用程式中全域是唯一的。

如果您嘗試在相同範圍內建立具有相同值的識別符， AWS CDK 會擲回例外狀況。

## 建構 IDs
<a name="identifiers-construct-ids"></a>

最常見的識別符 `id`是在執行個體化建構物件時作為第二個引數傳遞的識別符。此識別符與所有識別符一樣，只需要在建立識別符的範圍內是唯一的，這是執行個體化建構物件時的第一個引數。

**注意**  
堆疊`id`的 也是您在 [AWS CDK CLI 參考](cli.md)中用來參考它的識別符。

讓我們來看一個範例，其中有兩個具有 識別符的建構`MyBucket`。第一個定義在具有識別符 的堆疊範圍內`Stack1`。第二個定義在具有識別符 的堆疊範圍內`Stack2`。由於它們是在不同的範圍內定義，這不會造成任何衝突，而且它們可以在相同的應用程式中共存而不會發生問題。

**Example**  

```
import { App, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

class MyStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps = {}) {
    super(scope, id, props);

    new s3.Bucket(this, 'MyBucket');
  }
}

const app = new App();
new MyStack(app, 'Stack1');
new MyStack(app, 'Stack2');
```

```
const { App , Stack } = require('aws-cdk-lib');
const s3 = require('aws-cdk-lib/aws-s3');

class MyStack extends Stack {
  constructor(scope, id, props = {}) {
    super(scope, id, props);

    new s3.Bucket(this, 'MyBucket');
  }
}

const app = new App();
new MyStack(app, 'Stack1');
new MyStack(app, 'Stack2');
```

```
from aws_cdk import App, Construct, Stack, StackProps
from constructs import Construct
from aws_cdk import aws_s3 as s3

class MyStack(Stack):

    def __init__(self, scope: Construct, id: str, **kwargs):

        super().__init__(scope, id, **kwargs)
        s3.Bucket(self, "MyBucket")

app = App()
MyStack(app, 'Stack1')
MyStack(app, 'Stack2')
```

```
// MyStack.java
package com.myorg;

import software.amazon.awscdk.App;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;
import software.constructs.Construct;
import software.amazon.awscdk.services.s3.Bucket;

public class MyStack extends Stack {
    public MyStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public MyStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        new Bucket(this, "MyBucket");
    }
}

// Main.java
package com.myorg;

import software.amazon.awscdk.App;

public class Main {
    public static void main(String[] args) {
        App app = new App();
        new MyStack(app, "Stack1");
        new MyStack(app, "Stack2");
    }
}
```

```
using Amazon.CDK;
using constructs;
using Amazon.CDK.AWS.S3;

public class MyStack : Stack
{
    public MyStack(Construct scope, string id, IStackProps props) : base(scope, id, props)
    {
        new Bucket(this, "MyBucket");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var app = new App();
        new MyStack(app, "Stack1");
        new MyStack(app, "Stack2");
    }
}
```

## 路徑
<a name="identifiers-paths"></a>

 AWS CDK 應用程式中的建構會形成以 `App`類別為根的階層。我們將特定建構的 IDs 集合、其父建構、其祖父等稱為建構樹根目錄的*路徑*。

 AWS CDK 通常會將範本中的路徑顯示為字串。關卡的 IDs 會以斜線分隔，從根`App`執行個體下的節點開始，通常是堆疊。例如，上一個程式碼範例中兩個 Amazon S3 儲存貯體資源的路徑為 `Stack1/MyBucket`和 `Stack2/MyBucket`。

您可以程式設計方式存取任何建構的路徑，如下列範例所示。這會取得 `myConstruct`（或 `my_construct`，如 Python 開發人員所撰寫） 的路徑。由於 IDs 在建立的範圍內必須是唯一的，因此其路徑在 AWS CDK 應用程式中一律是唯一的。

**Example**  

```
const path: string = myConstruct.node.path;
```

```
const path = myConstruct.node.path;
```

```
path = my_construct.node.path
```

```
String path = myConstruct.getNode().getPath();
```

```
string path = myConstruct.Node.Path;
```

## 唯一 ID
<a name="identifiers-unique-ids"></a>

 AWS CloudFormation 要求範本中的所有邏輯 IDs 都是唯一的。因此， AWS CDK 必須能夠為應用程式中的每個建構產生唯一識別符。資源具有全域唯一的路徑 （從堆疊到特定資源的所有範圍名稱）。因此， AWS CDK 會透過串連路徑的元素並新增 8 位數雜湊來產生必要的唯一識別符。（需要雜湊來區分會導致相同 AWS CloudFormation 識別符的不同路徑`A/BC`，例如 `A/B/C`和 。 AWS CloudFormation 識別符是英數字元，不能包含斜線或其他分隔符號字元。) AWS CDK 會將此字串稱為建構的唯一 *ID*。

一般而言，您的 AWS CDK 應用程式應該不需要知道唯一 IDs。不過，您可以透過程式設計方式存取任何建構的唯一 ID，如下列範例所示。

**Example**  

```
const uid: string = Names.uniqueId(myConstruct);
```

```
const uid = Names.uniqueId(myConstruct);
```

```
uid = Names.unique_id(my_construct)
```

```
String uid = Names.uniqueId(myConstruct);
```

```
string uid = Names.Uniqueid(myConstruct);
```

*地址*是另一種唯一識別符，可唯一區分 CDK 資源。衍生自路徑的 SHA-1 雜湊，無法人類讀取。不過，其常數、相對較短的長度 （一律為 42 個十六進位字元），在「傳統」唯一 ID 可能太長的情況下很有用。有些建構可能使用合成 AWS CloudFormation 範本中的地址，而非唯一 ID。同樣地，您的應用程式通常不需要知道其建構結構的地址，但您可以擷取建構結構的地址，如下所示。

**Example**  

```
const addr: string = myConstruct.node.addr;
```

```
const addr = myConstruct.node.addr;
```

```
addr = my_construct.node.addr
```

```
String addr = myConstruct.getNode().getAddr();
```

```
string addr = myConstruct.Node.Addr;
```

## 邏輯 IDs
<a name="identifiers-logical-ids"></a>

唯一 IDs 做為代表資源之建構的 generated AWS CloudFormation 範本中 AWS 資源的*邏輯識別*符 （或*邏輯名稱*)。

例如，在上一個範例中建立的 Amazon S3 儲存貯體`Stack2`會產生 ` AWS::S3::Bucket` 資源。資源的邏輯 ID 位於 resulting AWS CloudFormation 範本`Stack2MyBucket4DD88B4F`中。（如需如何產生此識別碼的詳細資訊，請參閱[唯一 IDs](#identifiers-unique-ids)。)

### 邏輯 ID 穩定性
<a name="identifiers-logical-id-stability"></a>

建立資源之後，請避免變更資源的邏輯 ID。 AWS CloudFormation 會依資源的邏輯 ID 來識別資源。因此，如果您變更資源的邏輯 ID， AWS CloudFormation 會使用新的邏輯 ID 建立新的資源，然後刪除現有的資源。根據資源的類型，這可能會導致服務中斷、資料遺失或兩者。