引導您的環境以搭配 使用 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 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 帳戶號碼,您可以從 取得 AWS Management Console。您也可以使用下列 AWS CLI 命令來顯示您的預設帳戶資訊,包括您的帳戶號碼:

$ aws sts get-caller-identity

如果您已在 AWS configcredentials 檔案中命名設定檔,請使用 --profile選項來擷取特定設定檔的帳戶資訊。以下是範例:

$ aws sts get-caller-identity --profile prod

若要顯示預設區域,請使用 aws configure get命令:

$ aws configure get region $ aws configure get region --profile prod

提供引數時,字aws://首是選用的。下列項目有效:

$ cdk bootstrap 123456789012/us-east-1

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

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

您可以從包含 cdk.json 檔案之CDK專案的cdk bootstrap父目錄執行 。如果您不提供環境做為引數, CDKCLI 將從預設來源取得環境資訊,例如您的 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雲端操作與遷移部落格中的引導多個 AWS CDKAWS 帳戶 使用 CloudFormation StackSets

何時啟動您的環境

您必須先引導每個 AWS 環境,才能部署到環境中。我們建議您主動引導您計劃使用的每個環境。您可以在計劃實際將CDK應用程式部署到環境之前執行此操作。透過主動引導您的環境,您可以防止潛在的未來問題,例如 Amazon S3 儲存貯體名稱衝突,或將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 團隊會定期將引導範本更新為新版本。發生這種情況時,我們建議您更新引導堆疊。如果您尚未自訂引導程序,您可以依照最初引導環境時採取的相同步驟來更新引導堆疊。如需詳細資訊,請參閱引導範本版本歷史記錄

在引導期間建立的預設資源

IAM 在引導期間建立的角色

根據預設,引導會在您的環境中佈建下列 AWS Identity and Access Management (IAM) 角色:

  • CloudFormationExecutionRole

  • DeploymentActionRole

  • FilePublishingRole

  • ImagePublishingRole

  • LookupRole

CloudFormationExecutionRole

此IAM角色是一種 CloudFormation 服務角色,可授予代表您執行堆疊部署的 CloudFormation 許可。此角色提供在您的帳戶中執行 AWS API呼叫的 CloudFormation 許可,包括部署堆疊。

透過使用服務角色,為服務角色佈建的許可會決定可以對 CloudFormation 資源執行哪些動作。如果沒有此服務角色,則您使用 提供的安全登入資料 CDK CLI 會決定 CloudFormation 允許執行的動作。

DeploymentActionRole

此IAM角色會授予許可,以在您的環境中執行部署。它由 擔任 CDK CLI 部署期間。

透過使用 角色進行部署,您可以執行跨帳戶部署,因為不同帳戶中的 AWS 身分可以擔任該角色。

FilePublishingRole

此IAM角色會授予許可,以針對已啟動的 Amazon Simple Storage Service (Amazon S3) 儲存貯體執行動作,包括上傳和刪除資產。它由 擔任 CDK CLI 部署期間。

ImagePublishingRole

此IAM角色會授予許可,以對引導的 Amazon Elastic Container Registry (Amazon ECR) 儲存庫執行動作。它由 擔任 CDK CLI 部署期間。

LookupRole

此IAM角色授予readOnly許可,以從 AWS 環境查詢內容值。它由 擔任 CDK CLI 執行範本合成和部署等任務時。

在引導期間IDs建立的資源

部署預設引導範本時,會使用下列結構建立引導資源IDs的實體:cdk-qualifier-description-account-ID-Region

  • 限定詞 – 九個字元的唯一字串值 hnb659fds。實際值不具重要性。

  • 描述 – 資源的簡短描述。例如:container-assets

  • 帳戶 ID – 環境的 AWS 帳戶 ID。

  • 區域 – 環境 AWS 區域 的 。

以下是在引導期間建立之 Amazon S3 預備儲存貯體的實體 ID 範例:cdk-hnb659fds-assets-012345678910-us-west-1

啟動環境時使用的許可

引導 AWS 環境時,執行引導的IAM身分必須至少具有下列許可:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:*", "ecr:*", "ssm:*", "s3:*", "iam:*" ], "Resource": "*" } ] }

隨著時間的推移,引導堆疊,包括建立的資源和所需的許可,可能會變更。隨著未來的變更,您可能需要修改啟動環境所需的許可。

自訂引導

如果預設引導範本不符合您的需求,您可以透過下列方式,在您的環境中自訂資源引導:

  • 使用命令列選項搭配 cdk bootstrap命令 – 此方法最適合透過命令列選項進行小而特定的變更。

  • 修改預設引導範本並進行部署 – 此方法最適合進行複雜的變更,或者如果您想要完全控制引導期間佈建的資源組態。

如需自訂引導的詳細資訊,請參閱自訂 AWS CDK 引導

使用CDK管道引導

如果您使用CDK管道部署到另一個 帳戶的環境,並且收到如下的訊息:

Policy contains a statement with one or more invalid principals

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

保護您的引導堆疊免於刪除

如果刪除引導堆疊,則最初佈建在環境中以支援CDK部署 AWS 的資源也會遭到刪除。這會導致管道停止運作。如果發生這種情況,就沒有一般的復原解決方案。

環境開機後,請勿刪除並重新建立環境的開機堆疊。反之,請再次執行 cdk bootstrap命令,嘗試將引導堆疊更新為新版本。

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

引導範本版本歷史記錄

引導範本會進行版本化,並隨著 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 Repos 提取,以便其在重新引導時存活。
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 解決 Security Hub 問題清單 KMS.2
17 2.72.0 解決 Security Hub 問題清單 ECR.3
18 2.80.0 還原對第 16 版所做的變更,因為它們並非在所有分割區中運作,因此不建議使用。
19 2.106.1 已還原對版本 18 所做的變更,其中 AccessControl 屬性已從範本中移除。(#27964)
20 2.119.0 ssm:GetParameters動作新增至 AWS CloudFormation 部署IAM角色。如需詳細資訊,請參閱 #28336
21 2.149.0 將條件新增至檔案發佈角色。
22 2.160.0 sts:TagSession許可新增至引導IAM角色的信任政策。
23 2.161.0 cloudformation:RollbackStackcloudformation:ContinueUpdateRollback許可新增至部署IAM角色的信任政策。這提供 cdk rollback命令的許可。
24 2.165.0 將引導儲存貯體中非目前物件的保留天數從 365 天變更為 30 天。由於新cdk gc命令引入刪除引導儲存貯體中物件的功能,因此此新行為可確保已刪除的物件保留在引導儲存貯體中 30 天,而不是 365 天。如需此變更的詳細資訊,請參閱 aws-cdk PR #31949
25 2.165.0 將支援新增至引導儲存貯體,以移除不完整的分段上傳。未完成的分段上傳將在 1 天後刪除。如需此變更的詳細資訊,請參閱 aws-cdk PR #31956

從舊版升級至現代引導範本

AWS CDK v1 支援兩個引導範本,傳統和現代。CDKv2 僅支援現代範本。以下是這兩個範本之間的高階差異,以供參考。

功能 舊版 (僅限 v1) 現代 (v1 和 v2)
跨帳戶部署 不允許 允許
AWS CloudFormation 許可 使用目前使用者的許可進行部署 (依 AWS 設定檔、環境變數等決定) 使用佈建引導堆疊時指定的許可進行部署 (例如,使用 --trust)
版本控制 只能使用一個版本的引導堆疊 引導堆疊已版本化;未來版本中可以新增新資源,而 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管道進行跨帳戶部署時所需的加密資料。此角色中的政策不會授予所有資料的許可。它只授予從 Amazon S3 和 讀取加密資料的許可 AWS KMS,而且只有在這些資源透過其儲存貯體或金鑰政策允許時。

以下是從引導範本部署角色中這兩個陳述式的程式碼片段:

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 會標記此項目?

政策包含 與 Condition子句的Resource: *組合。Security Hub 會標記*萬用字元。使用此萬用字元是因為在帳戶啟動時,CDKPipelines 為 CodePipeline 成品儲存貯體建立的 AWS KMS 金鑰尚不存在,因此, 無法在開機範本上參考ARN。此外,Security Hub 在發出此旗標時不會考慮 Condition子句。這Condition限制Resource: *為從相同 AWS KMS 金鑰提出 AWS 帳戶 的請求。這些請求必須來自與 AWS KMS 金鑰 AWS 區域 相同的 Amazon S3。

我需要修正此調查結果嗎?

只要您尚未將引導範本上的 AWS KMS 金鑰修改為過度寬鬆,部署角色便不允許超過其所需的存取權。因此,不需要修正此調查結果。

如果我想要修正此調查結果,該怎麼辦?

如何修正此調查結果取決於您是否將使用CDK管道進行跨帳戶部署。

修正 Security Hub 問題清單,並使用CDK管道進行跨帳戶部署
  1. 如果您尚未這麼做,請使用 cdk bootstrap命令部署CDK引導堆疊。

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

  3. 取得 CodePipeline 成品儲存貯ARN體的 AWS KMS 金鑰。此資源會在管道建立期間建立。

  4. 取得CDK引導範本的副本以進行修改。以下是使用 的範例 AWS CDK CLI:

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

  6. 部署 範本以更新您的引導堆疊。以下是使用 的範例 CDK CLI:

    $ cdk bootstrap aws://account-id/region --template bootstrap-template.yaml
如果您未使用CDK管道進行跨帳戶部署,請修正 Security Hub 問題清單
  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。