这是 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 bootstrap
从包含cdk.json
文件的CDK项目的父目录中运行。如果你没有提供环境作为参数,那么 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 ,请参阅 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 权限。此角色授予在您的账户中执行 AWS API调用的 CloudFormation 权限,包括部署堆栈。
通过使用服务角色,为该服务角色配置的权限决定了可以对您的 CloudFormation 资源执行哪些操作。如果没有此服务角色,则您提供的安全凭证 CDK CLI 将决定允许做什么 CloudFormation 。
DeploymentActionRole
-
此IAM角色授予在您的环境中执行部署的权限。这是由假设的 CDK CLI 在部署期间。
通过使用角色进行部署,您可以执行跨账户部署,因为该角色可以由不同账户中的 AWS 身份担任。
FilePublishingRole
-
此IAM角色授予对已启动的亚马逊简单存储服务 (Amazon S3) 存储桶执行操作的权限,包括上传和删除资产。这是由假设的 CDK CLI 在部署期间。
ImagePublishingRole
-
此IAM角色授予对已启动的亚马逊弹性容器注册表 (AmazonECR) 存储库执行操作的权限。这是由假设的 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": "*" } ] }
随着时间的推移,引导堆栈(包括创建的资源及其所需的权限)可能会发生变化。对于 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 。添加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 | 现在 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 | 为文件发布角色添加条件。 |
22 | 2.160.0 | 向引导IAM角色的信任策略添加sts:TagSession 权限。 |
23 | 2.161.0 | 向部署IAM角色的信任策略添加cloudformation:RollbackStack 和cloudformation:ContinueUpdateRollback 权限。这为cdk
rollback 命令提供了权限。 |
从传统引导模板升级到现代引导模板
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管道进行跨账户部署
-
如果您尚未执行此操作,请使用
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
语句替换Resource: *
为您的ARN值来修改模板。 -
部署模板以更新您的引导堆栈。以下是一个示例,使用 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