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
相关产品推荐
相关产品推荐

