引导环境以用于 AWS CDK - AWS 云开发工具包 (AWS CDK) v2

这是 AWS CDK v2 开发人员指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。

引导环境以用于 AWS CDK

引导 AWS 环境,为 AWS 云开发工具包 (AWS CDK) 堆栈部署做好准备。

如何引导环境

您可以使用 AWS CDK 命令行界面 (AWS CDK CLI) 或首选 AWS CloudFormation 部署工具来引导环境。

使用 CDK CLI

您可以使用 CDK CLI cdk bootstrap 命令来引导环境。如果您不需要对引导进行重大修改,我们建议您使用此方法。

从任何工作目录引导

要从任何工作目录引导,请提供用于引导的环境作为命令行参数。以下是示例:

$ cdk bootstrap <aws://123456789012/us-east-1>
提示

如果您没有 AWS 账号,则可以从 AWS 管理控制台中获取。您也可以使用以下 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-cli GitHub 存储库中复制引导模板或使用 cdk bootstrap --show-template 命令获取模板。然后,使用任何 AWS CloudFormation 工具将模板部署到您的环境。

通过此方法,您可以使用 AWS CloudFormation StackSets 或 AWS Control Tower。您还可以使用 AWS CloudFormation 控制台或 AWS 命令行界面 (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"
注意

如果 AWS CloudFormation 模板输出中出现 CDK 通知,请在您的命令中提供 --no-notices 选项。

要使用 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 云运营和迁移博客中的 Bootstrapping multiple AWS accounts for AWS CDK using 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 代表您执行堆栈部署的权限。该角色为 CloudFormation 提供在您的账户中执行 AWS API 调用的权限,包括部署堆栈。

通过使用服务角色,为该服务角色预置的权限决定了可以对 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 在执行模板合成和部署等任务时代入。

在引导期间中创建的资源 ID

部署默认引导模板时,系统会使用以下结构创建引导资源的物理 ID: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 选项来启用终止保护。您可以在新的或现有的引导堆栈上启用终止保护。有关启用终止保护的说明,请参阅为引导堆栈启用终止保护

引导模板版本历史记录

引导模板受版本控制,并且会因 AWS CDK 本身随着时间推移而发生变化。如果您提供自己的引导模板,请使其与规范默认模板保持同步。您希望确保模板能够继续使用所有 CDK 功能。

注意

默认情况下,早期版本的引导模板在每个引导环境中创建了 AWS KMS 密钥。为避免产生 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

现在,通过 Amazon S3 的 AWS KMS 权限是隐式的,不再需要 FileAssetKeyArn。添加了 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

解决了 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

向 AWS CloudFormation 部署 IAM 角色添加了 ssm:GetParameters 操作。有关更多信息,请参阅 #28336

21

2.149.0

向文件发布角色添加了条件。

22

2.160.0

向引导 IAM 角色的信任策略添加了 sts:TagSession 权限。

23

2.161.0

向部署 IAM 角色的信任策略添加了 cloudformation:RollbackStackcloudformation:ContinueUpdateRollback 权限。这提供了针对 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

26

2.1002.0

FileAssetsBucketEncryptionKey 资源添加两个与删除相关的策略(UpdateReplacePolicyDeletionPolicy)。这些策略确保在更新或删除引导堆栈时正确删除旧的 AWS KMS 密钥资源。有关此更改的更多信息,请参阅 aws-cdk-cli PR #100

27

2.1003.0

添加新的 Amazon ECR 资源策略,授予 Amazon EMR Serverless 检索容器映像的特定权限。有关此更改的更多信息,请参阅 aws-cdk-cli PR #112

从旧版引导模板升级到现代版引导模板

AWS CDK v1 支持两种引导模板,即旧版和现代版。CDK v2 仅支持现代版模板。下面提供了这两个模板之间的简要区别,供您参考。

功能 旧版(仅限 v1) 现代版(v1 和 v2)

跨账户部署

不允许

已允许

AWS CloudFormation 权限

使用当前用户的权限(由 AWS 配置文件、环境变量等决定)进行部署

使用预置引导堆栈时指定的权限(例如,使用 --trust)进行部署

版本控制

只有一个版本的引导堆栈可用

引导堆栈受版本控制;可以在未来的版本中添加新资源,AWS CDK 应用程序可能需要最低版本

资源*

Amazon S3 存储桶

  • Amazon S3 存储桶

  • AWS KMS 密钥

  • IAM 角色

  • Amazon ECR 存储库

  • 用于版本控制的 SSM 参数

AWS KMS 密钥

IAM 角色

Amazon ECR 存储库

资源命名

自动生成

确定性

存储桶加密

默认密钥

默认为 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 会标记 * 通配符。之所以使用此通配符,是因为在引导账户时,CDK 管线为 CodePipeline 构件存储桶创建的 AWS KMS 密钥尚不存在,因此 ARN 无法在引导模板上引用该密钥。此外,在设置此标志后,Security Hub 不会考虑 Condition 子句。此 ConditionResource: * 进行限制,使其仅限于从 AWS KMS 密钥的同一 AWS 账户发出的请求。这些请求必须来自与 AWS KMS 密钥位于同一 AWS 区域的 Amazon S3。

是否需要修复此调查发现?

只要您未将引导模板上的 AWS KMS 密钥修改得过于宽松,部署角色就不会允许超过其需要的访问权限。因此,没有必要修复此调查发现。

如果我想修复此调查发现怎么办?

如何修复此调查发现取决于您是否使用 CDK 管线进行跨账户部署。

修复 Security Hub 调查发现并使用 CDK 管线进行跨账户部署
  1. 如果尚未使用 cdk bootstrap 命令部署 CDK 引导堆栈,请执行此操作。

  2. 如果尚未创建并部署 CDK Pipeline,请执行此操作。有关说明,请参阅使用 CDK 管线进行持续集成和交付 (CI/CD)

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

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

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

  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 CDK 结合使用时,可能会产生 AWS 费用。