引导您的环境以用于 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

您可以使用CDKCLIcdk 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 bootstrap从包含cdk.json文件的CDK项目的父目录中运行。如果您不提供环境作为参数,则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"

要使用部署此模板 CDKCLI,可以运行以下命令:

$ 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 ,请参阅 AWSCloud Operations & M igration AWS CDK s AWS 账户 博客 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 权限。此角色 CloudFormation 允许在您的账户中执行 AWS API调用,包括部署堆栈。

通过使用服务角色,为该服务角色配置的权限决定了可以对您的 CloudFormation 资源执行哪些操作。如果没有此服务角色,则您提供的安全证书CDKCLI将决定允许执行的操作。 CloudFormation

DeploymentActionRole

此IAM角色授予在您的环境中执行部署的权限。这是CDKCLI在部署期间假设的。

通过使用角色进行部署,您可以执行跨账户部署,因为该角色可以由不同账户中的 AWS 身份担任。

FilePublishingRole

此IAM角色授予对已启动的亚马逊简单存储服务 (Amazon S3) 存储桶执行操作的权限,包括上传和删除资产。这是CDKCLI在部署期间假设的。

ImagePublishingRole

此IAM角色授予对已启动的亚马逊弹性容器注册表 (AmazonECR) 存储库执行操作的权限。这是CDKCLI在部署期间假设的。

LookupRole

此IAM角色授readOnly予从 AWS 环境中查找上下文值的权限。这是在执行模板合成和部署等任务CDKCLI时假设的。

在引导过程中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": "*" } ] }

随着时间的推移,引导堆栈(包括创建的资源及其所需的权限)可能会发生变化。对于 future 的更改,您可能需要修改引导环境所需的权限。

自定义引导

如果默认的引导模板不适合您的需求,则可以通过以下方式将资源引导到您的环境中进行自定义:

  • 在命令中使用cdk bootstrap命令行选项-此方法最适合进行通过命令行选项支持的细小、特定的更改。

  • 修改默认的引导模板并进行部署 — 此方法最适合进行复杂的更改,或者如果您想完全控制引导期间配置的资源的配置。

有关自定义引导的更多信息,请参阅。自定义 AWS CDK 引导

使用管道进行引导 CDK

如果您正在使用 P CDK ipelines 部署到其他账户的环境中,并且会收到如下消息:

Policy contains a statement with one or more invalid principals

此错误消息表示其他环境中不存在相应的IAM角色。最有可能的原因是环境没有被引导。引导环境并重试。

保护您的引导堆栈不被删除

如果删除了引导堆栈,则最初在环境中为支持CDK部署而配置的 AWS 资源也将被删除。这将导致管道停止工作。如果发生这种情况,则没有通用的恢复解决方案。

环境启动后,请勿删除和重新创建环境的引导堆栈。相反,请尝试通过再次运行cdk bootstrap命令将引导堆栈更新到新版本。

为了防止引导程序堆栈被意外删除,我们建议您提供启用终止保护的cdk bootstrap命令--termination-protection选项。您可以在新的或现有的引导程序堆栈上启用终止保护。有关启用终止保护的说明,请参阅为引导堆栈启用终止保护

Bootstrap 模板版本历史记录

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。添加CdkBootstrapVersionSSM参数,这样就可以在不知道堆栈名称的情况下验证引导堆栈版本。
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 现在 ECR ScanOnPush ,亚马逊已默认启用。
11 2.18.0 添加了允许 Lambda 从 Amazon 存储库中提取数据的政策,使其能够在ECR重启后幸存下来。
12 2.20.0 添加对实验的支持cdk import
13 2.25.0 使引导创建的 A ECR mazon 存储库中的容器映像不可变。
14 2.34.0 默认情况下,在存储库级别关闭 Amazon ECR 图像扫描,以允许引导不支持图像扫描的区域。
15 2.60.0 KMS密钥不能被标记。
16 2.69.0 解决了 Security Hub 的调查结果 KMS2.
17 2.72.0 解决了 Security Hub 的调查结果 ECR.3.
18 2.80.0 还原了针对版本 16 所做的更改,因为它们不适用于所有分区,因此不建议这样做。
19 2.106.1 恢复了对版本 18 所做的更改,其中 AccessControl 属性已从模板中删除。(#27964)
20 2.119.0 向 AWS CloudFormation 部署IAM角色添加ssm:GetParameters操作。有关更多信息,请参阅 #28336.
21 2.149.0 为文件发布角色添加条件。

从传统引导模板升级到现代引导模板

AWS CDK v1 支持两个引导模板,即旧版和现代版。CDKv2 仅支持现代模板。作为参考,以下是这两个模板之间的高级区别。

功能 旧版(仅限 v1) 现代(v1 和 v2)
跨账户部署 不允许 已允许
AWS CloudFormation 权限 使用当前用户的权限(由 AWS 配置文件、环境变量等决定)进行部署 使用配置引导堆栈时指定的权限进行部署(例如,使用)--trust
版本控制 只有一个版本的引导堆栈可用 Bootstrap 堆栈已有版本控制;可以在未来的版本中添加新资源, AWS CDK 应用程序可能需要最低版本
资源 * Amazon S3 存储桶 Amazon S3 存储桶
AWS KMS key
IAM角色
亚马逊ECR存储库
SSM用于版本控制的参数
资源命名 自动生成 确定性
存储桶加密 默认密钥 AWS 默认情况下是托管密钥。您可以自定义以使用客户托管密钥。

* 我们将根据需要向引导模板添加其他资源

使用旧版模板启动的环境必须通过重新引导进行升级,才能使用适用于 CDK v2 的现代模板。在删除旧存储桶之前,至少重新部署环境中的所有 AWS CDK 应用程序一次。

解决 Security Hub 的调查结果

如果您正在使用 AWS Security Hub,则可能会看到有关 AWS CDK 引导过程创建的某些资源的调查结果报告。Security Hub 的发现可帮助您找到资源配置,您应该仔细检查其准确性和安全性。我们已经通过 Sec AWS urity 审查了这些特定的资源配置,并确信它们不会构成安全问题。

[KMS.2] IAM 委托人不应有允许对所有密钥执行解密操作的IAM内联策略 KMS

部署角色 (DeploymentActionRole) 授予读取加密数据的权限,这是使用 Pipelin CDK es 进行跨账户部署所必需的。担任此角色的策略不授予对所有数据的权限。它仅授予从 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 会举报这个?

这些政策包含一个Resource: *组合Condition条款。Security Hub 会标记*通配符。之所以使用此通配符,是因为在引导账户时,Pipelin CDK es 为 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. 如果您尚未这样做,请创建并部署您的CDKPipeline。有关说明,请参阅 使用 CDK Pipelines 进行持续集成和交付 (CI/CD)

  3. 获取 CodePipeline 工件存储桶ARN的 AWS KMS 密钥。此资源是在创建管道期间创建的。

  4. 获取CDK引导模板的副本以对其进行修改。以下是使用以下内容的示例 AWS CDK CLI:

    $ cdk bootstrap --show-template > bootstrap-template.yaml
  5. 通过将PipelineCrossAccountArtifactsKey语句替换Resource: *为您的ARN值来修改模板。

  6. 部署模板以更新您的引导堆栈。以下是使用以下内容的示例 CDKCLI:

    $ cdk bootstrap aws://account-id/region --template bootstrap-template.yaml
如果您未使用CDK流水线进行跨账户部署,请修复 Security Hub 的发现
  1. 获取CDK引导模板的副本以对其进行修改。以下是使用以下内容的示例 CDKCLI:

    $ cdk bootstrap --show-template > bootstrap-template.yaml
  2. 从模板中删除PipelineCrossAccountArtifactsBucketPipelineCrossAccountArtifactsKey语句。

  3. 部署模板以更新您的引导堆栈。以下是使用以下内容的示例 CDKCLI:

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

注意事项

由于引导会在您的环境中配置资源,因此当这些资源与一起使用时,您可能会产生 AWS 费用。 AWS CDK