使用SAM模板创建DynamoDB表时遇错误,请求协助
解决DynamoDB表创建的KeySchema错误及Hash/Range键说明
错误原因
你遇到的错误核心是DynamoDB的KeySchema规则限制:一个表的主键只能是以下两种形式之一,成员数量最多为2:
- 单一HASH键(分区键)
- HASH键 + 一个RANGE键(排序键)
你的模板里给KeySchema加了1个HASH键和4个RANGE键,明显超出数量限制,导致验证失败。
Hash键与Range键的核心概念
- HASH键(分区键):决定数据存储的物理分区,DynamoDB通过对该键值哈希计算分配数据位置。选这个键要保证取值足够分散,避免所有数据集中在一个分区造成性能瓶颈。你选
phoneNumber作为HASH键是合理的,手机号唯一性强,能均匀分散数据。 - RANGE键(排序键):仅用于在同一个HASH键的分区内做排序或范围查询,一个表最多只能设置一个。比如如果同一个手机号对应多条记录(比如家庭共享号码),可以用
email作为RANGE键来区分不同条目,但不能同时设置多个RANGE键。
修正后的SAM模板示例
根据不同业务场景,提供两种修正方案:
方案1:仅用HASH键(适合每条记录的phoneNumber唯一的场景)
如果每个手机号只对应一条客户信息,只需要保留phoneNumber作为HASH键即可,其他业务属性不需要提前在AttributeDefinitions里定义(DynamoDB支持灵活写入属性):
MyDynamoDBTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: customerInformations AttributeDefinitions: - AttributeName: phoneNumber AttributeType: S KeySchema: - AttributeName: phoneNumber KeyType: HASH # 若需要通过其他属性(如email)查询,可添加全局二级索引(GSI) GlobalSecondaryIndexes: - IndexName: EmailLookupIndex KeySchema: - AttributeName: email KeyType: HASH Projection: ProjectionType: ALL ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1
方案2:HASH+RANGE组合键(适合同一phoneNumber对应多条记录的场景)
如果同一个手机号可能对应多条客户记录(比如同一号码绑定多个邮箱),可以搭配一个RANGE键,比如用email:
MyDynamoDBTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: customerInformations AttributeDefinitions: - AttributeName: phoneNumber AttributeType: S - AttributeName: email AttributeType: S KeySchema: - AttributeName: phoneNumber KeyType: HASH - AttributeName: email KeyType: RANGE
内容的提问来源于stack exchange,提问作者Amjad
相关产品推荐
相关产品推荐

