這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
本主題說明如何對 的下列問題進行故障診斷 AWS CDK。
更新 後 AWS CDK, AWS CDK Toolkit (CLI) 會報告與 AWS Construct Library 的不相符
Toolkit 的版本 AWS CDK (提供 cdk
命令) 必須至少等於主要 AWS 建構程式庫模組 的版本aws-cdk-lib
。Toolkit 旨在向後相容。工具組的最新 2.x 版本可與程式庫的任何 1.x 或 2.x 版本搭配使用。因此,我們建議您全域安裝此元件,並保持其最新狀態。
npm update -g aws-cdk
如果您需要使用多個版本的 AWS CDK Toolkit,請在您的專案資料夾本機安裝特定版本的工具組。
如果您使用的是 TypeScript 或 JavaScript,您的專案目錄已包含 CDK Toolkit 的版本控制本機副本。
如果您使用的是其他語言,請使用 npm
安裝 AWS CDK Toolkit、省略-g
旗標並指定所需的版本。例如:
npm install aws-cdk@2.0
若要執行本機安裝 AWS CDK 的 Toolkit,請使用 命令npx aws-cdk
,而非僅使用 cdk
。例如:
npx aws-cdk deploy MyStack
npx aws-cdk
如果存在 Toolkit 的本機版本,則 會執行該工具 AWS CDK 組。當專案沒有本機安裝時,它會回到全域版本。您可能會發現設定 Shell 別名以確保cdk
一律以這種方式叫用 相當方便。
alias cdk="npx aws-cdk"
(返回清單)
部署 AWS CDK 堆疊時,我收到NoSuchBucket
錯誤
您的 AWS 環境尚未啟動,因此沒有在部署期間保留資源的 Amazon S3 儲存貯體。您可以使用下列命令建立預備儲存貯體和其他必要的資源:
cdk bootstrap aws://
ACCOUNT-NUMBER
/REGION
為了避免產生意外 AWS 費用, AWS CDK 不會自動引導任何環境。您必須明確引導要部署的每個環境。
根據預設,引導資源是在目前 AWS CDK 應用程式中堆疊所使用的區域或區域中建立。或者,它們是在本機 AWS 設定檔中指定的區域中建立 (由 設定aws configure
),使用該設定檔的帳戶。您可以在命令列上指定不同的帳戶和區域,如下所示。(如果您不在應用程式的目錄中,則必須指定帳戶和區域。)
cdk bootstrap aws://
ACCOUNT-NUMBER
/REGION
如需詳細資訊,請參閱AWS CDK 引導。
(返回清單)
部署 AWS CDK 堆疊時,我會收到forbidden: null
訊息
您正在部署需要引導資源的堆疊,但正在使用缺少寫入許可的 IAM 角色或帳戶。(部署包含資產或合成 AWS CloudFormation 大於 50K 範本的堆疊時,會使用預備儲存貯體。) 使用具有許可的帳戶或角色,對錯誤訊息中提到的儲存貯s3:*
體執行動作。
(返回清單)
合成 AWS CDK 堆疊時,我會收到訊息 --app is required either in command-line, in cdk.json or in ~/.cdk.json
此訊息通常表示當您發出 時,您不在 AWS CDK 專案的主目錄中cdk synth
。cdk.json
此目錄中的檔案由 cdk init
命令建立,包含執行 (進而合成) AWS CDK 應用程式所需的命令列。例如,對於 TypeScript 應用程式,預設值cdk.json
看起來像這樣:
{
"app": "npx ts-node bin/my-cdk-app.ts"
}
我們建議只在專案的主目錄中發出cdk
命令,因此 AWS CDK 工具組可以在cdk.json
那裡找到並成功執行您的應用程式。
如果因為某些原因而不切實際, AWS CDK Toolkit 會在其他兩個位置尋找應用程式的命令列:
-
主目錄中
cdk.json
的 中 -
使用
-a
選項在cdk synth
命令本身上
例如,您可以從 TypeScript 應用程式合成堆疊,如下所示。
cdk synth --app "npx ts-node my-cdk-app.ts" MyStack
(返回清單)
合成 AWS CDK 堆疊時,我會收到錯誤, AWS CloudFormation 因為範本包含太多資源
AWS CDK 會產生並部署 AWS CloudFormation 範本。堆疊可以包含的資源數量 AWS CloudFormation 有硬性限制。使用 AWS CDK,您可以比預期更快地達到此限制。
注意
寫入時 AWS CloudFormation 的資源限制為 500。請參閱目前資源限制的AWS CloudFormation 配額。
AWS Construct Library 的高階意圖型建構會自動佈建記錄、金鑰管理、授權和其他用途所需的任何輔助資源。例如,授予另一個資源存取權會產生相關服務通訊所需的任何 IAM 物件。
根據我們的經驗,實際使用以意圖為基礎的建構會產生每個建構 1–5 個 AWS CloudFormation 資源,但可能會有所差異。對於無伺服器應用程式,每個 API 端點通常有 5–8 個 AWS 資源。
模式代表更高層級的抽象,可讓您定義更多 AWS 資源,甚至更少的程式碼。例如範例:使用 建立 AWS Fargate 服務 AWS CDK, 中的 AWS CDK 程式碼會產生超過 50 個 AWS CloudFormation 資源,同時只定義三個建構!
超過 AWS CloudFormation 資源限制是 AWS CloudFormation 合成期間的錯誤。如果您的堆疊超過限制的 80%, 會 AWS CDK 發出警告。您可以透過在堆疊上設定 maxResources
屬性來使用不同的限制,或將 maxResources
設定為 0 來停用驗證。
提示
您可以使用下列公用程式指令碼,取得合成輸出中 資源的確切計數。(因為每個 AWS CDK 開發人員都需要 Node.js,所以指令碼會以 JavaScript.)
// rescount.js - count the resources defined in a stack
// invoke with: node rescount.js <path-to-stack-json>
// e.g. node rescount.js cdk.out/MyStack.template.json
import * as fs from 'fs';
const path = process.argv[2];
if (path) fs.readFile(path, 'utf8', function(err, contents) {
console.log(err ? `${err}` :
`${Object.keys(JSON.parse(contents).Resources).length} resources defined in ${path}`);
}); else console.log("Please specify the path to the stack's output .json file");
當您堆疊的資源計數接近限制時,請考慮重新建構以減少堆疊包含的資源數量:例如,透過合併一些 Lambda 函數,或將您的堆疊分成多個堆疊。CDK 支援堆疊之間的參考,因此您可以將應用程式的功能以對您最有意義的方式區隔成不同的堆疊。
注意
AWS CloudFormation 專家通常會建議使用巢狀堆疊做為資源限制的解決方案。透過 NestedStack 建構 AWS CDK 支援此方法。
(返回清單)
我為我的 Auto Scaling 群組或 VPC 指定了三個 (或更多) 可用區域,但只部署在兩個
若要取得您請求的可用區域數量,請在堆疊的 env
屬性中指定帳戶和區域。如果您未同時指定兩者,根據預設 AWS CDK, 會將堆疊合成為環境無關。然後,您可以使用 將堆疊部署到特定區域 AWS CloudFormation。由於某些區域只有兩個可用區域,因此與環境無關的範本不會使用超過兩個。
注意
在過去,區域偶爾只會啟動一個可用區域。環境無關的 AWS CDK 堆疊無法部署到此類區域。不過,在此撰寫中,所有 AWS 區域至少有兩個 AZs。
您可以覆寫堆疊的 availablilityZones
(Python:availability_zones
) 屬性來明確指定要使用的區域,藉此變更此行為。
如需在合成時間指定堆疊帳戶和區域,同時保留部署到任何區域的彈性的詳細資訊,請參閱的環境 AWS CDK。
(返回清單)
我的 S3 儲存貯體、DynamoDB 資料表或其他資源不會在我發出時刪除 cdk destroy
根據預設,可以包含使用者資料的資源具有 removalPolicy
(Python:removal_policy
) 屬性RETAIN
,且當堆疊銷毀時不會刪除資源。反之,資源會從堆疊中孤立。然後,您必須在堆疊銷毀後手動刪除資源。重新部署堆疊會失敗,直到您完成此操作為止。這是因為在部署期間建立的新資源名稱與孤立資源的名稱衝突。
如果您將資源的移除政策設定為 DESTROY
,該資源會在堆疊銷毀時遭到刪除。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class CdkTestStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
}
}
注意
AWS CloudFormation 無法刪除非空白的 Amazon S3 儲存貯體。如果您將 Amazon S3 儲存貯體的移除政策設定為 DESTROY
,且其中包含資料,則嘗試銷毀堆疊將會失敗,因為無法刪除儲存貯體。您可以讓 AWS CDK 刪除儲存貯體中的物件,然後再嘗試將儲存貯體的autoDeleteObjects
道具設定為 來銷毀它true
。
(返回清單)