You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CDK:基于StackProps定义自定义输入变量之DynamoDB类型配置问题

AWS CDK 自定义配置:用字符串映射替代SDK枚举类型

要让终端用户用简单字符串配置DynamoDB的枚举类型(如TableClass、BillingMode),无需直接引用CDK SDK枚举,可通过字符串枚举定义+映射转换实现,具体步骤如下:

1. 定义用户友好的字符串枚举

先创建TypeScript字符串枚举,给用户提供明确的可选配置值:

// 用户侧的配置枚举
export enum UserTableClass {
  STANDARD = 'standard',
  STANDARD_INFREQUENT_ACCESS = 'standard-ia',
  ON_DEMAND = 'on-demand'
}

export enum UserBillingMode {
  PROVISIONED = 'provisioned',
  PAY_PER_REQUEST = 'pay-per-request'
}

export enum UserAttributeType {
  STRING = 'string',
  NUMBER = 'number',
  BINARY = 'binary'
}

2. 编写映射转换函数

把用户输入的字符串枚举,转换成CDK SDK要求的官方枚举类型:

// 映射TableClass到CDK枚举
const mapTableClass = (userInput: UserTableClass): ddb.TableClass => {
  switch(userInput) {
    case UserTableClass.STANDARD:
      return ddb.TableClass.STANDARD;
    case UserTableClass.STANDARD_INFREQUENT_ACCESS:
      return ddb.TableClass.STANDARD_INFREQUENT_ACCESS;
    case UserTableClass.ON_DEMAND:
      return ddb.TableClass.ON_DEMAND;
    default:
      throw new Error(`不支持的TableClass类型:${userInput}`);
  }
};

// 映射BillingMode到CDK枚举
const mapBillingMode = (userInput: UserBillingMode): ddb.BillingMode => {
  switch(userInput) {
    case UserBillingMode.PROVISIONED:
      return ddb.BillingMode.PROVISIONED;
    case UserBillingMode.PAY_PER_REQUEST:
      return ddb.BillingMode.PAY_PER_REQUEST;
    default:
      throw new Error(`不支持的BillingMode类型:${userInput}`);
  }
};

// 映射AttributeType到CDK枚举
const mapAttributeType = (userInput: UserAttributeType): ddb.AttributeType => {
  switch(userInput) {
    case UserAttributeType.STRING:
      return ddb.AttributeType.STRING;
    case UserAttributeType.NUMBER:
      return ddb.AttributeType.NUMBER;
    case UserAttributeType.BINARY:
      return ddb.AttributeType.BINARY;
    default:
      throw new Error(`不支持的AttributeType类型:${userInput}`);
  }
};

3. 更新接口与Stack类

修改IDynamoDB接口使用自定义枚举,在Ddb类中调用映射函数完成转换:

export interface IDynamoDB extends StackProps {
  tableClass: UserTableClass;
  billingMode: UserBillingMode;
  sortKeyName: string;
  sortKeyType: UserAttributeType;
  partitionKeyName: string;
  partitionKeyType: UserAttributeType;
  inTimeRecovery: boolean;
}

export class Ddb extends Stack {
  constructor(scope: Construct, name: string, props: IDynamoDB) {
    super(scope, name, props);

    const table = new ddb.Table(this, name, {
      tableName: name,
      tableClass: mapTableClass(props.tableClass),
      billingMode: mapBillingMode(props.billingMode),
      sortKey: {
        name: props.sortKeyName,
        type: mapAttributeType(props.sortKeyType)
      },
      partitionKey: {
        name: props.partitionKeyName,
        type: mapAttributeType(props.partitionKeyType)
      },
      pointInTimeRecovery: props.inTimeRecovery // 修正原拼写错误:inTimeRecovery -> pointInTimeRecovery
    });
  }
}

4. 用户侧简化配置示例

现在用户可直接用字符串或自定义枚举配置,无需导入CDK SDK枚举:

// 用户使用示例
new Ddb(app, 'MyDdbTable', {
  tableClass: 'standard', // 或 UserTableClass.STANDARD
  billingMode: 'pay-per-request',
  sortKeyName: 'sortKey',
  sortKeyType: 'number',
  partitionKeyName: 'id',
  partitionKeyType: 'string',
  inTimeRecovery: true
});

可选优化:支持直接传字符串

若要进一步简化,可将接口类型改为联合类型(字符串 | 自定义枚举),让用户无需导入自定义枚举:

export interface IDynamoDB extends StackProps {
  tableClass: UserTableClass | 'standard' | 'standard-ia' | 'on-demand';
  billingMode: UserBillingMode | 'provisioned' | 'pay-per-request';
  sortKeyType: UserAttributeType | 'string' | 'number' | 'binary';
  partitionKeyType: UserAttributeType | 'string' | 'number' | 'binary';
  // 其他字段保持不变
}

内容的提问来源于stack exchange,提问作者Unity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:10:37