

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

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

# 部署 AWS CDK 应用程序
<a name="deploy"></a>

Cl AWS oud Development Kit (AWS CDK) 部署是在上 AWS配置基础架构的过程。

## AWS CDK 部署的工作原理
<a name="deploy-how"></a>

 AWS CDK 利用该 AWS CloudFormation 服务执行部署。在部署之前，您需要合成 CDK 堆栈。这将为应用程序中的每个 CDK 堆栈创建一个 CloudFormation 模板和部署工件。部署是从本地开发计算机或*持续集成和持续交付 (CI/CD)* 环境中启动的。在部署期间，资产将上传到引导资源中，然后将 CloudFormation 模板提交 CloudFormation 到以配置您的 AWS 资源。

要成功部署，需要满足以下条件：
+ 必须为 AWS CDK 命令行界面 (AWS CDK CLI) 提供有效的权限。
+ 必须对 AWS 环境进行引导。
+  AWS CDK 必须知道要将资源上传到哪些引导资源。

## CDK 部署的先决条件
<a name="deploy-prerequisites"></a>

在部署 AWS CDK 应用程序之前，必须完成以下操作：
+ 为 CDK CLI 配置安全凭证。
+ 引导您的 AWS 环境。
+ 为每个 CDK 堆栈配置 AWS 环境。
+ 开发 CDK 应用程序。<a name="deploy-prerequisites-creds"></a>

 **配置安全证书**   
要使用 CDK CLI 进行交互 AWS，您必须在本地计算机上配置安全证书。有关说明，请参阅[为 AWS CDK CLI 配置安全证书](configure-access.md)。<a name="deploy-prerequisites-bootstrap"></a>

 **引导您的环境 AWS **   
部署始终与一个或多个 AWS [环境](environments.md)关联。您必须先[引导](bootstrapping.md)环境，然后才能进行部署。引导会在您的环境中预置资源，CDK 使用这些资源来执行和管理部署。这些资源包括 Amazon Simple Storage Service（Amazon S3）存储桶和 Amazon Elastic Container Registry（Amazon ECR）存储库，用于存储和管理[资产](assets.md)。这些资源还包括 AWS 身份和访问管理 (IAM) Access Management 角色，这些角色用于在开发和部署期间提供权限。  
我们建议您使用 AWS CDK 命令行界面 (AWS CDK CLI) `cdk bootstrap` 命令来引导您的环境。如有必要，您可以自定义引导或在环境中手动创建这些资源。有关说明，请参阅[引导您的环境以与 AWS CDK 配合使用](bootstrapping-env.md)。<a name="deploy-prerequisites-env"></a>

 **配置 AWS 环境**   
每个 CDK 堆栈都必须与环境相关联，才能确定堆栈的部署位置。有关说明，请参阅[配置要与 AWS CDK 配合使用的环境](configure-env.md)。<a name="deploy-prerequisites-develop"></a>

 **开发你的 CDK 应用程序**   
在 CDK [项目](projects.md)中，您可以创建和开发 CDK 应用程序。在应用程序中，您可以创建一个或多个 CDK [堆栈](stacks.md)。在堆栈中，您可以导入并使用[构造库中的 AWS 构](constructs.md)造来定义您的基础架构。CDK 应用程序必须至少包含一个堆栈，然后才能进行部署。

## CDK 应用程序合成
<a name="deploy-how-synth"></a>

要执行合成，我们建议您使用 CDK CLI `cdk synth` 命令。在启动部署之前，`cdk deploy` 命令还会执行合成。但是，通过使用 `cdk synth`，您可以在启动部署之前验证 CDK 应用程序并捕获错误。

合成行为由您为 CDK 堆栈配置的[堆栈合成器](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#stack-synthesizers)决定。如果您未配置合成器，将使用 ` [DefaultStackSynthesizer](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.DefaultStackSynthesizer.html) `。您还可以配置和自定义合成以满足您的需求。有关说明，请参阅[配置和执行 CDK 堆栈合成](configure-synth.md)。

为了使您的合成 CloudFormation 模板成功部署到您的环境中，它必须与您的环境的引导方式兼容。例如，您的 CloudFormation 模板必须指定要将资产部署到的正确的 Amazon S3 存储桶。如果您使用默认的引导环境方法，则默认堆栈合成器将起作用。如果您自定义 CDK 行为（例如自定义引导或合成），CDK 部署行为可能会有所不同。<a name="deploy-how-synth-app"></a>

 **应用程序生命周期**   
当您执行合成时，CDK 应用程序将经历以下阶段，称为*应用程序生命周期*：    
 **构造（或初始化）**   
代码会实例化所有已定义的构造，然后将它们链接在一起。在此阶段，所有构造（应用程序、堆栈及其子构造）都会被实例化，并运行构造函数链。大部分应用程序代码都在此阶段运行。  
 **准备**   
所有实现了 `prepare` 方法的构造都将参与最后一轮的修改，以设置其最终状态。准备阶段自动进行。作为用户，您不会看到此阶段的任何反馈。很少情况需要使用“准备”钩子，通常不建议使用。在此阶段变更构造树时要非常谨慎，因为操作顺序可能会影响行为。  
在此阶段，一旦构建了构造树，也将应用您配置的所有[方面](aspects.md)。  
 **验证**   
所有实现了 `validate` 方法的构造都可以自行验证，以确保它们处于正确部署的状态。您将收到在此阶段发生的任何验证失败的通知。通常，我们建议尽快执行验证（通常是在收到一些输入后立即执行），并尽早抛出异常。尽早执行验证可以提高可靠性，因为堆栈跟踪将更加准确，并确保可以继续安全执行代码。  
 **合成**   
这是运行 CDK 应用程序的最后阶段。该阶段由调用 `app.synth()` 触发，遍历构造树并在所有构造上调用 `synthesize` 方法。实现 `synthesize` 的构造可以参与合成并为生成的云程序集生成部署构件。这些工件包括 CloudFormation 模板、 AWS Lambda 应用程序捆绑包、文件和 Docker 映像资产以及其他部署项目。在大多数情况下，您无需实现 `synthesize` 方法。<a name="deploy-how-synth-run"></a>

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

**Example**  

```
{
  "app": "npx ts-node --prefer-ts-exts bin/my-app.ts"
}
```

```
{
  "app": "node bin/my-app.js"
}
```

```
{
    "app": "python app.py"
}
```

```
{
  "app": "mvn -e -q compile exec:java"
}
```

```
{
  "app": "dotnet run -p src/MyApp/MyApp.csproj"
}
```

```
{
  "app": "go mod download && go run my-app.go"
}
```
如果您不是使用 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
```<a name="deploy-how-synth-assemblies"></a>

 **云端程序集**   
调用`app.synth()`是让 AWS CDK 从应用程序合成云程序集的原因。通常，您不会直接与云程序集交互。云程序集是包含将应用程序部署到云环境所需的所有内容的文件。例如，它包含应用程序中每个堆栈的 AWS CloudFormation 模板。它还包括您在应用程序中引用的任何文件资产或 Docker 映像的副本。  
有关如何格式化云程序集的详细信息，请参阅[云程序集规范](https://github.com/aws/aws-cdk-cli/blob/main/packages/%40aws-cdk/cloud-assembly-schema/README.md)。  
要与您的 AWS CDK 应用程序创建的云程序集进行交互，您通常使用 AWS CDK CLI。但是，任何可以读取云程序集格式的工具都可用于部署应用程序。

## 部署您的应用程序
<a name="deploy-how-deploy"></a>

要部署应用程序，我们建议您使用 CDK CLI `cdk deploy` 命令启动部署或配置自动部署。

运行 `cdk deploy` 时，CDK CLI 会启动 `cdk synth` 来为部署做准备。下图说明了部署上下文中的应用程序生命周期：

![<shared id="AWS"/> CDK 应用程序生命周期的流程图。](http://docs.aws.amazon.com/zh_cn/cdk/v2/guide/images/app-lifecycle_cdk-flowchart.png)


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

 AWS CloudFormation 部署阶段开始时，您的 CDK 应用程序已经完成运行并退出。这具有以下意义：
+ CDK 应用程序无法响应部署期间发生的事件，例如正在创建资源或整个部署已完成。要在部署阶段运行代码，必须将其作为[自定义资源](cfn-layer.md#develop-customize-custom)注入 AWS CloudFormation 模板中。有关向应用程序添加自定义资源的更多信息，请参阅 [AWS CloudFormation 模块](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudformation-readme.html)或[自定义资源](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/custom-resource/)示例。您也可以将[触发器](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.triggers-readme.html)模块配置为在部署期间运行代码。
+ CDK 应用程序可能需要使用运行时无法知道的值。例如，如果 AWS CDK 应用程序使用自动生成的名称定义了一个 Amazon S3 存储桶，而您检索了 `bucket.bucketName` (Python:`bucket_name`) 属性，则该值不是已部署存储桶的名称。您会得到 `Token` 值。要确定特定值是否可用，请调用 `cdk.isUnresolved(value)`（Python：`is_unresolved`）。有关详细信息，请参阅[代币和 AWS CDK](tokens.md)。<a name="deploy-how-deploy-permissions"></a>

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

![默认 <shared id="AWS"/> CDK 部署过程的流程图。](http://docs.aws.amazon.com/zh_cn/cdk/v2/guide/images/default-deploy-process_cdk_flowchart.png)
  
 **Actor 启动部署**   
部署由*角色*使用 CDK CLI 启动。演员可以是一个人，也可以是一个服务，例如 AWS CodePipeline。  
如有必要，CDK CLI 会在您运行 `cdk deploy` 时运行 `cdk synth`。在合成过程中， AWS 身份假设`LookupRole`在 AWS 环境中执行上下文查找。  
 **权限已建立**   
首先，使用参与者的安全证书对流程中的第一个 IAM 身份进行身份验证 AWS 并获取第一个 IAM 身份。对于人类角色，如何配置和获取安全凭证取决于您或您的组织如何管理用户。有关更多信息，请参阅[为 AWS CDK CLI 配置安全证书](configure-access.md)。对于服务参与者，例如 CodePipeline，假设并使用 IAM 执行角色。  
接下来，使用引导期间在您的 AWS 环境中创建的 IAM 角色来建立执行部署所需操作的权限。有关这些角色及其所授予的权限的更多信息，请参阅[在引导期间创建的 IAM 角色](bootstrapping-env.md#bootstrapping-env-roles)。此过程包括以下内容：  
+  AWS 身份代入`DeploymentActionRole`角色并将角色传递给 CloudFormation，从而确保该 CloudFormation 身份在您的 AWS 环境中执行任何操作时代入该角色。`CloudFormationExecutionRole` `DeploymentActionRole`授予在您的环境中执行部署的权限并`CloudFormationExecutionRole`确定 CloudFormation 可以执行哪些操作。
+ 该 AWS 身份假定为`FilePublishingRole`，这决定了可以在引导期间创建的 Amazon S3 存储桶上执行的操作。
+ 该 AWS 身份假定为`ImagePublishingRole`，这决定了可以在引导期间创建的 Amazon ECR 存储库上执行的操作。
+ 如有必要， AWS 身份会`LookupRole`假定在 AWS 环境中执行上下文查找。此操作也可以在模板合成期间执行。  
 **已执行部署**   
在部署期间，CDK CLI 会读取引导版本参数以确认引导版本号。 AWS CloudFormation 还会在部署时读取此参数进行确认。如果整个部署工作流的权限都有效，则会执行部署。资产将上传到引导资源中，合成时生成的 CloudFormation 模板将使用 CloudFormation 服务作为 CloudFormation 堆栈进行部署，以配置您的资源。