在 Java AWS CDK 中使用 - AWS Cloud Development Kit (AWS CDK) v2

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Java AWS CDK 中使用

Java 是 完全支援的用戶端語言, AWS CDK 且被視為穩定。您可以使用熟悉的工具在 Java 中開發 AWS CDK 應用程式,包括 JDK(Oracle 或 OpenJDK 分佈,例如 Amazon Corretto) 和 Apache Maven。

AWS CDK 支援 Java 8 和更新版本。不過,我們建議您使用最新版本,因為較新版本的語言包含對開發 AWS CDK 應用程式特別方便的改進。例如,Java 9 引入 Map.of()方法 (一種在 中宣告作為物件常值寫入之雜湊圖的便利方法 TypeScript)。Java 10 使用 var 關鍵字引入本機類型推論。

注意

本開發人員指南中的大多數程式碼範例都適用於 Java 8。幾個範例使用 Map.of();這些範例包含註解,指出他們需要 Java 9。

您可以使用任何文字編輯器或可讀取 Maven 專案IDE的 Java 來處理 AWS CDK 應用程式。我們在本指南中提供 Eclipse 提示,但 IntelliJ IDEA NetBeans、 和其他 IDEs 可以匯入 Maven 專案,並可用於在 Java 中開發 AWS CDK 應用程式。

可以使用 Java 以外的JVM託管語言撰寫 AWS CDK 應用程式 (例如 Kotlin、Groovy、Clojure 或 Scala),但體驗可能不特別特殊,而且我們無法為這些語言提供任何支援。

開始使用 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 安裝組 中的 AWS 建構程式庫套件software.amazon.awscdk。大多數建構位於成品 中aws-cdk-lib,預設會新增至新的 Java 專案。仍在開發更高層級CDK支援之服務的模組,採用個別的「實驗」套件,以服務名稱的短版本 (無 AWS 或 Amazon 字首) 命名。搜尋 Maven 中央儲存庫,尋找所有 AWS CDK 和 AWS 建構模組程式庫的名稱。

注意

CDK API 參考的 Java 版本也會顯示套件名稱。

有些服務「 AWS 建構程式庫支援位於多個命名空間中。例如,Amazon Route 53 的功能分為 software.amazon.awscdk.route53route53-patternsroute53resolverroute53-targets

主 AWS CDK 套件會以 匯入 Java 程式碼software.amazon.awscdk。 AWS Construct Library 中各種服務的模組位於 下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> 元素。以下是pom.xml典型 CDK Java 應用程式的 區段。

<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 會自動安裝暫時性相依性,但每個套件只能有一個已安裝的副本。樹POM狀目錄中指定的最高版本已選取;應用程式一律在安裝的套件版本中具有最後一個字。

當您建置專案 (mvn compile) 或封裝 (mvn package) 時,Maven 會自動安裝或更新相依性。CDK 工具組會在每次執行工具時自動執行此操作,因此通常不需要手動叫用 Maven。

AWS CDK Java 中的慣用語

道具

所有 AWS 建構程式庫類別都會使用三個引數進行實例化:定義建構體的範圍 (其在建構樹中的父系)、id props ,即建構體用來設定其建立之資源的鍵/值對套件。其他類別和方法也會使用「屬性組合」模式作為引數。

在 Java 中,props 使用 Builder 模式 表示。每個建構類型都有對應的道具類型;例如,建構 Bucket (代表 Amazon S3 儲存貯體) 會將其視為其道具 執行個體BucketProps

BucketProps 類別 (如同每個 AWS 建構程式庫道具類別) 具有稱為 的內部類別BuilderBucketProps.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自己的 ,可在一個步驟中使它及其道具物件具現化。如此一來,您便不需要明確地實例化 (例如) BucketPropsBucket,而且不需要匯入 props 類型。

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

從現有的建構中取得自己的建構時,您可能想要接受其他屬性。我們建議您遵循這些建置器模式。不過,這不如將建構類別子分類那麼簡單。您必須自行提供兩個新Builder類別的移動部分。您可能只希望您的建構接受一或多個其他引數。引數為選用時,您應該提供額外的建構器。

一般結構

在某些 中APIs, AWS CDK 會使用 JavaScript 陣列或未輸入的物件作為方法的輸入。(例如,請參閱 AWS CodeBuildBuildSpec.fromObject()的方法。) 在 Java 中,這些物件會以 表示java.util.Map<String, Object>。如果這些值都是字串,您可以使用 Map<String, String>

Java 不提供撰寫此類容器常值的方法,就像其他一些語言一樣。在 Java 9 和更新版本中,您可以使用 java.util.Map.of() 來輕鬆地定義最多十個項目的映射,這些呼叫中的一個。

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

若要建立超過十個項目的地圖,請使用 java.util.Map.ofEntries()

如果您使用的是 Java 8,您可以提供自己的類似方法。

JavaScript 陣列在 Java List<String>中以 List<Object>或 表示。此方法可java.util.Arrays.asList方便地定義短List的 。

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

缺少值

在 Java 中,props 等 AWS CDK 物件中的遺失值由 表示null。您必須明確測試任何值,null以確保它包含值,然後再對它執行任何操作。Java 沒有「語法糖」來協助處理 Null 值,就像某些其他語言一樣。在某些情況下,您可能會發現 Apache ObjectUtil的 defaultIfNull和 很有firstNonNull用。或者,編寫您自己的靜態協助程式方法,以更輕鬆地處理潛在的 null 值,並讓程式碼更易讀取。

建置和執行CDK應用程式

在執行應用程式之前, AWS CDK 會自動編譯應用程式。不過,手動建置應用程式以檢查錯誤和執行測試可能很有用。您可以在 IDE(例如,在 Eclipse 中按下 Control-B) 或在專案根目錄中mvn compile透過命令提示進行發出。

執行您在命令提示mvn test中執行的任何測試。