

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

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

# Java での AWS CDK の使用
<a name="work-with-cdk-java"></a>

Java は AWS CDK で完全にサポートされているクライアント言語であり、安定していると見なされます。JDK (Oracle または Amazon Corretto などの OpenJDK ディストリビューション) や Apache Maven などの使い慣れたツールを使用して、Java で AWS CDK アプリケーションを開発できます。

 AWS CDK は Java 8 以降をサポートしています。ただし、新しいバージョンの言語には AWS CDK アプリケーションの開発に特に便利な改善点が含まれているため、使用できる最新バージョンを使用することをお勧めします。例えば、Java 9 は `Map.of()` メソッド (TypeScript でオブジェクトリテラルとして記述されるハッシュマップを宣言する便利な方法) を導入します。Java 10 は、`var` キーワードを使用してローカル型推論を導入します。

**注記**  
このデベロッパーガイドに記載されているほとんどのコード例は、Java 8 で対応します。いくつかの例では `Map.of()` を使用しています。これらの例には、Java 9 が必要であることを示すコメントが含まれます。

任意のテキストエディタ、または Maven プロジェクトを読み取ることができる Java IDE を使用して、 AWS CDK アプリを操作できます。このガイドでは [Eclipse](https://www.eclipse.org/downloads/) ヒントを提供していますが、IntelliJ IDEA、NetBeans、およびその他の IDEs は Maven プロジェクトをインポートでき、Java での AWS CDK アプリケーションの開発に使用できます。

Java 以外の JVM がホストする言語 (Kotlin、Groovy、Clojure、Scala など) で AWS CDK アプリケーションを記述することは可能ですが、エクスペリエンスが特に特異ではない可能性があり、これらの言語をサポートすることはできません。

## Java の使用を開始する
<a name="java-prerequisites"></a>

 AWS CDK を使用するには、 AWS アカウントと認証情報があり、Node.js と AWS CDK Toolkit がインストールされている必要があります。[AWS 「CDK の開始方法」を参照してください](getting-started.md)。

Java AWS CDK アプリケーションには Java 8 (v1.8) 以降が必要です。[Amazon Corretto](https://aws.amazon.com/corretto/) をお勧めしますが、任意の OpenJDK ディストリビューションまたは [Oracle の JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) を使用できます。[Apache Maven](https://maven.apache.org/download.cgi) 3.5 以降も必要です。Gradle などのツールを使用することもできますが、 AWS CDK Toolkit によって生成されるアプリケーションスケルトンは Maven プロジェクトです。

**注記**  
サードパーティー言語の廃止: 言語バージョンは、ベンダーまたはコミュニティによって共有される EOL (製品終了) までのみサポートされ、事前の通知によって変更されます。

## プロジェクトの作成
<a name="java-newproject"></a>

空のディレクトリ`cdk init`で を呼び出して、新しい AWS CDK プロジェクトを作成します。`--language` オプションを使用して `java` を指定します。

```
$ mkdir my-project
$ cd my-project
$ cdk init app --language java
```

 `cdk init` はプロジェクトフォルダの名前を使用し、クラス、サブフォルダ、ファイルなどのプロジェクトのさまざまな要素に名前を付けます。フォルダ名に含まれるハイフンはアンダースコアに変換されます。ただし、それ以外の場合、名前は Java 識別子の形式に従う必要があります。例えば、数字で始まったり、スペースを含めたりすることはできません。

結果のプロジェクトには、`software.amazon.awscdk` Maven パッケージへのリファレンスが含まれています。プロジェクトおよびその依存関係は、Maven によって自動的にインストールされます。

IDE を使用している場合は、これでプロジェクトを開くかインポートできるようになります。たとえば Eclipse では、**[ファイル]**、**[インポート]**、**[Maven]**、**[既存の Maven プロジェクト]** を選択します。プロジェクト設定が Java 8 (1.8) を使用するように設定されていることを確認してください。

## AWS コンストラクトライブラリモジュールの管理
<a name="java-managemodules"></a>

Maven を使用して、グループ にある AWS コンストラクトライブラリパッケージをインストールします`software.amazon.awscdk`。ほとんどのコンストラクトは `aws-cdk-lib` アーティファクトにあり、デフォルトで新しい Java プロジェクトに追加されます。上位レベルの CDK サポートがまだ開発中のサービスのモジュールは、サービス名の短いバージョン ( AWS または Amazon プレフィックスなし) で命名された個別の「実験」パッケージにあります。[Maven Central Repository を検索](https://search.maven.org/search?q=software.amazon.awscdk)して、すべての AWS CDK ライブラリと AWS コンストラクトモジュールライブラリの名前を検索します。

**注記**  
[CDK API リファレンスの Java エディション](https://docs.aws.amazon.com/cdk/api/v2/java/index.html)にも、パッケージ名が表示されます。

一部のサービス AWS 「コンストラクトライブラリのサポート」は複数の名前空間にあります。例えば、Amazon Route 53 には `software.amazon.awscdk.route53`、`route53-patterns`、`route53resolver`、`route53-targets` に分割された機能があります。

メイン AWS CDK パッケージは として Java コードにインポートされます`software.amazon.awscdk`。 AWS コンストラクトライブラリのさまざまなサービスのモジュールは`software.amazon.awscdk.services`、Maven パッケージ名と同様に の下にあり、名前が付けられます。例えば、Amazon S3 モジュールの名前空間は `software.amazon.awscdk.services.s3` です。

各 Java ソースファイルで使用する AWS コンストラクトライブラリクラスごとに個別の Java `import`ステートメントを記述し、ワイルドカードインポートを避けることをお勧めします。`import` ステートメントなしで、型の完全な修飾名 (名前空間を含む) をいつでも使用できます。

アプリケーションが実験パッケージに依存している場合、プロジェクトの `pom.xml` を編集して `<dependencies>` コンテナに新しい `<dependency>` 要素を追加します。例えば、次の `<dependency>` 要素は CodeStar 実験コンストラクトライブラリモジュールを指定します。

```
<dependency>
    <groupId>software.amazon.awscdk</groupId>
    <artifactId>codestar-alpha</artifactId>
    <version>2.0.0-alpha.10</version>
</dependency>
```

**ヒント**  
Java IDE を使用する場合、Maven の依存関係を管理する機能がある可能性が高くなります。ただし、IDE の機能が手動で行うものと一致することを確実に確認されていない限り、`pom.xml` を直接編集することをお勧めします。

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

Java では依存関係は `pom.xml` で指定され、Maven を使用してインストールされます。`<dependencies>` コンテナには、パッケージごとに `<dependency>` 要素が含まれます。次の内容は、一般的な CDK Java アプリの `pom.xml` のセクションです。

```
<dependencies>
    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>aws-cdk-lib</artifactId>
        <version>2.14.0</version>
    </dependency>
    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>appsync-alpha</artifactId>
        <version>2.10.0-alpha.0</version>
    </dependency>
</dependencies>
```

**ヒント**  
多くの Java IDEs には統合された Maven サポートおよびビジュアル `pom.xml` エディタを備えており、依存関係の管理に便利です。

Maven は依存関係ロックをサポートしていません。`pom.xml` でバージョン範囲を指定することは可能ですが、ビルドを再現できるように必ずに正確なバージョンを使用することをお勧めします。

Maven は一時的な依存関係を自動的にインストールしますが、各パッケージにはインストールしたものを 1 つしか使用できません。POM ツリーで最も高く指定されたバージョンが選択されます。アプリケーションは常に、インストールされるパッケージのバージョンで最後の単語が含まれます。

プロジェクトを構築 (`mvn compile`) またはパッケージ化 (`mvn package`) するたびに、Maven は依存関係を自動的にインストールまたは更新します。CDK Toolkit は、実行するたびに自動的にこれを行うため、通常は Maven を手動で呼び出す必要はありません。

## AWS Java の CDK イディオム
<a name="java-cdk-idioms"></a>

### Props
<a name="java-props"></a>

すべての AWS コンストラクトライブラリクラスは、3 つの引数を使用してインスタンス化されます。つまり、コンストラクトが定義されている*スコープ* (コンストラクトツリー内の親）、*ID*、*props*、コンストラクトが作成するリソースの設定に使用するキーと値のペアのバンドルです。他のクラスやメソッドでは、引数に「属性のバンドル」パターンも使用されます。

Java では、props は[ビルダーパターン](https://en.wikipedia.org/wiki/Builder_pattern)を使用して表現されます。各コンストラクトタイプには対応する props 型があります。例えば、`Bucket` コンストラクト (Amazon S3 バケットを表す) は、`BucketProps` のインスタンスを props として取ります。

`BucketProps` クラス (すべての AWS コンストラクトライブラリ props クラスなど) には、 という内部クラスがあります`Builder`。`BucketProps.Builder` タイプには、`BucketProps` インスタンスのさまざまなプロパティを設定する方法が用意されています。各メソッドは `Builder` インスタンスを返すため、メソッドの呼び出しを連鎖させて複数のプロパティを設定できます。チェーンの最後に `build()` を呼び出し、`BucketProps` オブジェクトを実際に生成します。

```
Bucket bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps.Builder()
                           .versioned(true)
                           .encryption(BucketEncryption.KMS_MANAGED)
                           .build());
```

コンストラクト、ならびに props のようなオブジェクトを最終引数とする他のクラスは、ショートカットを提供します。クラスには独自の `Builder` があり、1 つのステップでクラスとその props オブジェクトをインスタンス化します。これにより、`BucketProps` と `Bucket` の両方を明示的にインスタンス化 (例えば) する必要はなく、props 型にインポートする必要はありません。

```
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket")
                           .versioned(true)
                           .encryption(BucketEncryption.KMS_MANAGED)
                           .build();
```

既存のコンストラクトから独自のコンストラクトを取得するとき、追加のプロパティを受け入れることができます。これらのビルダーパターンに従うことをお勧めします。ただし、コンストラクトクラスのサブクラス化ほど簡単ではありません。2 つの新しい `Builder` クラスの可動部をご自身で指定する必要があります。コンストラクトに 1 つ以上の追加引数を単に受け入れることができます。引数がオプションの場合、追加のコンストラクターを指定する必要があります。

### 汎用構造
<a name="java-generic-structures"></a>

一部の APIs では、 AWS CDK はメソッドへの入力として JavaScript 配列または型なしオブジェクトを使用します。( AWS CodeBuild の [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue)メソッドなどを参照してください）。Java では、これらのオブジェクトは `java.util.Map<String, Object>` として表されます。値がすべて文字列の場合、`Map<String, String>` を使用できます。

他の言語とは違い、Java はこのようなコンテナのリテラルを記述する方法を提供しません。Java 9 以降では、[https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-](https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-) を使用してこれらの呼び出しのいずれかにより、インラインで最大 10 エントリのマップを簡単に定義できます。

```
java.util.Map.of(
    "base-directory", "dist",
    "files", "LambdaStack.template.json"
 )
```

10 を超えるエントリを持つマップを作成するには、[https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-](https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-) を使用します。

Java 8 を使用している場合、次のような内容と同様に独自の方法を指定できます。

JavaScript 配列は Java で `List<Object>` または `List<String>` として表されます。`java.util.Arrays.asList` の方法は、短い `List` を定義するのに便利です。

```
List<String> cmds = Arrays.asList("cd lambda", "npm install", "npm install typescript")
```

### 欠落した値
<a name="java-missing-values"></a>

Java では、props などの AWS CDK オブジェクトの欠損値は で表されます`null`。値を使用する前に、値が含まれていることを確認するため、`null` の可能性がある値をすべて明示的にテストする必要があります。他の言語とは違い、Java には NULL 値の処理を支援する「シンタックスシュガー」はありません。Apache ObjectUtil の [https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#defaultIfNull-T-T-](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#defaultIfNull-T-T-) および [https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#firstNonNull-T…​-](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#firstNonNull-T…​-) は、状況によっては便利です。または、独自の静的ヘルパーメソッドを記述し、潜在的な NULL 値を簡単に処理してコードを読み取りやすくします。

## CDK アプリケーションの構築と実行
<a name="java-running"></a>

 AWS CDK は、アプリを実行する前に自動的にコンパイルします。ただし、アプリを手動で構築し、エラーをチェックしてテストを実行すると便利です。IDE (例えば、Eclipse で Control-B を押す) でこの操作をするか、プロジェクトのルートディレクトリにいながらコマンドプロンプトで `mvn compile` を発行することができます。

コマンドプロンプトで `mvn test` を実行し、記述したテストを実行します。