這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 TypeScript 中使用 AWS CDK
TypeScript 是 AWS 雲端開發套件 (AWS CDK) 完全支援的用戶端語言,且被視為穩定。在 TypeScript 中使用 AWS CDK 會使用熟悉的工具,包括 Microsoft 的 TypeScript 編譯器 (
tsc
)、
Node.js
npm
)。如果您願意,也可以使用
Yarn
您可以使用任何編輯器或 IDE。許多 AWS CDK 開發人員使用
Visual Studio Code
TypeScript 入門
若要使用 AWS CDK,您必須擁有 AWS 帳戶和登入資料,並已安裝 Node.js 和 AWS CDK Toolkit。請參閱 AWS CDK 入門 。
您也需要 TypeScript 本身 (3.8 版或更新版本)。如果您還沒有它,您可以使用 安裝它
npm
。
$ npm install -g typescript
注意
如果您收到許可錯誤,且您的系統具有管理員存取權,請嘗試
sudo npm install -g typescript
。
讓 TypeScript 與一般 保持最新狀態
npm update -g typescript
。
注意
第三方語言棄用:只有在廠商或社群共用其 EOL (生命週期結束) 之前,才支援語言版本,且可能會有所變更,恕不另行通知。
您可以透過
cdk init
在空目錄中叫用 來建立新的 AWS CDK 專案。使用
--language
選項並指定
typescript
:
$ mkdir my-project $ cd my-project $ cdk init app --language typescript
建立專案也會安裝
aws-cdk-lib
模組及其相依性。
cdk init
使用專案資料夾的名稱來命名專案的各種元素,包括類別、子資料夾和檔案。資料夾名稱中的連字號會轉換為底線。不過,名稱應該遵循 TypeScript 識別符的形式;例如,它不應以數字開頭或包含空格。
使用本機
tsc
和
cdk
在大部分情況下,本指南假設您全域安裝 TypeScript 和 CDK Toolkit (
npm install -g typescript aws-cdk
),而提供的命令範例 (例如
cdk synth
) 遵循此假設。這種方法可讓您輕鬆讓這兩個元件保持最新狀態,而且由於兩者都採取嚴格的回溯相容性方法,因此在一律使用最新版本時,風險通常很少。
有些團隊偏好指定每個專案中的所有相依性,包括 TypeScript 編譯器和 CDK Toolkit 等工具。此實務可讓您將這些元件固定到特定版本,並確保團隊中的所有開發人員 (以及 CI/CD 環境) 完全使用這些版本。這消除了可能的變更來源,有助於使建置和部署更一致且可重複。
CDK 包含 TypeScript 專案範本 中 TypeScript 和 CDK Toolkit 的相依性
package.json
,因此如果您想要使用此方法,則不需要對專案進行任何變更。您只需使用稍微不同的命令來建置應用程式和發出
cdk
命令即可。
npx aws-cdk
會執行目前專案中本機安裝的 CDK Toolkit 版本,如果有的話,請返回全域安裝。如果沒有全域安裝, 會
npx
下載 CDK Toolkit 的臨時複本並執行該複本。您可以使用
@
語法指定 CDK Toolkit 的任意版本:
npx aws-cdk@2.0 --version
列印
2.0.0
。
提示
設定別名,以便您可以搭配本機 CDK Toolkit 安裝使用
cdk
命令。
- macOS/Linux
-
$ alias cdk="npx aws-cdk" - Windows
-
doskey cdk=npx aws-cdk $*管理 AWS 建構程式庫模組
使用 Node Package Manager (
npm) 來安裝和更新 AWS Construct Library 模組,以供您的應用程式以及您需要的其他套件使用。(您可以yarn改為使用 。npm)npm也會自動安裝這些模組的相依性。大多數 AWS CDK 建構模組位於名為 的主 CDK 套件中
aws-cdk-lib,這是 所建立新專案的預設相依性cdk init。"Experimental" AWS Construct Library 模組,其中更高層級的建構仍在開發中,命名為@aws-cdk/<SERVICE-NAME>-alpha。服務名稱具有 aws- 字首。如果您不確定模組的名稱, 請在 NPM 上搜尋 。注意
CDK API 參考 也會顯示套件名稱。
例如,以下命令會安裝實驗模組 for AWS CodeStar。
$ npm install @aws-cdk/aws-codestar-alpha有些服務的建構程式庫支援位於多個命名空間中。例如,除了 之外
aws-route53,還有三個額外的 Amazon Route 53 命名空間:aws-route53-targets、aws-route53-patterns和aws-route53resolver。專案的相依性會在 中維護
package.json。您可以編輯此檔案,將部分或全部相依性鎖定至特定版本,或允許在特定條件下將其更新至較新的版本。若要根據您在 中指定的規則,將專案的 NPM 相依性更新為最新允許的版本package.json:$ npm update在 TypeScript 中,您可以使用使用 NPM 安裝模組的相同名稱,將模組匯入您的程式碼。我們建議您在應用程式中匯入 AWS CDK 類別和 AWS 建構程式庫模組時採用下列實務。遵循這些準則有助於讓您的程式碼與其他 AWS CDK 應用程式保持一致,並且更容易理解。
import { App, Stack } from 'aws-cdk-lib';如果您需要來自 的許多類別
aws-cdk-lib,您可以使用 的命名空間別名,cdk而不是匯入個別類別。避免同時執行這兩個動作。import * as cdk from 'aws-cdk-lib';一般而言,使用短命名空間別名匯入 AWS 服務建構。
import { aws_s3 as s3 } from 'aws-cdk-lib';在 TypeScript 中管理相依性
在 TypeScript CDK 專案中,相依性會在專案主目錄中的
package.json檔案中指定。核心 AWS CDK 模組位於名為 的單一NPM套件中aws-cdk-lib。當您使用 安裝套件時
npm install,NPMpackage.json會為您在 中記錄套件。如果您願意,您可以使用 Yarn 取代 NPM。不過,CDK 不支援 Yarn plug-and-play模式,這是 Yarn 2 的預設模式。將下列項目新增至專案的
.yarnrc.yml檔案,以關閉此功能。nodeLinker: node-modulesCDK 應用程式
以下是
"name": "my-package", "version": "0.1.0", "bin": { "my-package": "bin/my-package.js" "scripts": { "build": "tsc", "watch": "tsc -w", "test": "jest", "cdk": "cdk" "devDependencies": { "@types/jest": "^26.0.10", "@types/node": "10.17.27", "jest": "^26.4.2", "ts-jest": "^26.2.0", "aws-cdk": "2.16.0", "ts-node": "^9.0.0", "typescript": "~3.9.7" "dependencies": { "aws-cdk-lib": "2.16.0", "constructs": "^10.0.0", "source-map-support": "^0.5.16"cdk init --language typescript命令產生的範例package.json檔案:對於可部署的 CDK 應用程式,
aws-cdk-lib必須在 的dependencies區段中指定package.json。您可以使用八進制 (^) 版本編號指標,指出您將接受比指定版本更高的版本,只要它們位於相同的主要版本。對於實驗建構模組,請指定 alpha 建構程式庫模組的確切版本,這些模組具有可能會變更APIs。請勿使用 ^ 或 ~,因為這些模組的較新版本可能會導致 API 變更,進而破壞您的應用程式。
在 的
devDependencies區段中指定測試應用程式所需的程式庫和工具版本 (例如jest測試架構)package.json。或者,使用 ^ 指定可接受較新的相容版本。第三方建構程式庫
如果您正在開發建構程式庫,請使用
"name": "my-package", "version": "0.0.1", "peerDependencies": { "aws-cdk-lib": "^2.14.0", "@aws-cdk/aws-appsync-alpha": "2.10.0-alpha", "constructs": "^10.0.0" "devDependencies": { "aws-cdk-lib": "2.14.0", "@aws-cdk/aws-appsync-alpha": "2.10.0-alpha", "constructs": "10.0.0", "jsii": "^1.50.0", "aws-cdk": "^2.14.0"peerDependencies和devDependencies區段的組合指定其相依性,如下列範例package.json檔案所示。在 中
peerDependencies,使用插入符號 (^) 來指定aws-cdk-lib程式庫使用的最低版本。這可最大限度地提高程式庫與各種 CDK 版本的相容性。指定 alpha 建構程式庫模組的確切版本,這些模組具有可能會變更APIs。使用peerDependencies可確保樹狀目錄中只有一個 CDKnode_modules程式庫的副本。在 中
devDependencies,指定測試所需的工具和程式庫,選擇性使用 ^ 來表示可接受較新的相容版本。準確指定 (不含 ^ 或 ~) 您公告程式庫的aws-cdk-lib和其他 CDK 套件的最低版本相容。此實務可確保您的測試會針對這些版本執行。如此一來,如果您不小心使用只在較新版本中找到的功能,您的測試可能會截獲它。警告
peerDependencies僅由 NPM 7 和更新版本自動安裝。如果您使用的是 NPM 6 或更早版本,或者您使用 Yarn,則必須在 中包含相依性的相依性devDependencies。否則,不會安裝它們,而且您將收到有關未解決對等相依性的警告。安裝和更新相依性
執行下列命令來安裝專案的相依性。
# Install the latest version of everything that matches the ranges in 'package.json' npm install # Install the same exact dependency versions as recorded in 'package-lock.json' npm ci# Install the latest version of everything that matches the ranges in 'package.json' $ yarn upgrade # Install the same exact dependency versions as recorded in 'yarn.lock' $ yarn install --frozen-lockfile若要更新已安裝的模組,可以使用上述
npm install和yarn upgrade命令。任一命令都會將 中的套件更新node_modules為符合 中規則的最新版本package.json。不過,它們不會更新package.json本身,您可能想要這樣做來設定新的最低版本。如果您在 GitHub 上託管套件,您可以設定 Dependabot 版本更新 以自動更新package.json。或者,使用 npm-check-updates 。重要
根據設計,當您安裝或更新相依性時,NPM 和 Yarn 會選擇符合 中指定需求的每個套件的最新版本
package.json。這些版本一律會有損壞的風險 (意外或刻意)。在更新專案的相依性後徹底測試。AWS TypeScript 中的 CDK 慣用詞
Props
所有 AWS 建構程式庫類別都會使用三個引數來執行個體化:定義建構 的範圍 (其在建構樹狀結構中的父系)、 id 和 props 。Argument props 是一組鍵/值對,建構用來設定其建立 AWS 的資源。其他類別和方法也會針對引數使用「屬性組合」模式。
在 TypeScript 中, 的形狀
props是使用界面來定義,該界面會告訴您必要和選用的引數及其類型。這類界面會針對每種props引數定義,通常是針對單一建構或方法。例如,建構 (在aws-cdk-lib/aws-s3模組中)Bucket指定符合BucketProps界面的props引數。如果屬性本身是物件,例如 的
websiteRedirect屬性BucketProps,則該物件會有其形狀必須符合的專屬界面,在此情況下為RedirectTarget。如果您要將 AWS 建構程式庫類別子類別 (或覆寫採用類似 props 引數的方法),您可以從現有界面繼承,以建立新的界面,指定程式碼所需的任何新 props。呼叫父類別或基礎方法時,通常您可以傳遞您收到的整個 props 引數,因為在 物件中提供但未在界面中指定的任何屬性都會遭到忽略。
AWS CDK 的未來版本可能會同時新增具有您用於自有屬性名稱的新屬性。然後,傳遞您收到的繼承鏈值可能會導致意外行為。將屬性移除或設定為 時收到的道具淺複本傳遞更安全
undefined。例如:super(scope, name, {...props, encryptionKeys: undefined});或者,為您的屬性命名,以便明確它們屬於您的建構。如此一來,它們不太可能與未來 AWS CDK 版本中的屬性碰撞。如果其中有許多,請使用單一適當命名的物件來保留它們。
物件 (例如 props) 中的遺失值具有 TypeScript
undefined中的值。3.7 版的語言引進了可簡化使用這些值的運算子,當達到未定義的值時,更容易指定預設值和「短路」鏈結。如需這些功能的詳細資訊,請參閱 TypeScript 3.7 版本備註 ,特別是前兩個功能:選用鏈結和 Nullish Coalescing。