

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

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

# AWS CDK 功能标志
<a name="featureflags"></a>

AWS CDK 使用*功能标志*来启用版本中可能发生的重大行为。标志以[上下文值和 AWS CDK](context.md) 值的形式存储在 `cdk.json`（或 `~/.cdk.json`）中。`cdk context --reset` 或 `cdk context --clear` 命令不会将其删除。

功能标志默认禁用。未指定标志的现有项目将在以后的 AWS CDK 版本中像以前一样继续运行。使用 `cdk init` 创建的新项目包含启用创建该项目的版本中所有可用功能的标志。编辑 `cdk.json` 以禁用您更喜欢以前行为的所有标志。您还可以在升级 AWS CDK 后添加标志，以启用新行为。

所有当前功能标志的列表可在 AWS CDK GitHub 存储库的 [FEATURE\$1FLAGS.md](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/cx-api/FEATURE_FLAGS.md) 中找到。有关该版本中添加的任何新功能标志的描述，请参阅给定版本中的 `CHANGELOG`。

## 恢复到 v1 行为
<a name="featureflags-disabling"></a>

在 CDK v2 中，与 v1 相比，某些功能标志的默认值已更改。您可以将它们设置回 `false`，以恢复到特定的 AWS CDK v1 行为。使用 `cdk diff` 命令检查对合成模板的更改，以查看是否需要这些标志中的任何一个。

 `@aws-cdk/core:newStyleStackSynthesis`   
使用新的堆栈合成方法，该方法假设引导资源具有明确的名称。需要[现代引导](bootstrapping.md)，但反过来又允许通过 [CDK 管线](cdk-pipeline.md)进行 CI/CD 以及开箱即用的跨账户部署。

 `@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId`   
如果您的应用程序使用多个 Amazon API Gateway API 密钥，并将其与使用计划相关联。

 `@aws-cdk/aws-rds:lowercaseDbIdentifier`   
如果您的应用程序使用 Amazon RDS 数据库实例或数据库集群，并为其显式指定标识符。

 `@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021`   
如果您的应用程序将 TLS\$1V1\$12\$12019 安全策略与 Amazon CloudFront 分配搭配使用。CDK v2 默认使用安全策略 TLS v1.2\$12021。

 `@aws-cdk/core:stackRelativeExports`   
如果您的应用程序使用多个堆栈，而您在一个堆栈中引用来自一个堆栈的资源，则这将决定使用绝对路径还是相对路径构造 AWS CloudFormation 导出。

 `@aws-cdk/aws-lambda:recognizeVersionProps`   
如果设置为 `false`，则在检测 Lambda 函数是否已更改时，CDK 会包含元数据。由于版本不允许重复，因此当只有元数据发生更改时，这可能会导致部署失败。如果您对应用程序中的所有 Lambda 函数进行了至少一次更改，则无需恢复此标志。

以下示例显示了在 `cdk.json` 中恢复这些标志的语法。

```
{
  "context": {
    "@aws-cdk/core:newStyleStackSynthesis": false,
    "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": false,
    "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": false,
    "@aws-cdk/aws-rds:lowercaseDbIdentifier": false,
    "@aws-cdk/core:stackRelativeExports": false,
    "@aws-cdk/aws-lambda:recognizeVersionProps": false
  }
}
```