

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

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

# AWS CDK アプリ
<a name="apps"></a>

AWS Cloud Development Kit (AWS CDK) アプリケーションまたは *app* は、1 つ以上の CDK [スタック](stacks.md)のコレクションです。スタックは、AWS リソースとプロパティを定義する、1 つ以上の[コンストラクト](constructs.md)のコレクションです。したがって、スタックとコンストラクトの集合全体を指して CDK アプリケーションと呼びます。

## CDK アプリの作成方法
<a name="apps-define"></a>

[プロジェクト](projects.md)のアプリケーションファイルでアプリケーションインスタンスを定義して、アプリケーションを作成します。これを行うには、AWS コンストラクトライブラリから [App](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)
```

1 つのアプリケーション内のスタックは、互いのリソースとプロパティを簡単に参照できます。AWS CDK はスタック間の依存関係を推測し、正しい順序でデプロイできるようにします。1 つの `cdk deploy` コマンドで、アプリケーション内にスタックの一部またはすべてをデプロイできます。

## コンストラクトツリー
<a name="apps-tree"></a>

コンストラクトは、`App` クラスをルートとして、すべてのコンストラクトに渡される `scope` 引数を使用して、他のコンストラクトの内部で定義されます。このようにして、AWS CDK アプリは*コンストラクトツリー*と呼ばれるコンストラクトの階層を定義します。

このツリーのルートは、`App` クラスのインスタンスであるアプリです。アプリ内では、1 つ以上のスタックをインスタンス化します。スタック内では、コンストラクトをインスタンス化します。これにより、それ自体がリソースやその他のコンストラクトをインスタンス化できます。

コンストラクトは*常に*別のコンストラクトのスコープ内で明示的に定義され、コンストラクト間の関係が作成されます。ほとんどの場合、スコープとして `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()` を使用して、2 つのノード間に明示的な依存関係を追加することもできます。詳細については、「*AWS CDK API リファレンス*」の「[依存関係](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#dependencies)」を参照してください。

AWS CDK は、コンストラクトツリー内のすべてのノードを訪問し、それぞれに対して操作を実行する簡単な方法を提供します。詳細については、の「[アスペクトと AWS CDK](aspects.md)」を参照してください。