配置 AWS CDK 库使用情况数据报告 - AWS Cloud Development Kit (AWS CDK) v2

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

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

配置 AWS CDK 库使用情况数据报告

什么是 CDK 库使用情况数据报告?

AWS 云开发工具包 (AWS CDK) 应用程序配置为收集和报告使用情况数据,以深入了解 AWS CDK 的使用情况。CDK 团队使用此数据执行下面的操作:

  • 与客户沟通 – 使用存在已知安全或可靠性问题的构造来识别堆栈,并就影响客户的主题发送沟通信息。

  • 促进 CDK 开发 – 深入了解 CDK 使用情况,以便更好地促进 CDK 开发。

  • 调查 CDK 问题 – 当报告错误时,使用情况数据可在故障排除时为 CDK 团队提供宝贵的见解。

收集哪些使用情况数据?

CDK 会收集两类应用程序使用情况数据:

  • 常规使用情况数据

  • 其他使用情况数据

常规使用情况数据收集

CDK 会从您的 CDK 应用程序中收集以下类型的常规使用情况数据:

  • 使用的 CDK 库版本。

  • 从以下 NPM模块中使用的构造名称:

    • AWS CDK 核心模块

    • AWS 构造库模块

    • AWS 解决方案构造模块

    • AWS 渲染农场部署工具包模块

注意

在 1.93.0 版本之前,AWS CDK 报告的是合成过程中加载的模块的名称和版本,而不是堆栈中使用的构造。

其他使用情况数据收集

从 CDK 版本 2.178.0 开始,使用情况数据收集范围扩大到包括以下使用情况数据:

  • CDK 定义的属性键 – 当您使用 L2 构造的内置属性时,系统会收集属性键。这包括嵌套在字典对象中的内置属性键。

  • 来自 CDK 定义的属性键的布尔值和枚举值 – 对于 CDK 定义的属性键,仅收集布尔类型和枚举类型的属性值。所有其他类型(例如,字符串值或构造引用)都将被加密。

  • 布尔类型和枚举类型的方法名称、键和属性值 – 当您使用 L2 构造方法时,我们将收集布尔类型和枚举类型的方法名称、属性键和属性值。

对于您创建的唯一属性键和值,整个对象将被加密。例如,如果您使用 InlineApiDefinition 定义 OpenAPI 规范并将其传递给 RestApi 构造,则整个 InlineApiDefinition 对象将被加密。

有关其他使用情况数据收集的更多信息,包括其好处和潜在问题,请参阅 aws-cdk 存储库中的 CDK Collecting Additional Metadata (under feature flag) #33198 讨论。

CDK 如何收集应用程序使用情况数据

合成时,CDK 会从您的应用程序收集使用情况数据,并将其存储在 AWS::CDK::Metadata 资源中。下面是合成的 AWS CloudFormation 中此资源的示例:

CDKMetadata: Type: "AWS::CDK::Metadata" Properties: Analytics: "v2:deflate64:H4sIAND9SGAAAzXKSw5AMBAA0L1b2PdzBYnEAdio3RglglY60zQi7u6TWL/XKmNUlxeQSOKwaPTBqrNhwEWU3hGHiCzK0dWWfAxoL/Fd8mvk+QkS/0X6BdjnCdgmOOQKWz+AqqLDt2Y3YMnLYWwAAAA="

Analytics 属性是堆栈中构造的 gzip、base64 编码、前缀编码列表。

如何选择退出或选择加入使用情况数据报告

您可以选择退出或加入常规使用情况数据报告以及其他使用情况数据报告,具体取决于您最初创建应用程序时使用的 CDK 版本。

默认情况下,CDK 应用程序配置为自动选择加入使用情况数据报告,具体如下:

  • 所有 CDK 应用程序 – 选择加入常规使用情况数据报告。

  • 使用低于 v2.178.0 的版本创建的 CDK 应用程序 – 不自动选择加入其他使用情况数据报告。

  • 使用 v2.178.0 或更高版本创建的 CDK 应用程序 – 选择加入其他使用情况数据报告。

警告

如果您选择退出,CDK 将无法识别您是否受到安全问题的影响,也不会向您发送有关这些问题的通知。

选择退出所有使用情况数据报告

要选择退出所有使用情况数据报告,您可以使用 AWS 云开发工具包 (AWS CDK) 命令行界面 (CLI) 或配置项目的 cdk.json 文件。

使用 CDK CLI 选择退出所有使用情况数据报告
  • --no-version-reporting 选项与任何 CDK CLI 命令搭配即可选择退出单个命令。以下是模板合成期间选择退出的示例:

    $ cdk synth --no-version-reporting

    由于运行 cdk deploy 时,CDK 会自动合成模板,因此您还应将 --no-version-reportingcdk deploy 命令搭配使用。

通过配置 cdk.json 文件来选择退出所有使用情况数据报告
  1. ./cdk.json~/.cdk.json 中将 versionReporting 设置为 false 默认情况下,这会让您选择退出。以下是示例:

    { "app": "...", "versionReporting": false }
  2. 配置完成后,您可以覆盖这一行为,通过在单个命令中指定 --version-reporting 来选择加入。

仅选择退出其他使用情况数据报告

如果 CDK 应用程序是使用低于 2.178.0 的 CDK 版本创建的,那么即使您选择加入常规使用情况数据报告,您也会自动选择退出其他使用情况数据报告。您无需执行任何操作即可选择退出其他使用情况数据报告。

如果 CDK 应用程序是使用 CDK 版本 2.178.0 或更高版本创建的,则必须选择退出所有使用情况数据报告。您不能只选择退出其他使用情况数据报告。

选择加入使用情况数据报告

如果 CDK 应用程序是使用 CDK 版本 2.178.0 或更高版本创建的,则可以通过将 versionReporting 设置为 true 来选择加入所有使用情况数据报告。这是 CDK 应用程序的默认行为。

如果 CDK 应用程序是使用低于 2.178.0 的 CDK 版本创建的,则可以通过将 versionReporting 设置为 true 来选择加入所有使用情况数据报告。要选择加入其他使用情况数据报告,必须启用功能标志。

注意

这些步骤适用于最初使用低于 2.178.0 的版本创建的 CDK 应用程序

  1. 验证您现在使用的是否是 CDK 2.178.0 或更高版本。

  2. 在您的 CDK 配置文件中,将 @aws-cdk/core:enableAdditionalMetadataCollection 指定为 true。以下是示例:

    { "context": { "@aws-cdk/core:enableAdditionalMetadataCollection": "true" } }
  3. 您也可以在 FeatureFlags 类中使用 ENABLE_ADDITIONAL_METADATA_COLLECTION 值。以下是示例:

    import * as cdk from 'aws-cdk-lib'; import { FeatureFlags } from 'aws-cdk-lib'; import * as cx_api from 'aws-cdk-lib/cx-api'; import { Construct } from 'constructs'; export class MyStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Set the feature flag ENABLE_ADDITIONAL_METADATA_COLLECTION to true FeatureFlags.of(this).add(cx_api.ENABLE_ADDITIONAL_METADATA_COLLECTION, true); // Your stack resources go here new cdk.aws_s3.Bucket(this, 'MyBucket'); } } const app = new cdk.App(); new MyStack(app, 'MyStack');

示例

从 CDK 应用程序中收集的常规和其他使用情况数据

以下是 CDK 应用程序文件的示例:

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; class MyStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); // Create an S3 bucket (L2 construct) const myBucket = new s3.Bucket(this, 'MyBucket', { bucketName: 'my-cdk-example-bucket', // String type versioned: true, // Boolean type removalPolicy: cdk.RemovalPolicy.DESTROY, // ENUM type lifecycleRules: [{ // Array of object type expirationDate: new Date('2019-10-01'), objectSizeLessThan: 600, objectSizeGreaterThan: 500, }], }); // Use a method of the L2 construct to define additional properties myBucket.addLifecycleRule({ id: 'ExpireOldObjects', enabled: true, // Boolean expiration: cdk.Duration.days(90), // Expire objects after 90 days }); } } // Define the CDK app and stack const app = new cdk.App(); new MyStack(app, 'MyStack'); app.synth();

合成时,将收集、压缩使用情况数据并将其存储在 AWS::CDK::Metadata 资源中。

下面是使用低于 2.178.0 的 CDK 版本收集的常规使用情况数据示例:

{ "fqn": "aws-cdk-lib.aws-s3.Bucket", "version": "v2.170.0" }

下面是收集的使用情况数据示例,包括 CDK 版本 2.178.0 中引入的其他使用情况数据:

{ "fqn": "aws-cdk-lib.aws_s3.Bucket", "version": "2.170.0", "metadata": [ { "type": "aws:cdk:analytics:construct", "data": { "bucketName": "*", "versioned": true, "removalPolicy": "cdk.RemovalPolicy.DESTROY", "lifecycleRules": [ { "expirationDate": "*", "objectSizeLessThan": "*", "objectSizeGreaterThan": "*" } ] } }, { "type": "aws:cdk:analytics:method", "data": { "name": "addLifecycleRule", "prop": { "id": "*", "enabled": true, "expiration": "*", } } } ] }