Java で AWS CDK を使用する - AWS クラウド開発キット (AWS CDK) v2

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

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

Java で AWS CDK を使用する

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 のヒントを提供しますが、IntelliJ IDEA、NetBeans、その他の IDEs は Maven プロジェクトをインポートでき、Java で AWS CDK アプリケーションの開発に使用できます。

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

Java の使用を開始する

AWS CDK を使用するには、AWS アカウントおよび認証情報を持ち、Node.js および AWS CDK Toolkit がインストールされている必要があります。「AWS CDK の使用を開始する」を参照してください。

Java AWS CDK アプリケーションには Java 8 (v1.8) 以降が必要です。Amazon Corretto をお勧めしますが、任意の OpenJDK ディストリビューションまたは Oracle の JDK を使用できます。Apache Maven 3.5 以降も必要です。Gradle などのツールを使用することもできますが、AWS CDK Toolkit によって生成されるアプリケーションスケルトンは Maven プロジェクトです。

注記

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

プロジェクトの作成

空のディレクトリで 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 コンストラクトライブラリモジュールの管理

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

注記

CDK API リファレンスの Java エディションにも、パッケージ名が表示されます。

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

メインの AWS CDK パッケージは software.amazon.awscdk として Java コードでインポートされます。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 の依存関係の管理

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 を手動で呼び出す必要はありません。

Java の AWS CDK イディオム

Props

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

Java では、props はビルダーパターンを使用して表現されます。各コンストラクトタイプには対応する 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 オブジェクトをインスタンス化します。これにより、BucketPropsBucket の両方を明示的にインスタンス化 (例えば) する必要はなく、props 型にインポートする必要はありません。

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

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

汎用構造

一部の API では、AWS CDK は メソッドへの入力として JavaScript 配列または未入力のオブジェクトを使用します。(例えば、「AWS CodeBuild の BuildSpec.fromObject() メソッド」を参照してください)。Java では、これらのオブジェクトは java.util.Map<String, Object> として表されます。値がすべて文字列の場合、Map<String, String> を使用できます。

他の言語とは違い、Java はこのようなコンテナのリテラルを記述する方法を提供しません。Java 9 以降では、java.util.Map.of() を使用してこれらの呼び出しのいずれかにより、インラインで最大 10 エントリのマップを簡単に定義できます。

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

10 を超えるエントリを持つマップを作成するには、java.util.Map.ofEntries() を使用します。

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")

欠落した値

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

CDK アプリケーションの構築と実行

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

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