

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

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

# AWS CDK CLI 参考文档
<a name="cli"></a>

 AWS 云开发套件 (AWS CDK) 命令行界面 (AWS CDK CLI)，也称为 CDK 工具包，是与 CDK 应用程序 AWS 交互的主要工具。它执行您的应用程序，查询您定义的应用程序模型，并生成和部署 CDK 生成的 AWS CloudFormation 模板。 AWS 它还提供了其他对创建和处理 AWS CDK 项目有用的功能。本主题包含有关 CDK CLI 常见使用案例的信息。

CDK CLI 与节点程序包管理器一起安装。大多数情况下，我们建议在全局范围内安装。

```
npm install -g aws-cdk             # install latest version
npm install -g aws-cdk@X.YY.Z      # install specific version
```

**提示**  
如果您经常使用多个版本的 AWS CDK，请考虑在单个 CDK 项目中安装匹配版本的 CDK CLI。为此，请在 `npm install` 命令中省略 `-g`。然后使用 `npx aws-cdk` 来调用它。如果存在本地版本，则运行本地版本；如果不存在，则回退到全局版本。

## CDK CLI 命令
<a name="cli-commands"></a>

所有 CDK CLI 命令都以 `list` 开头，后跟子命令（`cdk`、`synthesize`、`deploy` 等）。一些子命令具有等效的简短版本（`ls`、`synth` 等）。选项和参数按任意顺序跟在子命令之后。

有关所有子命令、选项和参数的说明，请参阅 [AWS CDK CLI 命令参考](ref-cli-cmd.md)。

## 指定选项及其值
<a name="cli-options"></a>

命令行选项以两个连字符（`--`）开头。一些常用的选项具有以单个连字符开头的单字母同义词（例如，`--app` 具有同义词 `-a`）。CDK CLI 命令中选项的顺序并不重要。

所有选项都接受一个值，该值必须跟在选项名称之后。该值可以用空格或等号 `=` 与名称隔开。以下两个选项是等效的。

```
--toolkit-stack-name MyBootstrapStack
--toolkit-stack-name=MyBootstrapStack
```

有些选项是标志（布尔值）。您可以指定 `true` 或 `false` 作为它们的值。如果您未提供值，则该值被认为是 `true`。您还可以在选项名称前加上前缀 `no-` 来表示 `false`。

```
# sets staging flag to true
--staging
--staging=true
--staging true

# sets staging flag to false
--no-staging
--staging=false
--staging false
```

您可以多次指定几个选项（即 `--context`、`--parameters`、`--plugin`、`--tags` 和 `--trust`）以指定多个值。在 CDK CLI 帮助中注明这些选项具有 `[array]` 类型。例如：

```
cdk bootstrap --tags costCenter=0123 --tags responsibleParty=jdoe
```

## Built-in 帮帮我
<a name="cli-help"></a>

CDK CLI 集成了帮助。您可以通过发出以下命令来查看有关实用程序的一般帮助和所提供的子命令列表：

```
cdk --help
```

要查看特定子命令（例如 `deploy`）的帮助，请在 `--help` 标志之前指定该子命令。

```
cdk deploy --help
```

发出 `cdk version` 以显示 CDK CLI 的版本。在请求支持时提供此信息。

## 版本报告
<a name="version-reporting"></a>

为了深入了解 AWS CDK 的使用方式，使用标识为的资源收集和报告 AWS CDK 应用程序使用的结构。` AWS::CDK::Metadata`要了解更多信息，请参阅[配置 AWS CDK 使用情况数据报告](usage-data.md)。

## 使用进行身份验证 AWS
<a name="cli-auth"></a>

您可以通过不同的方式配置对 AWS 资源的编程访问，具体取决于环境和可用的 AWS 访问权限。

要选择身份验证方法并将其配置为 CDK CLI，请参阅[为 CDK CLI 配置安全证书。 AWS](configure-access.md)

对于在本地开发的新用户，如果雇主没有提供身份验证方法，推荐的方法是设置 AWS IAM 身份中心。此方法包括安装 AWS CLI 以简化配置和定期登录 AWS 访问门户。如果您选择此方法，则在完成《软件开发工具包和* AWS 工具参考指南*》[中的 IAM 身份中心身份验证](https://docs.aws.amazon.com/sdkref/latest/guide/access-sso.html)过程后，您的环境应包含以下元素：
+ C AWS LI，用于在运行应用程序之前启动 AWS 访问门户会话。
+ 一个[共享 AWS 配置文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)，`[default]`其配置文件包含一组可从 AWS CDK 引用的配置值。要查找此文件的位置，请参阅《软件开发工具包和* AWS 工具参考指南*》[中的共享文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-location.html)的位置。
+ 共享的 `config` 文件设置 [region](https://docs.aws.amazon.com/sdkref/latest/guide/feature-region.html) 设置。这会设置 AWS CDK 和 CDK CLI 用于 AWS 请求的默认 AWS 区域。
+ 在向 AWS发送请求之前，CDK CLI 使用该配置文件的 [SSO 令牌提供程序配置](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sso-credentials.html#feature-sso-credentials-profile)来获取凭证。该`sso_role_name`值是与 IAM 身份中心权限集相关的 IAM 角色，应允许访问您的应用程序中使用的 AWS 服务。

  以下示例 `config` 文件展示了使用 SSO 令牌提供程序配置来设置的默认配置文件。配置文件的 `sso_session` 设置是指所指定的 [`sso-session` 部分](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html#section-session)。该`sso-session`部分包含启动 AWS 访问门户会话的设置。

  ```
  [default]
  sso_session = <my-sso>
  sso_account_id = <111122223333>
  sso_role_name = <SampleRole>
  region = <us-east-1>
  output = <json>
  
  [sso-session <my-sso>]
  sso_region = <us-east-1>
  sso_start_url = <https://provided-domain.awsapps.com/start>
  sso_registration_scopes = sso:account:access
  ```

### 开始一个 AWS 访问门户会话
<a name="accessportal"></a>

在访问 AWS 服务之前，您需要一个有效的 AWS 访问门户会话，让 CDK CLI 使用 IAM 身份中心身份验证来解析证书。根据配置的会话时长，访问权限最终将过期，并且 CDK CLI 将遇到身份验证错误。在 AWS CLI 中运行以下命令登录 AWS 访问门户。

```
aws sso login
```

如果 SSO 令牌提供程序配置使用命名配置文件而不是默认配置文件，则命令为 `aws sso login --profile <NAME>`。使用 `--profile` 选项或 `AWS_PROFILE` 环境变量发出 `cdk` 命令时，也应指定此配置文件。

要测试您是否已经有活动会话，请运行以下 AWS CLI 命令。

```
aws sts get-caller-identity
```

对此命令的响应应该报告共享 `config` 文件中配置的 IAM Identity Center 账户和权限集。

**注意**  
如果您已经拥有活跃的 AWS 访问门户会话并正在运行`aws sso login`，则无需提供证书。  
登录过程可能会提示您允许 AWS CLI 访问您的数据。由于 AWS CLI 建立在 Python 开发工具包之上，因此权限消息可能包含`botocore`名称的变体。

## 指定区域和其他配置
<a name="cli-environment"></a>

CDK CLI 需要知道您要部署到的 AWS 区域以及如何进行 AWS身份验证。这是部署操作以及合成期间检索上下文值所必需的。您的账户和区域共同构成了*环境*。

您可以使用环境变量或在配置文件中指定区域。这些变量和文件与 AWS CLI 和各种 AWS SDK 等其他 AWS 工具使用的变量和文件相同。CDK CLI 会按以下顺序查找此信息。
+ `AWS_DEFAULT_REGION` 环境变量。
+ 在标准 AWS `config`文件中定义并使用`cdk`命令`--profile`选项指定的命名配置文件。
+ 标准 AWS `config`文件的`[default]`部分。

除了在该`[default]`部分中指定 AWS 身份验证和区域外，您还可以添加一个或多个`[profile <NAME>]`部分，其中`<NAME>`是配置文件的名称。有关命名配置文件的更多信息，请参阅《* AWS 软件开发工具包和工具参考指南*》[中的](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)共享配置和凭据文件。

标准 AWS `config`文件位于 `~/.aws/config` (macOS/Linux) 或 `%USERPROFILE%\.aws\config` (Windows)。有关详细信息和备用[位置，请参阅《* AWS 软件开发工具包和工具参考指南*》](https://docs.aws.amazon.com/sdkref/latest/guide/file-location.html)中的共享配置和凭证文件的位置

合成过程中会使用您在 AWS CDK 应用程序中使用堆栈的`env`属性指定的环境。它用于生成特定环境的 AWS CloudFormation 模板，在部署期间，它会覆盖由上述方法之一指定的账户或区域。有关更多信息，请参阅 AWS CDK [ 的](environments.md)环境。

**注意**  
 AWS CDK 使用与其他 AWS 工具和 SDK（包括[AWS 命令行界面）相同的源文件中的证书。](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)但是， AWS CDK 的行为可能与这些工具略有不同。它使用 AWS 软件开发工具包 JavaScript 进行幕后操作。有关为的 AWS 软件开发工具包设置凭证的完整详细信息 JavaScript，请参阅[设置证书](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials.html)。

您可以选择使用 `--role-arn`（或 `-r`）选项来指定应该用于部署的 IAM 角色的 ARN。此角色必须由所使用的 AWS 账户担任。

## 指定应用程序命令
<a name="cli-app-command"></a>

CDK CLI 的许多功能需要合成一个或多个 AWS CloudFormation 模板，这反过来又需要运行您的应用程序。 AWS CDK 支持以多种语言编写的程序。因此，它使用配置选项来指定运行应用程序所需的确切命令。可通过以下两种方式指定此选项。

首先，也是最常见的，可以使用文件 `cdk.json` 中的 `app` 密钥进行指定。它位于您的 AWS CDK 项目的主目录中。使用 `cdk init` 创建新项目时，CDK CLI 会提供相应的命令。例如，这是`cdk.json`来自一个新 TypeScript 项目的内容。

```
{
  "app": "npx ts-node bin/hello-cdk.ts"
}
```

尝试运行应用程序时，CDK CLI 会在当前工作目录中查找 `cdk.json`。因此，您可以在项目的主目录中保持 Shell 打开状态以发出 CDK CLI 命令。

如果在 `./cdk.json` 中找不到应用程序密钥，CDK CLI 还会在 `~/.cdk.json`（即在主目录中）中查找该密钥。如果您通常使用相同语言的 CDK 代码，则在此处添加应用程序命令会很有用。

如果您位于其他目录中，或者要使用 `cdk.json` 之外的命令运行应用程序，请使用 `--app`（或 `-a`）选项进行指定。

```
cdk --app "npx ts-node bin/hello-cdk.ts" ls
```

部署时，您还可以将包含合成云程序集（例如 `cdk.out`）的目录指定为 `--app` 的值。指定的堆栈是从此目录部署的；应用程序不是合成的。

## 指定堆栈
<a name="cli-stacks"></a>

许多 CDK CLI 命令（例如 `cdk deploy`）都适用于应用程序中定义的堆栈。如果应用程序只包含一个堆栈，则当您未明确指定堆栈时，CDK CLI 会假设您指的是该堆栈。

否则，您必须指定要使用的堆栈。您可以通过在命令行上按 ID 单独指定所需的堆栈来实现此目的。请注意，ID 是实例化堆栈时第二个参数指定的值。

```
cdk synth PipelineStack LambdaStack
```

您也可以使用通配符来指定与模式匹配的 ID。
+  `?` 匹配任何单个字符
+  `*` 匹配任意数量的字符（`*` 单独匹配所有堆栈）
+  `**` 匹配层次结构中的所有内容

您也可以使用 `--all` 选项来指定所有堆栈。

如果应用程序使用 [CDK 管线](cdk-pipeline.md)，则 CDK CLI 会将堆栈和阶段理解为一个层次结构。此外，`--all` 选项和 `*` 通配符仅匹配顶级堆栈。要匹配所有堆栈，请使用 `**`。也可以使用 `**` 来表示特定层次结构下的所有堆栈。

使用通配符时，请用引号将模式括起来，或者使用 `\` 转义通配符。如果不这样做，Shell 可能会尝试将模式扩展为当前目录中的文件名。在最好的情况下，后果只是您未达到预期成果；但在最坏的情况下，您可能部署原本不打算部署的堆栈。在 Windows 上，这并不是绝对必要的，因为 `cmd.exe` 不会扩展通配符，但还是不错的做法。

```
cdk synth "*Stack"    # PipelineStack, LambdaStack, etc.
cdk synth 'Stack?'    # StackA, StackB, Stack1, etc.
cdk synth \*          # All stacks in the app, or all top-level stacks in a CDK Pipelines app
cdk synth '**'        # All stacks in a CDK Pipelines app
cdk synth 'PipelineStack/Prod/**'   # All stacks in Prod stage in a CDK Pipelines app
```

**注意**  
您指定堆栈的顺序不一定是处理堆栈的顺序。CDK CLI 在决定处理堆栈的顺序时会考虑堆栈之间的依赖关系。例如，假设一个堆栈使用另一个堆栈生成的值（例如第二个堆栈中定义的资源的 ARN）。在这种情况下，由于这种依赖关系，第二个堆栈会先于第一个堆栈合成。您可以使用堆栈的 ` [addDependency()](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Stack.html#addwbrdependencytarget-reason) ` 方法在堆栈之间手动添加依赖关系。

## 引导你的 AWS 环境
<a name="cli-bootstrap"></a>

使用 CDK 部署堆栈需要配置特殊的专用 AWS CDK 资源。`cdk bootstrap` 命令会为您创建必要的资源。只有在部署需要这些专用资源的堆栈时，才需要引导。有关详细信息，请参阅 [AWS CDK 引导](bootstrapping.md)。

```
cdk bootstrap
```

如果在没有参数的情况下发出（如下所示），则 `cdk bootstrap` 命令会合成当前应用程序并引导其堆栈将部署到的环境。如果应用程序包含与环境无关的堆栈（未明确指定环境），则会引导默认账户和区域，或者使用 `--profile` 指定的环境。

在应用程序之外，您必须明确指定要引导的环境。您也可以这样做来引导应用程序或本地 AWS 配置文件中未指定的环境。您必须为指定的账户和区域配置凭证（例如，在 `~/.aws/credentials` 中）。您可以指定包含所需凭证的配置文件。

```
cdk bootstrap <ACCOUNT-NUMBER>/<REGION> # e.g.
cdk bootstrap 1111111111/us-east-1
cdk bootstrap --profile test 1111111111/us-east-1
```

**重要**  
部署此类堆栈的每个环境（account/region 组合）都必须单独启动。

您可能会因 AWS CDK 在引导资源中存储的内容而产生 AWS 费用。此外，如果您使用`--bootstrap-customer-key`，将创建 AWS KMS 密钥，这也会对每个环境产生费用。

**注意**  
默认情况下，早期版本的引导模板会创建 KMS 密钥。为避免产生费用，请使用 `--no-bootstrap-customer-key` 重新引导。

**注意**  
CDK CLI v2 不支持 CDK v1 中默认使用的原始引导模板（称为旧版模板）。

**重要**  
现代引导模板有效地向`--trust`列表中的任何 AWS 账户授`--cloudformation-execution-policies`予了隐含的权限。默认情况下，这会扩展对引导账户中任何资源的读取和写入权限。请务必使用您熟悉的策略和可信账户来[配置引导堆栈](bootstrapping-customizing.md)。

## 创建新应用程序
<a name="cli-init"></a>

要创建新应用程序，请为其创建一个目录，然后在该目录内发出 `cdk init`。

```
mkdir my-cdk-app
cd my-cdk-app
cdk init <TEMPLATE> --language <LANGUAGE>
```

支持的语言（<LANGUAGE>）包括：


| 代码 | 语言 | 
| --- | --- | 
|  `typescript`  | TypeScript | 
|  `javascript`  | JavaScript | 
|  `python`  | Python | 
|  `java`  | Java | 
|  `csharp`  | C\# | 
|  `Go`  | Go | 

<TEMPLATE> 是一个可选模板。如果所需的模板是 *app*（默认值），则可以省略它。可用的模板包括：


| 模板 | 说明 | 
| --- | --- | 
|  `app`（默认） | 创建一个空的 AWS CDK 应用程序。 | 
|  `sample-app`  | 使用包含亚马逊 SQS 队列和亚马逊 SNS 主题的堆栈创建 AWS CDK 应用程序。 | 

模板使用项目文件夹的名称来生成新应用程序中的文件和类的名称。

## 列出堆栈
<a name="cli-list"></a>

要查看 AWS CDK 应用程序中堆栈的 ID 列表，请输入以下等效命令之一：

```
cdk list
cdk ls
```

如果应用程序包含 [CDK 管线](cdk-pipeline.md)堆栈，则 CDK CLI 会根据堆栈在管线层次结构中的位置将堆栈名称显示为路径。（例如 `PipelineStack`、`PipelineStack/Prod` 和 `PipelineStack/Prod/MyService`。）

如果应用程序包含许多堆栈，则可以指定要列出的堆栈的完整或部分堆栈 ID。有关更多信息，请参阅[指定堆栈](#cli-stacks)。

添加该`--long`标志以查看有关堆栈的更多信息，包括堆栈名称及其环境（AWS 账户和区域）。

## 合成堆栈
<a name="cli-synth"></a>

该`cdk synthesize`命令（几乎总是缩写的`synth`）将应用程序中定义的堆栈合成模板。 CloudFormation 

```
cdk synth         # if app contains only one stack
cdk synth MyStack
cdk synth Stack1 Stack2
cdk synth "*"     # all stacks in app
```

**注意**  
在大多数操作（例如部署或比较堆栈时）之前，CDK CLI 实际上会运行应用程序并合成全新模板。默认情况下，这些模板存储在 `cdk.out` 目录中。`cdk synth` 命令仅会输出一个或多个指定堆栈生成的模板。

有关所有可用选项，请参阅 `cdk synth --help`。以下部分介绍了一些最常用的选项。

### 指定上下文值
<a name="cli-specify-context"></a>

使用 `--context` 或 `-c` 选项将[运行时上下文](context.md)值传递给 CDK 应用程序。

```
# specify a single context value
cdk synth --context key=value MyStack

# specify multiple context values (any number)
cdk synth --context key1=value1 --context key2=value2 MyStack
```

部署多个堆栈时，指定的上下文值通常会传递给所有堆栈。如果需要，可以通过在上下文值前面加上堆栈名称来为每个堆栈指定不同的值。

```
# different context values for each stack
cdk synth --context Stack1:key=value Stack2:key=value Stack1 Stack2
```

### 指定显示格式
<a name="cli-specify-format"></a>

默认情况下，合成后的模板以 YAML 格式显示。添加 `--json` 标志可改为以 JSON 格式显示。

```
cdk synth --json MyStack
```

### 指定输出目录
<a name="cli-specify-output"></a>

添加 `--output`（`-o`）选项，将合成后的模板写入 `cdk.out` 以外的目录。

```
cdk synth --output=~/templates
```

## 部署堆栈
<a name="cli-deploy"></a>

该`cdk deploy`子命令将一个或多个指定的堆栈部署到您的账户。 AWS 

```
cdk deploy        # if app contains only one stack
cdk deploy MyStack
cdk deploy Stack1 Stack2
cdk deploy "*"    # all stacks in app
```

**注意**  
在部署任何内容之前，CDK CLI 会运行您的应用程序并合成新的 AWS CloudFormation 模板。因此，可以与 `cdk synth` 结合使用的大多数命令行选项（例如 `--context`）也可以与 `cdk deploy` 结合使用。

有关所有可用选项，请参阅 `cdk deploy --help`。以下部分介绍了一些最有用的选项。

### 跳过合成
<a name="cli-deploy-nosynth"></a>

`cdk deploy` 命令通常会在部署之前合成应用程序的堆栈，以确保部署反映应用程序的最新版本。如果您知道自上次运行 `cdk synth` 以来没有更改过代码，则可以在部署时取消冗余合成步骤。为此，请在 `--app` 选项中指定项目的 `cdk.out` 目录。

```
cdk deploy --app cdk.out StackOne StackTwo
```

### 禁用回滚
<a name="cli-deploy-norollback"></a>

 AWS CloudFormation 能够回滚更改，从而实现原子部署。这意味着这些部署要么整体成功，要么整体失败。 AWS CDK 之所以继承此功能，是因为它可以合成和部署模板。 AWS CloudFormation 

回滚可确保资源始终处于一致状态，这对于生产堆栈至关重要。但是，当您仍在开发基础设施时，有些故障是不可避免的，而回滚失败的部署可能会减慢速度。

因此，CDK CLI 让您可以通过在 `cdk deploy` 命令中添加 `--no-rollback` 来禁用回滚。使用此标志时，失败的部署不会回滚。相反，在失败资源之前部署的资源会保留在原处，而下一次部署则从失败资源开始。等待部署的时间会更少，开发基础设施的时间会更多。

### 热交换
<a name="cli-deploy-hotswap"></a>

使用带有的`--hotswap`标志`cdk deploy`尝试直接更新您的 AWS 资源，而不是生成 AWS CloudFormation 变更集并部署它。如果无法进行热交换，则 AWS CloudFormation 部署将退回到部署。

目前，热交换支持 Lambda 函数、Step Functions 状态机和 Amazon ECS 容器映像。`--hotswap` 标志还会禁用回滚（即 `--no-rollback`）。

**重要**  
Hot-swapping 不建议用于生产部署。

### 监视模式
<a name="cli-deploy-watch"></a>

CDK CLI 的监视模式（`cdk deploy --watch`，简化为 `cdk watch`）会持续监控 CDK 应用程序的源文件和资产是否发生更改。当检测到更改时，该模式会立即部署指定的堆栈。

默认情况下，这些部署使用 `--hotswap` 标志，该标志可快速跟踪对 Lambda 函数的更改的部署。 AWS CloudFormation 如果您更改了基础架构配置，它也会退回到直通部署。要`cdk watch`始终执行完整 AWS CloudFormation 部署，请将`--no-hotswap`标志添加到`cdk watch`。

`cdk watch` 在已执行部署时所做的任何更改都将合并到一个部署中，该部署会在进行中的部署完成后立即开始。

监视模式使用项目的 `"watch"` 中的 `cdk.json` 键来确定要监控哪些文件。默认情况下，这些文件是应用程序文件和资产，但可以通过修改 `"watch"` 键中的 `"include"` 和 `"exclude"` 条目来更改这些文件和资产。以下 `cdk.json` 文件显示了这些条目的示例。

```
{
  "app": "mvn -e -q compile exec:java",
  "watch": {
    "include": "src/main/**",
    "exclude": "target/*"
  }
}
```

 `cdk watch` 在合成之前执行 `cdk.json` 中的 `"build"` 命令来构建应用程序。如果部署需要任何命令来构建或打包 Lambda 代码（或不在 CDK 应用程序中的任何其他内容），则可在此处添加。

Git-style 通配符（`**`包括`*`和）可以在`"watch"`和`"build"`键中使用。每个路径都是相对于 `cdk.json` 的父目录解释的。`include` 的默认值为 `**/*`，表示项目根目录中的所有文件和目录。`exclude` 是可选的。

**重要**  
不建议对生产部署使用监视模式。

### 请指定 AWS CloudFormation 参数
<a name="cli-specify-parameters"></a>

CDK CLI 支持[在部署时指定 AWS CloudFormation ](parameters.md)参数。您可以在命令行上的 `--parameters` 标志后面提供这些信息。

```
cdk deploy MyStack --parameters uploadBucketName=UploadBucket
```

要定义多个参数，请使用多个 `--parameters` 标志。

```
cdk deploy MyStack --parameters uploadBucketName=UpBucket --parameters downloadBucketName=DownBucket
```

如果要部署多个堆栈，则可以为每个堆栈的每个参数指定不同的值。为此，请在参数名称前加上堆栈名称和冒号。否则，将相同的值传递给所有堆栈。

```
cdk deploy MyStack YourStack --parameters MyStack:uploadBucketName=UploadBucket --parameters YourStack:uploadBucketName=UpBucket
```

默认情况下， AWS CDK 保留先前部署的参数值，如果未明确指定，则在以后的部署中使用它们。使用 `--no-previous-parameters` 标志可要求指定所有参数。

### 指定输出文件
<a name="cli-specify-outputs-file"></a>

如果您的堆栈声明了 AWS CloudFormation 输出，则这些输出通常会在部署结束时显示在屏幕上。要将输出写入 JSON 格式的文件中，请使用 `--outputs-file` 标志。

```
cdk deploy --outputs-file outputs.json MyStack
```

### 批准安全相关的更改
<a name="cli-security"></a>

为了保护您免受可能影响安全状况的意外更改，默认情况下，CDK CLI 会在部署与安全相关的更改之前提示您批准这些更改。您可以指定需要批准的更改级别：

```
cdk deploy --require-approval <LEVEL>
```

 `<LEVEL>` 的值可以是以下值之一：


| 租期 | 含义 | 
| --- | --- | 
|  `never`  | 从不需要批准 | 
|  `any-change`  | 对堆栈进行任何更改都需要获得批准 | 
|  `broadening`（默认） | 如果变更涉及扩大权限或安全组规则，则需要获得批准 | 

也可以在 `cdk.json` 文件中配置该设置。

```
{
  "app": "...",
  "requireApproval": "never"
}
```

## 比较堆栈
<a name="cli-diff"></a>

该`cdk diff`命令将应用程序中定义的堆栈的当前版本（及其依赖关系）与已部署的版本或已保存的 AWS CloudFormation 模板进行比较，并显示更改列表。

```
Stack HelloCdkStack
IAM Statement Changes
┌───┬──────────────────────────────┬────────┬──────────────────────────────┬──────────────────────────────┬───────────┐
│   │ Resource                     │ Effect │ Action                       │ Principal                    │ Condition │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ ${Custom::S3AutoDeleteObject │ Allow  │ sts:AssumeRole               │ Service:lambda.amazonaws.com │           │
│   │ sCustomResourceProvider/Role │        │                              │                              │           │
│   │ .Arn}                        │        │                              │                              │           │
├───┼──────────────────────────────┼────────┼──────────────────────────────┼──────────────────────────────┼───────────┤
│ + │ ${MyFirstBucket.Arn}         │ Allow  │ s3:DeleteObject*             │ {aws}:${Custom::S3AutoDeleteOb │           │
│   │ ${MyFirstBucket.Arn}/*       │        │ s3:GetBucket*                │ jectsCustomResourceProvider/ │           │
│   │                              │        │ s3:GetObject*                │ Role.Arn}                    │           │
│   │                              │        │ s3:List*                     │                              │           │
└───┴──────────────────────────────┴────────┴──────────────────────────────┴──────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────┐
│   │ Resource                                               │ Managed Policy ARN                                     │
├───┼────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────┤
│ + │ ${Custom::S3AutoDeleteObjectsCustomResourceProvider/Ro │ {"Fn::Sub":"arn:${{aws}::Partition}:iam::aws:policy/serv │
│   │ le}                                                    │ ice-role/AWSLambdaBasicExecutionRole"}                 │
└───┴────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Parameters
[+] Parameter AssetParameters/4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392/S3Bucket AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3BucketBF7A7F3F: {"Type":"String","Description":"S3 bucket for asset \"4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392\""}
[+] Parameter AssetParameters/4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392/S3VersionKey AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3VersionKeyFAF93626: {"Type":"String","Description":"S3 key for asset version \"4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392\""}
[+] Parameter AssetParameters/4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392/ArtifactHash AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392ArtifactHashE56CD69A: {"Type":"String","Description":"Artifact hash for asset \"4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392\""}

Resources
[+] {aws}::S3::BucketPolicy MyFirstBucket/Policy MyFirstBucketPolicy3243DEFD
[+] Custom::S3AutoDeleteObjects MyFirstBucket/AutoDeleteObjectsCustomResource MyFirstBucketAutoDeleteObjectsCustomResourceC52FCF6E
[+] {aws}::IAM::Role Custom::S3AutoDeleteObjectsCustomResourceProvider/Role CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092
[+] {aws}::Lambda::Function Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F
[~] {aws}::S3::Bucket MyFirstBucket MyFirstBucketB8884501
 ├─ [~] DeletionPolicy
 │   ├─ [-] Retain
 │   └─ [+] Delete
 └─ [~] UpdateReplacePolicy
     ├─ [-] Retain
     └─ [+] Delete
```

要将应用程序的堆栈与现有部署进行比较，请执行以下操作：

```
cdk diff MyStack
```

要将应用程序的堆栈与保存的 CloudFormation 模板进行比较，请执行以下操作：

```
cdk diff --template ~/stacks/MyStack.old MyStack
```

## 将现有资源导入到堆栈中
<a name="cli-import"></a>

您可以使用该`cdk import`命令将资源置于特定 AWS CDK 堆栈 CloudFormation 的管理之下。如果您要迁移到 AWS CDK，或者在堆栈之间移动资源或更改其逻辑 ID，这很有用。`cdk import`使用[CloudFormation 资源导入。](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html)请参阅[可在此处导入的资源列表](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html)。

要将现有资源导入 AWS CDK 堆栈，请执行以下步骤：
+ 确保该资源当前未由任何其他 CloudFormation 堆栈管理。如果是，请先在资源当前所在的堆栈中将移除策略设置为 `RemovalPolicy.RETAIN` 并执行部署。然后，从堆栈中移除资源并再次执行部署。此过程将确保资源不再由管理， CloudFormation 但不会将其删除。
+ 运行 a`cdk diff`，确保您要导入资源的 AWS CDK 堆栈没有待处理的更改。“导入”操作中唯一允许的更改是添加要导入的新资源。
+ 为要导入到堆栈的资源添加构造。例如，如果您要导入 Amazon S3 存储桶，请添加类似 `new s3.Bucket(this, 'ImportedS3Bucket', {});` 的内容。请勿对任何其他资源进行任何修改。

  您还必须确保将资源当前具有的状态准确地建模到定义中。以存储桶为例，请务必包含 AWS KMS 密钥、生命周期策略以及与存储桶相关的任何其他内容。否则，后续更新操作可能无法达到您的预期。

  您可以选择是否包含物理存储桶名称。我们通常建议不要在 AWS CDK 资源定义中包含资源名称，这样可以更轻松地多次部署资源。
+ 运行 `cdk import <STACKNAME>`。
+ 如果模型中没有资源名称，则 CLI 将提示您传入要导入的资源的实际名称。之后，导入将开始。
+ `cdk import`报告成功后，资源现在由 AWS CDK 和 CloudFormation管理。您对 AWS CDK 应用程序构造配置中的资源属性所做的任何后续更改都将应用于下次部署。
+ 要确认 AWS CDK 应用程序中的资源定义与资源的当前状态相匹配，您可以启动[CloudFormation 偏差检测操作](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)。

此功能目前不支持将资源导入到嵌套堆栈中。

## 配置 (`cdk.json`)
<a name="cli-config"></a>

许多 CDK CLI 命令行标志的默认值可存储在项目的 `cdk.json` 文件或用户目录的 `.cdk.json` 文件中。以下是按字母顺序对支持的配置设置的引用。


| Key | 注意 | CDK CLI 选项 | 
| --- | --- | --- | 
|  `app`  | 用于执行 CDK 应用程序的命令。 |  `--app`  | 
|  `assetMetadata`  | 如果为 `false`，CDK 不会向使用资产的资源添加元数据。 |  `--no-asset-metadata`  | 
|  `bootstrapKmsKeyId`  | 覆盖用于加密 Amazon S3 部署存储桶的 AWS KMS 密钥的 ID。 |  `--bootstrap-kms-key-id`  | 
|  `build`  | 合成之前用于编译或构建 CDK 应用程序的命令。`~/.cdk.json` 中不允许此命令。 |  `--build`  | 
|  `browser`  | 用于为 `cdk docs` 子命令启动 Web 浏览器的命令。 |  `--browser`  | 
|  `context`  | 请参阅[上下文值和 AWS CDK。](context.md)配置文件中的上下文值不会被 `cdk context --clear` 擦除。（CDK CLI 将缓存的上下文值放入 `cdk.context.json` 中。） |  `--context`  | 
|  `debug`  | 如果为 `true`，CDK CLI 会发出对调试有用的更多详细信息。 |  `--debug`  | 
|  `language`  | 用于初始化新项目的语言。 |  `--language`  | 
|  `lookups`  | 如果为 `false`，则不允许上下文查找。如果需要执行任何上下文查找，则合成会失败。 |  `--no-lookups`  | 
|  `notices`  | 如果为 `false`，则禁止显示有关安全漏洞、回归和不支持的版本的消息。 |  `--no-notices`  | 
|  `output`  | 合成云程序集（默认为 `"cdk.out"`）发出到的目录的名称。 |  `--output`  | 
|  `outputsFile`  | 将向其中写入已部署堆栈的 AWS CloudFormation 输出的文件（`JSON`格式化）。 |  `--outputs-file`  | 
|  `pathMetadata`  | 如果为 `false`，则不会将 CDK 路径元数据添加到合成模板中。 |  `--no-path-metadata`  | 
|  `plugin`  | 指定用于扩展 CDK 的软件包的名称或本地路径的 JSON 数组 |  `--plugin`  | 
|  `profile`  | 用于指定区域和账户凭证的默认 AWS 配置文件名称。 |  `--profile`  | 
|  `progress`  | 如果设置为`"events"`，CDK CLI 将显示部署期间的所有 AWS CloudFormation 事件，而不是进度条。 |  `--progress`  | 
|  `requireApproval`  | 需要手动批准的变更的默认批准级别。请参阅[批准与安全相关的更改。](#cli-security) |  `--require-approval`  | 
|  `rollback`  | 如果为 `false`，则失败的部署不会回滚。 |  `--no-rollback`  | 
|  `staging`  | 如果是`false`，则不会将资源复制到输出目录（用于通过 AWS SAM 对源文件进行本地调试）。 |  `--no-staging`  | 
|  `tags`  |  包含堆栈的标签（键值对）的 `JSON` 对象。 |  `--tags`  | 
|  `toolkitBucketName`  | 用于部署 Lambda 函数和容器映像等资产的 Amazon S3 存储桶的名称（请参阅[引导您的 AWS 环境](#cli-bootstrap)）。 |  `--toolkit-bucket-name`  | 
|  `toolkitStackName`  | 引导堆栈的名称（请参阅[引导您的 AWS 环境](#cli-bootstrap)）。 |  `--toolkit-stack-name`  | 
|  `versionReporting`  | 如果为 `false`，则选择退出版本报告。 |  `--no-version-reporting`  | 
|  `watch`  | JSON 对象，其中包含 `"include"` 和 `"exclude"` 键，其指示哪些文件在更改时应触发（或不应触发）项目重建。请参阅[监视模式](#cli-deploy-watch)。 |  `--watch`  | 