引導您的環境以與 AWS CDK - AWS Cloud Development Kit (AWS CDK) V2

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

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

引導您的環境以與 AWS CDK

啟動您的 AWS 環境,為 AWS Cloud Development Kit (AWS CDK) 堆疊部署做好準備。

  • 如需環境簡介,請參閱環境

  • 如需引導載入的簡介,請參閱。引導

如何引導您的環境

您可以使用 AWS CDK 命令列介面 (AWS CDK CLI) 或偏好的 AWS CloudFormation 部署工具來啟動環境。

使用 CDK CLI

您可以使用 CDK CLI cdk bootstrap 指令來啟動您的環境。如果您不需要對引導載入進行重大修改,我們建議使用此方法。

從任何工作目錄引導

要從任何工作目錄引導,請提供要啟動的環境作為命令行引數。以下是範例:

$ cdk bootstrap aws://123456789012/us-east-1

提供引數時,aws://前綴是可選的。以下是有效的:

$ cdk bootstrap 123456789012/us-east-1

要同時引導多個環境,請提供多個參數:

$ cdk bootstrap aws://123456789012/us-east-1 aws://123456789012/us-east-2
從 CDK 項目的父目錄引導

您可以cdk bootstrap從包含檔案的 CDK 專cdk.json案的父目錄執行。如果您未提供環境作為引數,CDK CLI 會從預設來源取得環境資訊,例如您的configcredentials檔案或 CDK 堆疊指定的任何環境資訊。

當您從 CDK 專案的父目錄啟動時,從命令列引數提供的環境優先於其他來源。

若要啟動您configcredentials檔案中指定的環境,請使用下列--profile選項:

$ cdk bootstrap --profile prod

若要取得有關cdk bootstrap指令和支援選項的更多資訊,請參閱〈〉cdk bootstrap

使用任何 AWS CloudFormation 工具

您可以從 aws-cdk GitHub 儲存庫複製啟動程序範本,或使用指令取得範本。cdk bootstrap --show-template然後,使用任何 AWS CloudFormation 工具將範本部署到您的環境中。

使用此方法,您可以使用 AWS CloudFormation StackSets 或 AWS Control Tower。您也可以使用 AWS CloudFormation 控制台或 AWS Command Line Interface (AWS CLI)。您可以在部署範本之前對範本進行修改。這種方法可能更靈活,並且適合大規模部署。

以下是使用--show-template選項擷取啟動程序範本並將其儲存至本機電腦的範例:

macOS/Linux
$ cdk bootstrap --show-template > bootstrap-template.yaml
Windows

在 Windows 上, PowerShell 必須用來保留模板的編碼。

powershell "cdk bootstrap --show-template | Out-File -encoding utf8 bootstrap-template.yaml"

若要使用 CDK 部署此範本CLI,您可以執行下列命令:

$ cdk bootstrap --template bootstrap-template.yaml

以下是使用部署範本 AWS CLI 的範例:

macOS/Linux
aws cloudformation create-stack \ --stack-name CDKToolkit \ --template-body file://path/to/bootstrap-template.yaml \ --capabilities CAPABILITY_NAMED_IAM \ --region us-west-1
Windows
aws cloudformation create-stack ^ --stack-name CDKToolkit ^ --template-body file://path/to/bootstrap-template.yaml ^ --capabilities CAPABILITY_NAMED_IAM ^ --region us-west-1

如需使用 CloudFormation StackSets 啟動多個環境的相關資訊,請參閱 AWS 雲端操作和遷移部落格 CloudFormation StackSets中的多重 AWS 帳戶啟動載入。 AWS CDK

何時引導您的環境

在部署到環境之前,您必須啟動每個環境。如果您嘗試將 CDK 堆疊部署到尚未啟動載入的環境中,您會看到類似下列的錯誤訊息:

$ cdk deploy ✨ Synthesis time: 2.02s ❌ Deployment failed: Error: BootstrapExampleStack: SSM parameter /cdk-bootstrap/hnb659fds/version not found. Has the environment been bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)

它是可以引導一個環境不止一次。如果環境已經啟動載入,則必要時會升級啟動程序堆疊。否則,什麼都不會發生。

更新您的引導堆棧

CDK 團隊會定期將啟動程序範本更新為新版本。發生這種情況時,我們建議您更新啟動程序堆疊。如果您尚未自訂啟動載入程序,則可以按照最初啟動環境所採取的相同步驟來更新 Bootstrap 堆疊。如需詳細資訊,請參閱 引導模板歷史版本

自訂引導

如果預設的啟動程序範本不符合您的需求,您可以使用下列方式將資源啟動載入環境中:

  • 搭配指令使用cdk bootstrap指令行選項 — 此方法最適合透過指令行選項進行支援的小型特定變更。

  • 修改預設啟動程序範本並加以部署 — 此方法最適合進行複雜的變更,或者如果您想要完全控制啟動載入期間佈建的資源配置。

如需自訂啟動載入的詳細資訊,請參閱。自訂 AWS CDK 引導

使用 CDK Pipelines 進行引導

如果您使用 CDK Pipelines 部署到其他帳戶的環境中,並且收到類似下列的訊息:

Policy contains a statement with one or more invalid principals

此錯誤訊息表示其他環境中不存在適當的 IAM 角色。最可能的原因是環境尚未啟動載入。啟動環境,然後再試一次。

保護您的啟動程序堆疊免遭刪

如果刪除啟動程序堆疊,也會刪除原本在環境中佈建以支援 CDK 部署的 AWS 資源。這將導致管道停止工作。如果發生這種情況,則沒有恢復的通用解決方案。

啟動載入環境後,請勿刪除並重新建立環境的啟動程序堆疊。相反,請嘗試通過再次運行cdk bootstrap命令將啟動程序堆棧更新為新版本。

為了防止意外刪除啟動程序堆疊,我們建議您提供啟用終止保護cdk bootstrap命令的--termination-protection選項。您可以在新的或現有的啟動程序堆疊上啟用終止保護。如需啟用終止保護的指示,請參閱啟動程序堆疊啟用終止保護

引導模板歷史版本

引導程序模板是版本化的,並隨著時間的 AWS CDK 推移而發展。如果您提供自己的引導模板,請使用規範的默認模板保持最新狀態。您要確保範本可繼續使用所有 CDK 功能。

注意

默認情況下,引導模板的早期版本 AWS KMS key 在每個引導式環境中創建了一個。若要避免 KMS 金鑰收費,請使用--no-bootstrap-customer-key. 目前的預設值為無 KMS 金鑰,這有助於避免這些費用。

本節包含在每個版本中所做的變更清單。

範本版本 AWS CDK 版本 變更
1 1.40.0 具有值區、金鑰、儲存庫和角色的初始範本版本。
2 1.45.0 將資產發佈角色分割為個別的檔案和影像發佈角色。
3 1.46.0 新增FileAssetKeyArn匯出,以便能夠將解密權限新增至資產取用者。
4 1.61.0 AWS KMS 現在可透過 Amazon S3 隱含許可,不再需要FileAsetKeyArn。添加 CdkBootstrapVersion SSM 參數,以便在不知道堆棧名稱的情況下驗證啟動程序堆棧版本。
5 1.87.0 部署角色可以讀取 SSM 參數。
6 1.108.0 新增與部署角色分開的查詢角色。
6 1.109.0 aws-cdk:bootstrap-role標籤附加至部署、檔案發佈和映像發佈角色。
7 1.110.0 部署角色無法再直接讀取目標帳戶中的值區。不過,這個角色實際上是系統管理員,而且總是可以使用其 AWS CloudFormation 權限讓值區可讀取)。
8 1.114.0 查閱角色具有目標環境的完整唯讀權限,並具有aws-cdk:bootstrap-role標籤。
9 2.1.0 修正 Amazon S3 資產上傳不被常見參考的加密 SCP 拒絕的問題。
10 2.4.0 Amazon ECR 現 ScanOnPush 在預設為啟用。
11 2.18.0 新增允許 Lambda 從 Amazon ECR 存放庫提取的政策,以便在重新啟動過程中繼續存在。
12 2.20.0 添加對實驗性的支持cdk import
13 2.25.0 使啟動載具建立的 Amazon ECR 儲存庫中的容器映像不可變。
14 2.34.0 依預設,在儲存庫層級關閉 Amazon ECR 映像掃描,以允許不支援映像掃描的啟動載入區域。
15 2.60.0 無法標記 KMS 金鑰。
16 2.69.0 找到 KMS .2 的位址 Security Hub。
17 2.72.0 找到 ECR.3 的位址 Security Hub。
18 2.80.0 針對版本 16 所做的還原變更,因為它們不適用於所有分割區,因此不建議使用。
19 2.106.1 還原對 18 版所做的變更,其中 AccessControl 屬性已從範本中移除。(#27964)
20 2.119.0 ssm:GetParameters動作新增至部 AWS CloudFormation 署 IAM 角色。如需詳細資訊,請參閱 #28336

從舊版升級到現代引導模板

AWS CDK v1 支持兩個引導模板,傳統和現代。CDK V2 僅支持現代模板。作為參考,以下是這兩個模板之間的高層次差異。

功能 舊版 (僅限 v1) 現代(V1 和 V2)
跨帳戶部署 不允許 允許
AWS CloudFormation 許可 使用目前使用者的權限進行部署 (由 AWS 設定檔、環境變數等決定) 使用佈建啟動程序堆疊時指定的權限進行部署 (例如,使--trust用)
版本控制 只有一個版本的啟動程序堆棧可用 Bootstrap 堆棧已版本化; 可以在將 future 的版本中添加新資源,並且 AWS CDK 應用程序可能需要最低版本
資源 * Amazon S3 儲存貯體 Amazon S3 儲存貯體
AWS KMS key
IAM 角色
Amazon ECR 儲存庫
用於版本控制的 SSM 參數
資源命名 自動產生 确定性
貯體加密 預設金鑰 AWS 託管密鑰默認情況下。您可以自訂以使用客戶管理的金鑰。

* 我們將根據需要向引導模板添加其他資源。

必須升級使用舊版範本啟動載入的環境,才能透過重新啟動載入來使用 CDK v2 的現代範本。在刪除舊版值區之前,至少重新部署環境中的所有 AWS CDK 應用程式一次。

位址 Security Hub 發現

如果您正在使用 AWS Security Hub,則可能會看到 AWS CDK 引導過程創建的某些資源的發現結果報告。Security Hub 發現項目可協助您尋找應該仔細檢查準確性和安全性的資源組態。我們已透過 AWS Security 檢閱這些特定的資源組態,並確信它們不會構成安全性問題。

[KMS.2] IAM 主體不應具有允許對所有 KMS 金鑰進行解密動作的 IAM 內嵌政策

署角色 (DeploymentActionRole) 授與讀取加密資料的權限,這對於使用 CDK Pipelines 進行跨帳戶部署是必要的。此角色的原則不會授與所有資料的權限。只有在這些資源允許透過儲存貯體或金鑰政策時 AWS KMS,才授予從 Amazon S3 讀取加密資料的權限。

以下是啟動程序範本中部署角色中這兩個陳述式的片段:

DeploymentActionRole: Type: AWS::IAM::Role Properties: ... Policies: - PolicyDocument: Statement: ... - Sid: PipelineCrossAccountArtifactsBucket Effect: Allow Action: - s3:GetObject* - s3:GetBucket* - s3:List* - s3:Abort* - s3:DeleteObject* - s3:PutObject* Resource: "*" Condition: StringNotEquals: s3:ResourceAccount: Ref: AWS::AccountId - Sid: PipelineCrossAccountArtifactsKey Effect: Allow Action: - kms:Decrypt - kms:DescribeKey - kms:Encrypt - kms:ReEncrypt* - kms:GenerateDataKey* Resource: "*" Condition: StringEquals: kms:ViaService: Fn::Sub: s3.${AWS::Region}.amazonaws.com ...

為什麼 Security Hub 標記這個?

這些策略包含一個Resource: *Condition子句的組合。Security Hub 標記*萬用字元。使用此萬用字元是因為在啟動載入帳戶時,CDK Pipelines 針對 CodePipeline 成品值區建立的 AWS KMS 金鑰尚不存在,因此 ARN 無法在啟動程序範本上參考。此外,提高此標誌時,Security Hub 不會考慮Condition子句。這Condition限制Resource: *了從相同 AWS 帳戶 的 AWS KMS 密鑰發出的請求。這些請求必須來自 Amazon S3 的 AWS KMS 金鑰 AWS 區域 相同。

我需要解決這個發現嗎?

只要您尚未將啟動程序範本上的 AWS KMS 金鑰修改為過於寬容,部署角色就不允許超過所需的存取權限。因此,沒有必要修復此發現。

如果我想解決這個發現怎麼辦?

如何修正此發現項目取決於您是否將使用 CDK Pipelines 進行跨帳戶部署。

若要修正安全中心尋找並使用 CDK Pipelines 進行跨帳戶部署
  1. 如果您尚未這麼做,請使用cdk bootstrap指令部署 CDK 啟動程序堆疊。

  2. 如果您尚未這樣做,請創建並部署 CDK Pipeline。如需說明,請參閱使用 CDK Pipelines 持續整合與交付 (CI/CD)

  3. 獲得 CodePipeline 神器存儲桶的 AWS KMS 密鑰 ARN。此資源是在管線建立期間建立的。

  4. 取得 CDK 啟動程序範本的複本以進行修改。下面是一個例子,使用 AWS CDK CLI:

    $ cdk bootstrap --show-template > bootstrap-template.yaml
  5. 以 ARN 值取Resource: *PipelineCrossAccountArtifactsKey陳述式以修改範本。

  6. 部署範本以更新您的啟動程序堆疊。以下是使用 CDK CLI 的範例:

    $ cdk bootstrap aws://account-id/region --template bootstrap-template.yaml
修復安全中心,查找是否未使用 CDK Pipelines 進行跨帳戶部署
  1. 取得 CDK 啟動程序範本的複本以進行修改。以下是使用 CDK CLI 的範例:

    $ cdk bootstrap --show-template > bootstrap-template.yaml
  2. 從範本中刪除PipelineCrossAccountArtifactsBucketPipelineCrossAccountArtifactsKey陳述式。

  3. 部署範本以更新您的啟動程序堆疊。以下是使用 CDK CLI 的範例:

    $ cdk bootstrap aws://account-id/region --template bootstrap-template.yaml

考量事項

由於啟動安裝會在您的環境中佈建資源, AWS 因此當這些資源與. AWS CDK