这是 AWS CDK v2 开发人员指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
部署 AWS CDK 应用程序
AWS 云开发工具包 (AWS CDK) 部署是在 AWS 上预置基础设施的过程。
AWS CDK 部署的工作原理
AWS CDK 利用 AWS CloudFormation 服务执行部署。在部署之前,您需要合成 CDK 堆栈。这会为应用程序中的每个 CDK 堆栈创建 CloudFormation 模板和部署构件。部署从本地开发计算机或持续集成和持续交付(CI/CD)环境启动。在部署过程中,资产会上传到引导的资源,并且 CloudFormation 模板会提交到 CloudFormation 以预置 AWS 资源。
要成功部署,需要满足以下条件:
-
必须为 AWS CDK 命令行界面 (AWS CDK CLI) 提供有效的权限。
-
必须对 AWS 环境进行引导。
-
AWS CDK 必须知道要将资产上传到的引导资源。
CDK 部署的先决条件
您必须先完成以下步骤,然后才能部署 AWS CDK 应用程序:
-
为 CDK CLI 配置安全凭证。
-
引导 AWS 环境。
-
为每个 CDK 堆栈配置 AWS 环境。
-
开发 CDK 应用程序。
- 配置安全凭证
-
要使用 CDK CLI 与 AWS 进行交互,您必须在本地计算机上配置安全凭证。有关说明,请参阅为 AWS CDK CLI 配置安全凭证。
- 引导 AWS 环境
-
部署始终与一个或多个 AWS 环境关联。您必须先引导环境,然后才能进行部署。引导会在您的环境中预置资源,CDK 使用这些资源来执行和管理部署。这些资源包括 Amazon Simple Storage Service(Amazon S3)存储桶和 Amazon Elastic Container Registry(Amazon ECR)存储库,用于存储和管理资产。这些资源还包括用于在开发和部署期间提供权限的 AWS Identity and Access Management (IAM) 角色。
我们建议您使用 AWS CDK 命令行界面 (AWS CDK CLI)
cdk bootstrap命令来引导环境。如有必要,您可以自定义引导或在环境中手动创建这些资源。有关说明,请参阅引导环境以用于 AWS CDK。
- 配置 AWS 环境
-
每个 CDK 堆栈都必须与环境相关联,才能确定堆栈的部署位置。有关说明,请参阅配置可使用 AWS CDK 的环境。
CDK 应用程序合成
要执行合成,我们建议您使用 CDK CLI cdk synth 命令。在启动部署之前,cdk deploy 命令还会执行合成。但是,通过使用 cdk synth,您可以在启动部署之前验证 CDK 应用程序并捕获错误。
合成行为由您为 CDK 堆栈配置的堆栈合成器决定。如果您未配置合成器,将使用
DefaultStackSynthesizer
。您还可以配置和自定义合成以满足您的需求。有关说明,请参阅配置和执行 CDK 堆栈合成。
为了使合成的 CloudFormation 模板成功部署到环境中,它必须与环境的引导方式兼容。例如,CloudFormation 模板必须指定要将资产部署到的正确的 Amazon S3 存储桶。如果您使用默认的引导环境方法,则默认堆栈合成器将起作用。如果您自定义 CDK 行为(例如自定义引导或合成),CDK 部署行为可能会有所不同。
- 应用程序生命周期
-
当您执行合成时,CDK 应用程序将经历以下阶段,称为应用程序生命周期:
- 构造(或初始化)
-
代码会实例化所有已定义的构造,然后将它们链接在一起。在此阶段,所有构造(应用程序、堆栈及其子构造)都会被实例化,并运行构造函数链。大部分应用程序代码都在此阶段运行。
- 准备
-
所有实现了
prepare方法的构造都将参与最后一轮的修改,以设置其最终状态。准备阶段自动进行。作为用户,您不会看到此阶段的任何反馈。很少情况需要使用“准备”钩子,通常不建议使用。在此阶段变更构造树时要非常谨慎,因为操作顺序可能会影响行为。在此阶段,一旦构建了构造树,也将应用您配置的所有方面。
- 验证
-
所有实现了
validate方法的构造都可以自行验证,以确保它们处于正确部署的状态。您将收到在此阶段发生的任何验证失败的通知。通常,我们建议尽快执行验证(通常是在收到一些输入后立即执行),并尽早抛出异常。尽早执行验证可以提高可靠性,因为堆栈跟踪将更加准确,并确保可以继续安全执行代码。 - 合成
-
这是运行 CDK 应用程序的最后阶段。该阶段由调用
app.synth()触发,遍历构造树并在所有构造上调用synthesize方法。实现synthesize的构造可以参与合成并为生成的云程序集生成部署构件。这些项目包括 CloudFormation 模板、AWS Lambda 应用程序捆绑包、文件和 Docker 映像资产以及其他部署构件。在大多数情况下,您无需实现synthesize方法。
- 运行应用程序
-
CDK CLI 需要知道如何运行 CDK 应用程序。如果您使用
cdk init命令从模板创建项目,则应用程序的cdk.json文件会包含app键。该键为编写应用程序采用的语言指定必要的命令。如果您的语言需要编译,则命令行会在自动运行应用程序之前执行此步骤。如果您不是使用 CDK CLI 创建项目,或者想要覆盖
--app中给出的命令行,则可以在运行cdk命令时提供cdk.json选项。
$ cdk --app '<executable>' <cdk-command> ...
命令的 <executable> 部分指示应运行哪个命令来执行 CDK 应用程序。如图所示使用引号,因为此类命令包含空格。<cdk-command> 是一个类似于 synth 或 deploy 的子命令,它告知 CDK CLI 您希望应用程序执行哪些操作。接下来是该子命令所需的任何其他选项。
CDK CLI 还可以直接与已经合成的云程序集进行交互。为此,请传递 --app 中存储的云程序集所在的目录。以下示例列出了存储在 ./my-cloud-assembly 下的云程序集中定义的堆栈。
$ cdk --app <./my-cloud-assembly> ls
- 云程序集
-
调用
app.synth()是告知 AWS CDK 从应用程序合成云程序集。通常,您不会直接与云程序集交互。云程序集是包含将应用程序部署到云环境所需的所有内容的文件。例如,它包括应用程序中每个堆栈的 AWS CloudFormation 模板。它还包括您在应用程序中引用的任何文件资产或 Docker 映像的副本。有关如何格式化云程序集的详细信息,请参阅云程序集规范
。 要与 AWS CDK 应用程序创建的云程序集进行交互,您通常使用 AWS CDK CLI。但是,任何可以读取云程序集格式的工具都可用于部署应用程序。
部署您的应用程序
要部署应用程序,我们建议您使用 CDK CLI cdk deploy 命令启动部署或配置自动部署。
运行 cdk deploy 时,CDK CLI 会启动 cdk synth 来为部署做准备。下图说明了部署上下文中的应用程序生命周期:
在部署过程中,CDK CLI 会获取合成生成的云程序集并将其部署到 AWS 环境中。资产会上传到 Amazon S3 和 Amazon ECR,并且 CloudFormation 模板会提交到 AWS CloudFormation 进行部署。
当 AWS CloudFormation 部署阶段开始时,CDK 应用程序已完成运行并退出。这具有以下意义:
-
CDK 应用程序无法响应部署期间发生的事件,例如正在创建资源或整个部署已完成。要在部署阶段运行代码,必须将其作为自定义资源注入 AWS CloudFormation 模板中。有关向应用程序添加自定义资源的更多信息,请参阅 AWS CloudFormation 模块或自定义资源
示例。您也可以将触发器模块配置为在部署期间运行代码。 -
CDK 应用程序可能需要使用运行时无法知道的值。例如,如果 AWS CDK 应用程序使用自动生成的名称定义了 Amazon S3 存储桶,而您检索
bucket.bucketName(Python:bucket_name)属性,则该值不是已部署存储桶的名称。您会得到Token值。要确定特定值是否可用,请调用cdk.isUnresolved(value)(Python:is_unresolved)。有关详细信息,请参阅令牌和 AWS CDK。
- 部署权限
-
必须先建立权限,然后才能执行部署。下图说明了默认部署期间使用默认引导过程和堆栈合成器时使用的权限:
- 角色启动部署
-
部署由角色使用 CDK CLI 启动。角色可以是一个人,也可以是一项服务,例如 AWS CodePipeline。
如有必要,CDK CLI 会在您运行
cdk deploy时运行cdk synth。在合成过程中,AWS 身份担任LookupRole,在 AWS 环境中执行上下文查找。 - 权限已建立
-
首先,使用角色的安全凭证对 AWS 进行身份验证,并在此过程中获取第一个 IAM 身份。对于人类角色,如何配置和获取安全凭证取决于您或您的组织如何管理用户。有关更多信息,请参阅为 AWS CDK CLI 配置安全凭证。对于服务角色(例如 CodePipeline),会担任并使用 IAM 执行角色。
接下来,使用引导期间在 AWS 环境中创建的 IAM 角色来建立执行部署所需操作的权限。有关这些角色及其所授予的权限的更多信息,请参阅在引导期间创建的 IAM 角色。此过程包括以下内容:
-
AWS 身份担任
DeploymentActionRole角色并将CloudFormationExecutionRole角色传递给 CloudFormation,从而确保 CloudFormation 在 AWS 环境中执行任何操作时担任该角色。DeploymentActionRole用于授予在您的环境中执行部署的权限,CloudFormationExecutionRole用于确定 CloudFormation 可以执行哪些操作。 -
AWS 身份担任
FilePublishingRole,用于确定可对引导期间创建的 Amazon S3 存储桶执行的操作。 -
AWS 身份担任
ImagePublishingRole,用于确定可对引导期间创建的 Amazon ECR 存储库执行的操作。 -
如有必要,AWS 身份担任
LookupRole,在 AWS 环境中执行上下文查找。此操作也可以在模板合成期间执行。
-
- 部署已执行
-
在部署期间,CDK CLI 会读取引导版本参数以确认引导版本号。AWSCloudFormation 也会在部署时读取此参数以进行确认。如果整个部署工作流的权限都有效,则会执行部署。资产会上传到引导资源中,合成时生成的 CloudFormation 模板会使用 CloudFormation 服务作为 CloudFormation 堆栈进行部署以预置资源。