部署 AWS CDK 应用程序 - AWS Cloud Development Kit (AWS CDK) v2

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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

部署 AWS CDK 应用程序

AWS Cloud Development Kit (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 应用程序之前,必须完成以下操作:

  • 为配置安全证书CDKCLI。

  • 引导您的 AWS 环境。

  • 为每个CDK堆栈配置 AWS 环境。

  • 开发您的CDK应用程序。

配置安全证书

要使用与CDKCLI进行交互 AWS,您必须在本地计算机上配置安全证书。有关说明,请参阅 为配置安全证书 AWS CDKCLI

引导您的环境 AWS

部署始终与一个或多个 AWS 环境相关联。在部署之前,必须先对环境进行引导。Bootstrapping 会在您的环境中配置CDK用于执行和管理部署的资源。这些资源包括用于存储和管理资产的亚马逊简单存储服务 (Amazon S3) Service 存储桶和亚马逊弹性容器注册表 (ECRAmazon) 存储库。这些资源还包括 AWS Identity and Access Management (IAM) 角色,这些角色用于在开发和部署期间提供权限。

我们建议您使用 AWS CDK 命令行界面 (AWS CDK CLI) cdk bootstrap 命令来引导您的环境。如有必要,您可以自定义引导或在您的环境中手动创建这些资源。有关说明,请参阅 引导您的环境以用于 AWS CDK

配置 AWS 环境

每个CDK堆栈都必须与环境相关联才能确定堆栈的部署位置。有关说明,请参阅 配置要与... 一起使用的环境 AWS CDK

开发您的CDK应用程序

在CDK项目中,您可以创建和开发您的CDK应用程序。在您的应用程序中,您可以创建一个或多个CDK堆栈。在堆栈中,您可以导入并使用构造库中的 AWS 构造来定义您的基础架构。在部署之前,您的CDK应用程序必须至少包含一个堆栈。

CDK应用程序合成

要执行合成,我们建议您使用CDKCLIcdk 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方法。

运行你的应用程序

CDKCLI需要知道如何运行您的CDK应用程序。如果您使用cdk init命令从模板创建项目,则您的应用程序cdk.json文件将包含app密钥。此键为编写应用程序的语言指定必要的命令。如果您的语言需要编译,则命令行会在自动运行应用程序之前执行此步骤。

TypeScript
{ "app": "npx ts-node --prefer-ts-exts bin/my-app.ts" }
JavaScript
{ "app": "node bin/my-app.js" }
Python
{ "app": "python app.py" }
Java
{ "app": "mvn -e -q compile exec:java" }
C#
{ "app": "dotnet run -p src/MyApp/MyApp.csproj" }
Go
{ "app": "go mod download && go run my-app.go" }

如果您没有使用创建项目 CDKCLI,或者想要覆盖中给出的命令行cdk.json,则可以在运行cdk命令时提供--app选项。

$ cdk --app 'executable' cdk-command ...

这些区域有:executable 命令的一部分表示应运行哪个命令来执行您的CDK应用程序。如图所示使用引号,因为此类命令包含空格。这些区域有:cdk-command 是类似synth或的子命令deploy,它告诉你想用你的应用程序做CDKCLI什么。接下来是该子命令所需的任何其他选项。

CDKCLI也可以直接与已经合成的云组件进行交互。为此,请传递存储云程序集的目录--app。以下示例列出了存储在下的./my-cloud-assembly云组件中定义的堆栈。

$ cdk --app ./my-cloud-assembly ls

云端程序集

调用app.synth()是告诉从 AWS CDK 应用程序合成云程序集的原因。通常,您不会直接与云程序集交互。这些文件包含将应用程序部署到云环境所需的一切。例如,它包含应用程序中每个堆栈的 AWS CloudFormation 模板。它还包括您在应用程序中引用的任何文件资源或Docker图像的副本。

有关如何格式化云程序集的详细信息,请参阅云装配规范

要与您的 AWS CDK 应用程序创建的云程序集进行交互,您通常使用 AWS CDK CLI. 但是,任何可以读取云端汇编格式的工具都可用于部署您的应用程序。

部署您的应用程序

要部署应用程序,我们建议您使用CDKCLIcdk deploy命令启动部署或配置自动部署。

当你运行时cdk deploy,CDKCLI启动cdk synth准备部署。下图说明了部署环境中的应用程序生命周期:

AWS CDK 应用程序生命周期流程图。

在部署过程中,CDKCLI获取合成生成的云程序集并将其部署到 AWS 环境中。资产将上传到 Amazon S3 ECR 和 Amazon,然后将 CloudFormation 模板提交到 AWS CloudFormation 进行部署。

AWS CloudFormation 部署阶段开始时,您的CDK应用程序已经完成运行并退出。这具有以下意义:

  • CDK应用程序无法响应部署期间发生的事件,例如正在创建的资源或整个部署已完成。要在部署阶段运行代码,必须将其作为自定义资源注入 AWS CloudFormation 模板中。有关向应用程序添加自定义资源的更多信息,请参阅AWS CloudFormation 模块自定义资源示例。您也可以将 T riggers 模块配置为在部署期间运行代码。

  • CDK应用程序可能必须使用在运行时无法知道的值。例如,如果 AWS CDK 应用程序使用自动生成的名称定义了一个 Amazon S3 存储桶,而您检索了 bucket.bucketName (Python:bucket_name) 属性,则该值不是已部署存储桶的名称。相反,你会得到一个Token值。要确定特定值是否可用,请调用 cdk.isUnresolved(value) (Python:is_unresolved)。有关详细信息,请参阅 代币和 AWS CDK

部署权限

必须先建立权限,然后才能执行部署。下图说明了默认部署期间使用默认引导过程和堆栈合成器时使用的权限:

默认 AWS CDK 部署过程的流程图。
Actor 启动部署

部署由参与者起,使用CDKCLI。演员可以是一个人,也可以是一个服务,例如 AWS CodePipeline。

如有必要,它们CDKCLI会在你运行cdk synth时运行cdk deploy。在合成过程中, AWS 身份假设LookupRole在 AWS 环境中执行上下文查找。

权限已建立

首先,使用行为者的安全凭证对流程中的第一个身份进行IAM身份验证 AWS 并获取第一个身份。对于人类行为者,如何配置和获取安全证书取决于您或您的组织如何管理用户。有关更多信息,请参阅 为配置安全证书 AWS CDKCLI。对于服务参与者,例如 CodePipeline,假设并使用IAM执行角色。

接下来,使用引导期间在您的 AWS 环境中创建的IAM角色来建立执行部署所需操作的权限。有关这些角色及其为哪些角色授予权限的更多信息,请参阅IAM在引导过程中创建的角色。此过程包括以下内容:

  • AWS 身份代入DeploymentActionRole角色并将角色传递给 CloudFormation,从而确保该 CloudFormation 身份在您的 AWS 环境中执行任何操作时代入该角色。CloudFormationExecutionRole DeploymentActionRole授予在您的环境中执行部署的权限并CloudFormationExecutionRole确定 CloudFormation 可以执行哪些操作。

  • 该 AWS 身份假定为FilePublishingRole,这决定了可以在引导期间创建的 Amazon S3 存储桶上执行的操作。

  • 该 AWS 身份假定为ImagePublishingRole,这决定了可以在引导期间创建的 Amazon ECR 存储库上执行的操作。

  • 如有必要, AWS 身份会LookupRole假定在 AWS 环境中执行上下文查找。此操作也可以在模板合成期间执行。

部署已执行

在部署期间,CDKCLI读取引导版本参数以确认引导版本号。 AWS CloudFormation 还会在部署时读取此参数进行确认。如果整个部署工作流程的权限有效,则会执行部署。资产将上传到引导资源中,合成时生成的 CloudFormation 模板将使用 CloudFormation 服务作为 CloudFormation 堆栈进行部署,以配置您的资源。