Lambda报错:@DynamoDBIndexHashKey需指定HASH GSI名称排查
问题解决:@DynamoDBIndexHashKey must specify one of HASH GSI name/names
错误根源
直接触发错误的原因是Episode类中podcast字段的注解使用错误:它是主表的分区键(HASH键),但你用了@DynamoDBIndexHashKey注解——这个注解是给GSI(全局二级索引)的HASH键用的,必须指定所属的GSI名称,而你没有指定,所以抛出异常。
另外,你的GSI注解逻辑也存在问题:
avgRating的@DynamoDBIndexHashKey指定了GSI名称,但episodeId的@DynamoDBIndexRangeKey指定了另一个独立的GSI名称,这不符合DynamoDB的GSI规则——一个GSI只能有一个HASH键,可选一个RANGE键,两者必须属于同一个GSI。
解决方案
方案1:修正主表键注解(必须执行)
将podcast字段的注解从@DynamoDBIndexHashKey改为@DynamoDBHashKey,因为它是主表的分区键,不是GSI的键:
@DynamoDBHashKey(attributeName = "podcast") public String getPodcast() {return podcast;}
方案2:根据GSI实际情况调整注解
情况A:表中存在GSI(比如以avgRating为HASH,episodeId为RANGE)
将两个字段的GSI名称统一,确保它们属于同一个GSI:
@DynamoDBIndexHashKey(attributeName = "avgRating", globalSecondaryIndexName = "avgRating-episodeId-index") public int getAvgRating() { return avgRating; } @DynamoDBIndexRangeKey(attributeName = "episodeId", globalSecondaryIndexName = "avgRating-episodeId-index") public String getEpisodeId() { return episodeId; }
注意:GSI名称必须和你DynamoDB表中实际创建的GSI名称完全一致。
情况B:暂时不需要在代码中使用GSI
直接移除所有@DynamoDBIndexHashKey和@DynamoDBIndexRangeKey注解,只保留主表键和普通属性注解:
@DynamoDBTable(tableName = "PodcastReviewService-Episodes") public class Episode { private String podcast; private int episodeNr; private String name; private int avgRating; private String episodeId; private List<Review> reviews; public Episode() {} @DynamoDBHashKey(attributeName = "podcast") public String getPodcast() {return podcast;} @DynamoDBRangeKey(attributeName = "episodeNr") public int getEpisodeNr() {return episodeNr;} @DynamoDBAttribute(attributeName = "name") public String getName() { return name; } @DynamoDBAttribute(attributeName = "avgRating") public int getAvgRating() { return avgRating; } @DynamoDBAttribute(attributeName = "episodeId") public String getEpisodeId() { return episodeId; } @DynamoDBAttribute(attributeName = "reviews") public List<Review> getReviews() { return reviews; } }
补充:移除注解后仍报错的排查
如果已经修正注解但还是报错,检查以下几点:
- 确认Lambda部署的是最新的代码包,旧的代码可能仍在运行
- 清理Lambda的执行环境缓存(可以通过重新部署或更新函数配置触发)
- 确认DynamoDB表的结构和实体类注解完全匹配
内容的提问来源于stack exchange,提问作者bilboswaggins
相关产品推荐
相关产品推荐

