

これは AWS CDK v2 デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 識別子と AWS CDK
<a name="identifiers"></a>

AWS Cloud Development Kit (AWS CDK) アプリを構築するときは、さまざまなタイプの識別子および名前を使用します。AWS CDK を効果的に使用してエラーを回避するには、識別子の種類を理解することが重要です。

識別子は、作成された範囲内で一意である必要があります。AWS CDK アプリケーションでグローバルに一意である必要はありません。

同じ範囲内で同じ値を持つ識別子を作成しようとした場合、AWS CDK は例外をスローします。

## コンストラクト ID
<a name="identifiers-construct-ids"></a>

最も一般的な識別子の `id` は、コンストラクトオブジェクトをインスタンス化するときに 2 番目の引数として渡される識別子です。この識別子は、すべての識別子と同様に、作成先の範囲内でのみ一意である必要があり、コンストラクトオブジェクトをインスタンス化するときの最初の引数です。

**注記**  
スタックの `id` は、[AWS CDK CLI リファレンス](cli.md)で参照するために使用する識別子でもあります。

アプリで `MyBucket` 識別子を持つ 2 つのコンストラクトがある例を見てみましょう。1 つ目は、`Stack1` 識別子を持つスタックのスコープで定義されます。2 番目は、`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` クラスに根付いている階層を形成します。特定のコンストラクト、その親コンストラクト、その祖父母などの ID のコレクションを、*パス*としてコンストラクトツリーのルートに参照します。

通常、AWS CDK はテンプレート内のパスを文字列として表示します。レベルからの ID は、通常はスタックであるルート `App` インスタンスのすぐ下のノードから始まるスラッシュで区切られます。例えば、前のコード例にある 2 つの Amazon S3 バケットリソースのパスは `Stack1/MyBucket` および `Stack2/MyBucket` です。

次の例で示すように、プログラムですべてのコンストラクトのパスにアクセスできます。これは `myConstruct` (Python デベロッパーは `my_construct` と記述します) のパスを取得します。ID は作成される範囲内で一意である必要があるため、パスは常に 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 は、テンプレート内のすべての論理 ID が一意であることを要件とします。このため、AWS CDK はアプリケーションの各コンストラクトに対して一意の識別子を生成できる必要があります。リソースには、グローバルに一意のパス (スタックから特定のリソースへの範囲で、すべてのスコープの名前) があります。したがって、AWS CDK はパスの要素を連結して 8 桁のハッシュを追加することにより、必要な一意の識別子を生成します。(ハッシュは、同じ AWS CloudFormation 識別子になる `A/B/C` や `A/BC` などの異なるパスを区別するために必要です。AWS CloudFormation 識別子は英数字を含んでおり、スラッシュやその他の区切り文字を含めることはできません) AWS CDK はこの文字列をコンストラクトの*一意の ID* と呼びます。

一般的に、AWS CDK アプリは一意の ID について知る必要はありません。ただし、次の例で示すように、任意のコンストラクトの一意の 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 個の 16 進数文字) は、「従来」の一意の ID が長すぎる状況で役立ちます。一部のコンストラクトは、一意の ID ではなく、合成された AWS CloudFormation テンプレートのアドレスを使用する場合があります。繰り返しになりますが、アプリは一般的にコンストラクトのアドレスを知る必要はありませんが、次のようにコンストラクトのアドレスを取得できます。

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

## 論理 ID
<a name="identifiers-logical-ids"></a>

一意の ID は、AWS リソースを表すコンストラクトの生成された AWS CloudFormation テンプレート内のリソースの*論理識別子* (または*論理名*) として機能します。

例えば、`Stack2` 内で作成された前の例の Amazon S3 バケットは、` AWS::S3::Bucket` リソースになります。リソースの論理 ID は、結果の AWS CloudFormation テンプレートの `Stack2MyBucket4DD88B4F` です。(この識別子の生成方法の詳細については、「[一意の ID](#identifiers-unique-ids)」を参照してください)

### 論理 ID の安定性
<a name="identifiers-logical-id-stability"></a>

リソースの作成後に論理 ID を変更しないでください。AWSCloudFormation は、リソースを論理 ID で識別します。したがって、リソースの論理 ID を変更した場合、AWS CloudFormation は新しい論理 ID を持つ新しいリソースを作成し、その後に既存のリソースを削除します。リソースのタイプによっては、サービスの中断、データ損失、その両方が発生する場合があります。