DynamoDB全局二级索引(GSI)投影属性查询异常求助
你遇到的这个问题,核心是全局二级索引(GSI)的非键属性投影配置格式错误。
看你提供的describe-table返回结果,NonKeyAttributes的值是一个单独的字符串:"AgentId, TicketId, TotalSecondsSinceOpen",但DynamoDB要求这个字段必须是字符串数组,每个元素对应一个要投影的属性名。
DynamoDB会把这个单个字符串当成一个完整的属性名去处理——也就是说,它并没有投影AgentId、TicketId、TotalSecondsSinceOpen这三个属性,而是尝试投影一个名为AgentId, TicketId, TotalSecondsSinceOpen的属性(显然这个属性不存在)。所以当你在Query请求中引用这三个属性时,DynamoDB会提示索引未投影这些属性。
由于DynamoDB不支持直接修改已存在GSI的投影配置,你需要删除现有GSI后重新创建:
删除错误的GSI
执行update-table命令删除Id-AddedOn-index:aws dynamodb update-table \ --table-name 你的表名 \ --global-secondary-index-updates '[{"Delete": {"IndexName": "Id-AddedOn-index"}}]'等待索引状态变为
DELETED(可通过describe-table确认)。重新创建正确配置的GSI
重新创建GSI时,将NonKeyAttributes设置为字符串数组,每个属性单独作为一个元素:aws dynamodb update-table \ --table-name 你的表名 \ --global-secondary-index-updates '[ { "Create": { "IndexName": "Id-AddedOn-index", "KeySchema": [ {"AttributeName": "Id", "KeyType": "HASH"}, {"AttributeName": "AddedOn", "KeyType": "RANGE"} ], "Projection": { "ProjectionType": "INCLUDE", "NonKeyAttributes": ["AgentId", "TicketId", "TotalSecondsSinceOpen"] }, "ProvisionedThroughput": {"ReadCapacityUnits": 5, "WriteCapacityUnits": 5} } } ]'注意替换
ProvisionedThroughput的值为你实际需要的容量,或者如果是按需模式可以省略这个参数。等待GSI同步完成
执行describe-table查看IndexStatus,当状态变为ACTIVE时,GSI就可以正常使用了。
重建完成后,再次执行describe-table,你应该会看到NonKeyAttributes是三个独立的字符串元素:
"NonKeyAttributes": ["AgentId", "TicketId", "TotalSecondsSinceOpen"]
这时再执行Query请求,就不会再出现投影属性缺失的错误了。
内容的提问来源于stack exchange,提问作者Boris Barvish

