如何授权所有用户访问DynamoDB的GSI(以userIndex为例)
问题排查与解决方案
核心逻辑区分
首先明确两类权限的本质差异:
- 前端用户直接访问DynamoDB(如通过Amplify、API Gateway集成):依赖Cognito用户池的授权策略(即你提到的AuthStack配置)。
- Lambda服务端发起DynamoDB请求:依赖Lambda执行角色的IAM权限,和AuthStack的用户授权配置完全无关。
针对GSI(userIndex)授权无效的排查步骤
1. 检查Lambda执行角色的IAM权限(若为Lambda调用GSI)
如果是Lambda需要访问GSI,确认其执行角色的权限策略是否包含GSI的资源路径:
{ "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:Query", "dynamodb:GetItem" // 根据实际业务需求添加操作 ], "Resource": [ "arn:aws:dynamodb:你的区域:账号ID:table/你的表名", "arn:aws:dynamodb:你的区域:账号ID:table/你的表名/index/userIndex" ] }
注意:GSI必须单独指定ARN,仅配置表的ARN不会自动覆盖索引权限。
2. 检查Cognito用户授权策略(若为前端用户访问GSI)
如果是前端用户通过授权访问GSI,确认AuthStack中的用户池授权策略是否明确包含GSI资源:
{ "Effect": "Allow", "Action": [ "dynamodb:Query" // 前端常用操作,按需添加 ], "Resource": [ "arn:aws:dynamodb:你的区域:账号ID:table/你的表名/index/userIndex" ], "Condition": { // 按需添加业务条件,比如限制用户仅访问自身数据 "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } }
主索引的授权若仅指定表ARN会自动生效,但GSI必须单独配置索引ARN。
3. 验证DynamoDB表的资源策略
如果表本身附加了IAM资源策略,确认该策略未拒绝针对GSI的访问请求,确保允许对应主体(Lambda角色或Cognito身份)访问GSI资源。
4. 确认请求参数正确性
- 若为GSI查询请求,检查是否正确指定了
IndexName为userIndex。 - 若为写入操作,确认写入数据包含GSI的分区键(及排序键,若有),否则GSI不会同步数据,易被误判为授权无效。
关键误区提示
Lambda调用DynamoDB时,使用的是自身的执行角色身份,而非Cognito用户身份,因此修改AuthStack的用户授权配置对Lambda的请求完全没有作用。
内容的提问来源于stack exchange,提问作者Sebastian Nielsen
相关产品推荐
相关产品推荐

