GraphQL API本地正常但部署至AWS后无法读取Post数据求助
解决Amplify GraphQL线上环境无法读取DynamoDB数据的问题
核心问题定位
你的查询代码使用了AMAZON_COGNITO_USER_POOLS认证模式,但线上未登录的公共用户没有Cognito身份凭证,而你在@auth规则里配置的公共可读权限是基于IAM的,两者不匹配,这是导致线上无法读取的关键原因。
分步解决方法
1. 修正查询的认证模式
将查询代码中的authMode改为AWS_IAM,匹配你配置的公共IAM可读规则:
const readBoards = async () => { const Boards = await API.graphql({query: listPosts, authMode: 'AWS_IAM'}); const allBoards = Boards.data.listPosts.items; setBoardsItems(allBoards); };
2. 验证Amplify线上IAM权限
- 登录AWS控制台,找到Amplify关联的IAM角色(通常命名为
amplify-<项目名>-<环境>-<数字>-authRole或unauthRole),检查其策略是否包含DynamoDB的Scan和Query权限(对应listPosts操作) - 确认GraphQL API的数据源配置:进入AppSync控制台,找到对应的Post数据源,检查关联的IAM角色是否允许对Post表执行读取操作
3. CORS配置排查
- 检查Amplify API的CORS设置:在Amplify控制台的API模块中,确认允许的Origin列表包含你的线上站点域名(比如
https://your-domain.com) - 打开浏览器控制台的Network面板,查看
listPosts请求的响应:如果有CORS相关报错(如No 'Access-Control-Allow-Origin' header),需要调整CORS规则,确保线上域名被允许
4. 确认@auth规则部署生效
- 重新部署你的Amplify API(执行
amplify push),确保@auth规则的修改同步到线上 - 查看AppSync控制台的Resolver权限:检查
listPostsresolver的权限是否正确应用了你的@auth规则(同时允许owner和public IAM读取)
本地能运行的原因说明
本地环境中你可能已经登录了Cognito用户(属于Post的owner或符合private规则的用户),此时使用AMAZON_COGNITO_USER_POOLS模式能通过身份验证读取数据;但线上未登录状态下没有用户池身份,必须切换到IAM模式才能匹配公共可读权限。
内容的提问来源于stack exchange,提问作者꼬꾸마시
相关产品推荐
相关产品推荐

