啟動環境以搭配 使用 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父目錄執行 。如果您不提供環境作為引數,則 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 Cloud Operations & Migrations 部落格 啟動多個 AWS 帳戶 以供 AWS CDK 使用 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 團隊會定期將引導範本更新為新版本。發生這種情況時,建議您更新引導堆疊。如果您尚未自訂引導程序,您可以按照最初引導環境時採取的相同步驟來更新引導堆疊。如需詳細資訊,請參閱Bootstrap 範本版本歷史記錄

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

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角色授予從 AWS 環境中查詢內容值readOnly許可。它由 假設 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命令,將引導堆疊更新為新版本。

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

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命令的許可。

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

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

功能 舊版 (僅限 v1) 現代 (v1 和 v2)
跨帳戶部署 不允許 允許
AWS CloudFormation 許可 使用目前使用者的許可進行部署 (依 AWS 設定檔、環境變數等決定) 使用佈建引導堆疊時指定的許可進行部署 (例如,使用 --trust
版本控制 只有一個版本的引導堆疊可用 Bootstrap 堆疊已版本化;未來版本中可以新增新資源,而 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 帳戶 AWS KMS 金鑰發出的請求。這些請求必須來自 Amazon S3, AWS 區域 且與 AWS KMS 金鑰相同。

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

只要您尚未將引導範本上的 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。