

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

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

# AWS CDK ライブラリの使用
<a name="work-with"></a>

AWS Cloud Development Kit (AWS CDK) ライブラリをインポートして使用し、[サポートされているプログラミング言語](languages.md)を使用して AWS クラウドインフラストラクチャを定義します。

## AWS CDK ライブラリのインポート
<a name="work-with-library"></a>

[AWS CDK ライブラリ](libraries.md)は、多くの場合は `aws-cdk-lib` という TypeScript パッケージ名で参照されます。実際のパッケージ名は言語によって異なります。次の内容は、CDK ライブラリをインストールしてインポートする方法の例です。

**Example**  


|  |  | 
| --- |--- |
|  ** をインストールします**。 |  `npm install aws-cdk-lib`  | 
|  **インポート** –  |  `import * as cdk from 'aws-cdk-lib';`  | 


|  |  | 
| --- |--- |
|  ** をインストールします**。 |  `npm install aws-cdk-lib`  | 
|  **インポート** –  |  `const cdk = require('aws-cdk-lib');`  | 


|  |  | 
| --- |--- |
|  ** をインストールします**。 |  `python -m pip install aws-cdk-lib`  | 
|  **インポート** –  |  `import aws_cdk as cdk`  | 


|  |  | 
| --- |--- |
|  **`pom.xml` で、追加**  |  `Group software.amazon.awscdk; artifact aws-cdk-lib`  | 
|  **インポート** –  |  `import software.amazon.awscdk.App;`  | 


|  |  | 
| --- |--- |
|  ** をインストールします**。 |  `dotnet add package Amazon.CDK.Lib`  | 
|  **インポート** –  |  `using Amazon.CDK;`  | 


|  |  | 
| --- |--- |
|  ** をインストールします**。 |  `go get github.com/aws/aws-cdk-go/awscdk/v2`  | 
|  **インポート** –  |  <pre>import (<br />  "github.com/aws/aws-cdk-go/awscdk/v2"<br />)</pre>  | 

`construct` ベースクラスおよびサポートコードは `constructs` ライブラリにあります。API がまだ改良中である実験コンストラクトは、個別のモジュールとして分散されます。

## AWS CDK API リファレンスの使用
<a name="work-with-library-reference"></a>

AWS CDK で開発するときは、[AWS CDK API リファレンス](libraries.md#libraries-reference)を使用します。

各モジュールのリファレンスマテリアルは、次のセクションに分かれています。
+  *概要*: 概念および例を含め、AWS CDK のサービスを使用するために知る必要がある入門資料。
+  *コンストラクト*: 1 つ以上の具体的な AWS リソースを表すライブラリクラス。これらは「キュレートされた」(L2) リソースまたはパターン (L3 リソース) であり、正しいデフォルトを持つ高レベルのインターフェイスを提供します。
+  *クラス*: モジュールのコンストラクトによって使用される機能を提供する非コンストラクトクラス。
+  *構造*: プロパティ (コンストラクトの `props` 引数) やオプションなどの複合値の構造を定義するデータ構造 (属性バンドル)。
+  *インターフェイス*: 名前が「I」で始まるすべてのインターフェイスは、対応するコンストラクトまたは他のクラスの絶対最小機能を定義します。CDK はコンストラクトインターフェイスを使用して、AWS CDK アプリ外で定義されて `Bucket.fromBucketArn()` などのメソッドで参照された AWS リソースを表します。
+  *列挙型*: 特定のコンストラクトパラメータの指定に使用する名前付き値のコレクション。列挙値を使用すると、CDK が合成中にこれらの値の有効性を確認できるようにします。
+  *CloudFormation リソース*: 名前が「Cfn」で始まるこれらの L1 コンストラクトは、CloudFormation 仕様で定義されているリソースを正確に表しています。CDK リリースごとにその仕様から自動的に生成されます。各 L2 または L3 コンストラクトは、1 つ以上の CloudFormation リソースをカプセル化します。
+  *CloudFormation のプロパティタイプ*: 各 CloudFormation リソースのプロパティを定義する名前付き値のコレクション。

## コンストラクトクラスと比較したインターフェイス
<a name="work-with-library-interfaces"></a>

インターフェイスをプログラミングの概念として理解している場合でも、AWS CDK は明確ではない特定の方法でインターフェイスを使用します。

AWS CDK は、`Bucket.fromBucketArn()` などのメソッドを使用して CDK アプリケーション外で定義されたリソースの使用をサポートします。外部リソースは変更できず、`Bucket` クラスなどを使用して CDK アプリで定義されたリソースで利用可能な機能がすべて揃っていない場合があります。次に、インターフェイスは特定の AWS リソースタイプ (*外部リソースを含む*) の CDK で利用可能な最小限の機能を表します。

CDK アプリでリソースをインスタンス化するとき、`Bucket` などの具体的なクラスを常に使用する必要があります。独自のコンストラクトのいずれかで受け入れる引数のタイプを指定するとき、外部リソースを処理する準備ができている場合、`IBucket` などのインターフェイスタイプを使用します (つまり、変更が不要)。CDK で定義されたコンストラクトが必要な場合、使用できる最も一般的なタイプを指定します。

一部のインターフェイスは、コンストラクトではなく、特定のクラスに関連付けられたプロパティまたはオプションバンドルの最小バージョンです。このようなインターフェイスは、親クラスに渡す引数を受け入れるようにサブクラス化するときに便利です。1 つ以上の追加プロパティが必要な場合、このインターフェイスまたはより具体的なタイプから実装または取得する必要があります。

**注記**  
AWS CDK でサポートされている一部のプログラミング言語には、インターフェイス機能がありません。これらの言語では、インターフェイスは通常のクラスにすぎません。頭文字の「I」の後に他のコンストラクトの名前 (例えば、`IBucket`) が続くパターンに従う名前で特定できます。同じルールが適用されます。

## 依存関係の管理
<a name="work-with-cdk-dependencies"></a>

AWS CDK アプリまたはライブラリの依存関係は、パッケージ管理ツールを使用して管理されます。これらのツールはプログラミング言語で一般的に使用されます。

通常、AWS CDK は言語の基準をサポートするか、公式パッケージ管理ツールがある場合はそれをサポートします。それ以外の場合、AWS CDK は言語の最も人気または広くサポートされているものをサポートします。特にサポートされているツールに対応している場合、他のツールも使用できる場合があります。ただし、他のツールの公式サポートは限られています。

AWS CDK は、次のパッケージマネージャーをサポートしています。


| 言語 | サポートされているパッケージ管理ツール | 
| --- | --- | 
| TypeScript/JavaScript | NPM (ノードパッケージマネージャー) または Yarn | 
| Python (パイソン) | PIP (Python のパッケージインストーラ) | 
| Java | Maven (メイヴン) | 
| C\# | NuGet | 
| Go | Go モジュール | 

AWS CDK CLI の `cdk init` コマンドを使用して新しいプロジェクトを作成するとき、CDK コアライブラリおよび安定したコンストラクトの依存関係が自動的に指定されます。

サポートされているプログラミング言語の依存関係の管理における詳細については、次の内容を参照してください。
+  [TypeScript の依存関係の管理](work-with-cdk-typescript.md#work-with-cdk-typescript-dependencies)。
+  [JavaScript の依存関係の管理](work-with-cdk-javascript.md#work-with-cdk-javascript-dependencies)。
+  [Python の依存関係の管理](work-with-cdk-python.md#work-with-cdk-python-dependencies)。
+  [Java の依存関係の管理](work-with-cdk-java.md#work-with-cdk-java-dependencies)。
+  [C\# の依存関係の管理](work-with-cdk-csharp.md#work-with-cdk-csharp-dependencies)。
+  [Go の依存関係の管理](work-with-cdk-go.md#work-with-cdk-go-dependencies)。

## TypeScript での AWS CDK と他の言語の比較
<a name="work-with-cdk-compare"></a>

TypeScript は、AWS CDK アプリケーションの開発でサポートされている最初の言語でした。したがって、大量の CDK コード例は TypeScript に記述されています。別の言語で開発している場合、TypeScript で AWS CDK コードが実装されている方法を、選択した言語と比較すると便利です。ドキュメント全体の例を使用できるようになります。

## モジュールのインポート
<a name="work-with-cdk-compare-import"></a>

**Example**  
TypeScript は名前空間全体のインポート、あるいは名前空間から個々のオブジェクトのインポートのいずれかをサポートしています。各名前空間には、特定の AWS サービスで使用するコンストラクトやその他のクラスが含まれます。  

```
// Import main CDK library as cdk
import * as cdk from 'aws-cdk-lib';   // ES6 import preferred in TS
const cdk = require('aws-cdk-lib');   // Node.js require() preferred in JS

// Import specific core CDK classes
import { Stack, App } from 'aws-cdk-lib';
const { Stack, App } = require('aws-cdk-lib');

// Import AWS S3 namespace as s3 into current namespace
import { aws_s3 as s3 } from 'aws-cdk-lib';   // TypeScript
const s3 = require('aws-cdk-lib/aws-s3');     // JavaScript

// Having imported cdk already as above, this is also valid
const s3 = cdk.aws_s3;

// Now use s3 to access the S3 types
const bucket = s3.Bucket(...);

// Selective import of s3.Bucket
import { Bucket } from 'aws-cdk-lib/aws-s3';        // TypeScript
const { Bucket } = require('aws-cdk-lib/aws-s3');   // JavaScript

// Now use Bucket to instantiate an S3 bucket
const bucket = Bucket(...);
```
TypeScript と同様に、Python は名前空間モジュールインポートおよび選択的インポートをサポートしています。Python の名前空間は **aws\_cdk** *.xxx* に似ており、*xxx* は Amazon S3 の **s3** などの AWS サービス名を表します。(Amazon S3 はこれらの例で使用されます)。  

```
# Import main CDK library as cdk
import aws_cdk as cdk

# Selective import of specific core classes
from aws_cdk import Stack, App

# Import entire module as s3 into current namespace
import aws_cdk.aws_s3 as s3

# s3 can now be used to access classes it contains
bucket = s3.Bucket(...)

# Selective import of s3.Bucket into current namespace
from aws_cdk.s3 import Bucket

# Bucket can now be used to instantiate a bucket
bucket = Bucket(...)
```
Java のインポートは、TypeScript のものとは動作が異なります。各インポートステートメントは、特定のパッケージから 1 つのクラス名、あるいはそのパッケージで定義されているすべてのクラス (`\*` を使用) のいずれかをインポートします。クラス名がインポートされている場合はクラス名の単体、あるいはパッケージを含む*修飾*クラス名のいずれかを使用し、クラスにアクセスできます。  
ライブラリは AWS コンストラクトライブラリ (メインライブラリは `software.amazon.awscdk` です) に対して `software.amazon.awscdk.services.xxx` のような名前が付けられます。AWS CDK パッケージの Maven グループ ID は `software.amazon.awscdk` です。  

```
// Make certain core classes available
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.App;

// Make all Amazon S3 construct library classes available
import software.amazon.awscdk.services.s3.*;

// Make only Bucket and EventType classes available
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.s3.EventType;

// An imported class may now be accessed using the simple class name (assuming that name
// does not conflict with another class)
Bucket bucket = Bucket.Builder.create(...).build();

// We can always use the qualified name of a class (including its package) even without an
// import directive
software.amazon.awscdk.services.s3.Bucket bucket =
    software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
        .build();

// Java 10 or later can use var keyword to avoid typing the type twice
var bucket =
    software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
        .build();
```
C\# では、`using` ディレクティブを使用してタイプをインポートします。2 つの形式があります。1 つはプレーン名を使用し、指定された名前空間のすべてのタイプにアクセスできます。もう 1 つは、エイリアスを使用して名前空間自体を参照できます。  
パッケージには、AWS コンストラクトライブラリパッケージに `Amazon.CDK.AWS.xxx` のような名前が付けられます。(コアモジュールは `Amazon.CDK`)  

```
// Make CDK base classes available under cdk
using cdk = Amazon.CDK;

// Make all Amazon S3 construct library classes available
using Amazon.CDK.AWS.S3;

// Now we can access any S3 type using its name
var bucket = new Bucket(...);

// Import the S3 namespace under an alias
using s3 = Amazon.CDK.AWS.S3;

// Now we can access an S3 type through the namespace alias
var bucket = new s3.Bucket(...);

// We can always use the qualified name of a type (including its namespace) even without a
// using directive
var bucket = new Amazon.CDK.AWS.S3.Bucket(...);
```
各 AWS コンストラクトライブラリモジュールは Go パッケージとして提供されます。  

```
import (
    "github.com/aws/aws-cdk-go/awscdk/v2"           // CDK core package
    "github.com/aws/aws-cdk-go/awscdk/v2/awss3"     // AWS S3 construct library module
)

// now instantiate a bucket
bucket := awss3.NewBucket(...)

// use aliases for brevity/clarity
import (
    cdk "github.com/aws/aws-cdk-go/awscdk/v2"           // CDK core package
    s3  "github.com/aws/aws-cdk-go/awscdk/v2/awss3"     // AWS S3 construct library module
)

bucket := s3.NewBucket(...)
```

## コンストラクトのインスタンス化
<a name="work-with-cdk-compare-class"></a>

 AWS CDK コンストラクトクラスの名前は、サポートされているすべての言語で同じです。ほとんどの言語は、`new` キーワードを使用してクラスをインスタンス化します (Python と Go はしません)。また、ほとんどの言語ではキーワードは `this` 現在のインスタンスを参照します。(Python は 規則で `self` を使用します) 作成するすべてのコンストラクトに対し、`scope` パラメータとして現在のインスタンスに参照を渡す必要があります。

AWS CDK コンストラクトの 3 番目の引数は `props` であり、コンストラクトの構築に必要な属性を含むオブジェクトです。この引数はオプションですが、必要なときはサポートされている言語が特異な方法で処理します。属性の名前は、言語の標準命名パターンにも適応されています。

**Example**  

```
// Instantiate default Bucket
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket');

// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
  bucketName: 'amzn-s3-demo-bucket',
   versioned: true,
});

// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
  websiteRedirect: {host: 'aws.amazon.com'}});
```
Python は、クラスをインスタンス化するときに `new` キーワードを使用しません。プロパティ引数はキーワード引数を使用して表され、引数は `snake_case` を使用して名前が付けられます。  
props 値自体が属性のバンドルである場合、プロパティの後に名前が付けられたクラスで表され、サブプロパティのキーワード引数を受け入れます。  
Python では、現在のインスタンスは最初の引数としてメソッドに渡されます。この引数は、規則によって `self` という名前が付けられます。  

```
# Instantiate default Bucket
bucket = s3.Bucket(self, "amzn-s3-demo-bucket")

# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true)

# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect(
            host_name="aws.amazon.com"))
```
Java では、props 引数は `XxxxProps` という名前のクラス (例えば、`Bucket` コンストラクトの props に `BucketProps`) で表されます。ビルダーパターンを使用して props 引数を構築します。  
各 `XxxxProps` クラスにはビルダーがあります。次の例で示すように、1 つのステップで props およびコンストラクトを構築する各コンストラクトに便利なビルダーもあります。  
Props は、`camelCase` を使用して TypeScript と同じように名前が付けられます。  

```
// Instantiate default Bucket
Bucket bucket = Bucket(self, "amzn-s3-demo-bucket");

// Instantiate Bucket with bucketName and versioned properties
Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket")
                      .bucketName("amzn-s3-demo-bucket").versioned(true)
                      .build();

# Instantiate Bucket with websiteRedirect, which has its own sub-properties
Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket")
                      .websiteRedirect(new websiteRedirect.Builder()
                          .hostName("aws.amazon.com").build())
                      .build();
```
C\# では、`XxxxProps` という名前のクラスにオブジェクト初期化子を使用して props が指定されます (例えば、`Bucket` コンストラクトの props に `BucketProps`)。  
Props は TypeScript と同様に名前が付けられますが、`PascalCase` が使用されます。  
コンストラクトをインスタンス化するときに `var` キーワードを使用するのが便利なため、クラス名を 2 回入力する必要はありません。ただし、ローカルコードのスタイルガイドは異なる場合があります。  

```
// Instantiate default Bucket
var bucket = Bucket(self, "amzn-s3-demo-bucket");

// Instantiate Bucket with BucketName and Versioned properties
var bucket =  Bucket(self, "amzn-s3-demo-bucket", new BucketProps {
                      BucketName = "amzn-s3-demo-bucket",
                      Versioned  = true});

// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps {
                      WebsiteRedirect = new WebsiteRedirect {
                              HostName = "aws.amazon.com"
                      }});
```
Go でコンストラクトを作成するには、`Xxxxxxx` がコンストラクトの名前である `NewXxxxxx` 関数を呼び出します。コンストラクトのプロパティは構造として定義されます。  
Go では、すべてのコンストラクトパラメータはポインタであり、数値、ブール値、文字列などの値を含みます。`jsii.String` などの便利な関数を使用してこれらのポインタを作成します。  

```
	// Instantiate default Bucket
	bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), nil)

	// Instantiate Bucket with BucketName and Versioned properties
	bucket1 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
		BucketName: jsii.String("amzn-s3-demo-bucket"),
		Versioned:  jsii.Bool(true),
	})

	// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
	bucket2 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
		WebsiteRedirect: &awss3.RedirectTarget{
			HostName: jsii.String("aws.amazon.com"),
		}})
```

## メンバーへのアクセス
<a name="work-with-cdk-compare-members"></a>

コンストラクトおよびその他の AWS CDK クラスの属性やプロパティを参照し、これらの値を (例えば) 入力として使用して他のコンストラクトを構築することは一般的です。メソッドの前述の名前付けによる違いは、ここでも適用されます。さらに、Java ではメンバーに直接アクセスすることはできません。代わりに、ゲッターメソッドが用意されています。

**Example**  
名前は `camelCase` です。  

```
bucket.bucketArn
```
名前は `snake_case` です。  

```
bucket.bucket_arn
```
各プロパティにはゲッターメソッドが用意されています。これらの名前は `camelCase` です。  

```
bucket.getBucketArn()
```
名前は `PascalCase` です。  

```
bucket.BucketArn
```
名前は `PascalCase` です。  

```
bucket.BucketArn
```

## 列挙型定数
<a name="work-with-cdk-compare-enums"></a>

列挙型定数はクラスにスコープされ、すべての言語で下線が付いた大文字の名前があります (`SCREAMING_SNAKE_CASE` と呼ばれることもあります)。クラス名は Go を除くサポートされているすべての言語でも同じケーシングを使用するため、修飾された列挙型名はこれらの言語でも同じです。

```
s3.BucketEncryption.KMS_MANAGED
```

Go では、列挙型定数はモジュール名前空間の属性であり、次のように記述されます。

```
awss3.BucketEncryption_KMS_MANAGED
```

## オブジェクトインターフェイス
<a name="work-with-cdk-compare-object"></a>

AWS CDK は TypeScript オブジェクトインターフェイスを使用し、クラスが予想されるメソッドおよびプロパティのセットを実装していることを示します。オブジェクトインターフェイスの名前の頭文字が `I` であるため、識別できます。具体的なクラスは、`implements` キーワードを使用して実装するインターフェイスを示します。

**Example**  
JavaScript にはインターフェイス機能はありません。`implements` キーワードおよびその後に続くクラス名を無視してください。

```
import { IAspect, IConstruct } from 'aws-cdk-lib';

class MyAspect implements IAspect {
  public visit(node: IConstruct) {
    console.log('Visited', node.node.path);
  }
}
```
Python にはインターフェイス機能はありません。ただし、AWS CDK にはクラスを `@jsii.implements(interface)` で装飾することでインターフェイスの実装を示すことができます。  

```
from aws_cdk import IAspect, IConstruct
import jsii

@jsii.implements(IAspect)
class MyAspect():
  def visit(self, node: IConstruct) -> None:
    print("Visited", node.node.path)
```

```
import software.amazon.awscdk.IAspect;
import software.amazon.awscdk.IConstruct;

public class MyAspect implements IAspect {
    public void visit(IConstruct node) {
        System.out.format("Visited %s", node.getNode().getPath());
    }
}
```

```
using Amazon.CDK;

public class MyAspect : IAspect
{
    public void Visit(IConstruct node)
    {
        System.Console.WriteLine($"Visited ${node.Node.Path}");
    }
}
```
Go 構造は、実装するインターフェイスを明示的に宣言する必要はありません。Go コンパイラは、構造で利用可能なメソッドおよびプロパティに基づいて実装を決定します。例えば、次のコードでは、`MyAspect` は コンストラクトを取る `Visit` メソッドを提示するため、`IAspect` インターフェイスを実装します。  

```
type MyAspect struct {
}

func (a MyAspect) Visit(node constructs.IConstruct) {
	fmt.Println("Visited", *node.Node().Path())
}
```