這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
啟動環境以搭配 使用 AWS CDK
啟動您的 AWS 環境,為 AWS Cloud Development Kit (AWS CDK) 堆疊部署做好準備。
-
如需環境的簡介,請參閱 適用的環境 AWS CDK。
-
如需引導的簡介,請參閱 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
config
和credentials
檔案中命名設定檔,請使用--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 將從預設來源取得環境資訊,例如您的config
和credentials
檔案,或為CDK堆疊指定的任何環境資訊。當您從CDK專案的父目錄開機時,從命令列引數提供的環境優先於其他來源。
若要啟動
config
和credentials
檔案中指定的環境,請使用--profile
選項:$
cdk bootstrap --profile
prod
如需cdk bootstrap
命令和支援選項的詳細資訊,請參閱 cdk bootstrap。
使用任何 AWS CloudFormation 工具
您可以從 aws-cdk 複製引導範本cdk bootstrap --show-template
命令取得範本。然後,使用任何 AWS CloudFormation 工具將範本部署到您的環境中。
透過此方法,您可以使用 AWS CloudFormation StackSets 或 AWS Control Tower。您也可以使用 AWS CloudFormation 主控台或 AWS Command Line Interface (AWS CLI)。您可以在部署範本之前對其進行修改。此方法可能更靈活,且適用於大規模部署。
以下是使用 --show-template
選項將引導範本擷取並儲存至本機機器的範例:
使用 部署此範本 CDK CLI,您可以執行下列動作:
$
cdk bootstrap --template
bootstrap-template.yaml
以下是使用 AWS CLI 部署 範本的範例:
如需使用 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:RollbackStack 和 cloudformation: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管道進行跨帳戶部署
-
如果您尚未這麼做,請使用
cdk bootstrap
命令部署CDK引導堆疊。 -
如果您尚未這樣做,請建立和部署您的 CDK Pipeline如需說明,請參閱 使用 CDK Pipelines 持續整合與交付 (CI/CD)。
-
取得 CodePipeline 成品儲存貯ARN體的 AWS KMS 金鑰。此資源會在管道建立期間建立。
-
取得CDK引導範本的副本以進行修改。以下是使用 的範例 AWS CDK CLI:
$
cdk bootstrap --show-template > bootstrap-template.yaml
-
將
PipelineCrossAccountArtifactsKey
陳述式取代為您的ARN值Resource: *
來修改範本。 -
部署 範本以更新您的引導堆疊。以下是使用 的範例 CDK CLI:
$
cdk bootstrap aws://
account-id
/region
--template bootstrap-template.yaml
如果您未使用CDK管道進行跨帳戶部署,則修正 Security Hub 調查結果
-
取得CDK引導範本的副本以進行修改。以下是使用 的範例 CDK CLI:
$
cdk bootstrap --show-template > bootstrap-template.yaml
-
從範本中刪除
PipelineCrossAccountArtifactsBucket
和PipelineCrossAccountArtifactsKey
陳述式。 -
部署 範本以更新您的引導堆疊。以下是使用 的範例 CDK CLI:
$
cdk bootstrap aws://
account-id
/region
--template bootstrap-template.yaml
考量事項
由於引導會在您的環境中佈建資源,因此當這些資源與 搭配使用時,可能會產生 AWS 費用 AWS CDK。