使用Python Lambda创建DynamoDB表报KeySchema属性数量不匹配错误
核心认知纠正
你的认知存在两处错误:
- DynamoDB不存在单条记录最多存储10个属性的限制。单条项目(Item)的大小上限为400KB,除键属性外无强制属性数量限制,非键属性可以在写入数据时自由添加、修改、删除,不需要提前在表定义中声明。
AttributeDefinitions参数的作用不是声明表中所有要存储的属性,仅需要声明被主键(KeySchema)、本地二级索引、全局二级索引用到的键属性即可。
你提到的「KeySchema仅用于唯一标识记录,不需要纳入所有属性」的认知是正确的,分区键+范围键的组合必须全局唯一,用于定位单条数据。
报错原因
你收到的校验错误,直接原因是AttributeDefinitions中声明的属性数量和KeySchema用到的属性数量不匹配:你额外在AttributeDefinitions里加了未被主键/索引使用的agentName,触发了参数校验规则——创建表时AttributeDefinitions列出的属性必须和所有主键、索引用到的键属性完全一一对应,多传、少传、传错属性名/类型都会报这个错。
另外你的代码还有一处Python语法错误:TableName='CallCenterCallsTable, 字符串末尾缺失闭合单引号,修正参数错误后也要补上这个引号,否则代码会直接运行失败。
修正后可运行代码
移除AttributeDefinitions中多余的agentName配置,补全表名字符串的引号即可:
import json import boto3 client = boto3.client("dynamodb") def lambda_handler(event, context): response = client.create_table( AttributeDefinitions=[ { 'AttributeName': 'agentId', 'AttributeType': 'N' }, { 'AttributeName': 'agentRole', 'AttributeType': 'S' } ], TableName='CallCenterCallsTable', KeySchema=[ { 'AttributeName': 'agentId', 'KeyType': 'HASH' }, { 'AttributeName': 'agentRole', 'KeyType': 'RANGE' } ], BillingMode='PROVISIONED', ProvisionedThroughput={ 'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1 } ) print(response)
后续使用提示
表创建完成后,写入数据时可以直接添加agentName以及其他业务需要的属性,不需要修改表结构,只要单条项目总大小不超过400KB即可。如果后续需要创建二级索引,再在AttributeDefinitions中补充对应索引用到的键属性配置即可。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

