You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于React、AWS、GraphQL、DynamoDB实现用户数据共享链接求助

问题排查与解决方案

1. 核对IAM角色权限配置

  • 确认未授权IAM角色拥有DynamoDB对应索引的查询/扫描权限,以及GraphQL API的调用权限。
  • 确保DynamoDB策略的资源路径包含索引ARN,示例:
{
  "Effect": "Allow",
  "Action": [
    "dynamodb:Query",
    "dynamodb:GetItem"
  ],
  "Resource": [
    "arn:aws:dynamodb:region:account-id:table/your-table/index/your-index",
    "arn:aws:dynamodb:region:account-id:table/your-table"
  ]
}
  • 同时要保证GraphQL API策略允许该角色调用getNode查询:
{
  "Effect": "Allow",
  "Action": "appsync:GraphQL",
  "Resource": "arn:aws:appsync:region:account-id:apis/api-id/types/Query/fields/getNode"
}

2. 验证细粒度访问控制(FGAC)规则

  • 检查DynamoDB索引的FGAC条件是否适配未授权访问场景。因为分享链接基于登录用户的Cognito ID生成,需确保查询时传递的参数(如链接中的Cognito ID)能触发索引的访问规则。
  • 示例正确规则:
{
  "Condition": {
    "Equals": {
      "dynamodb:LeadingKeys": "${ctx.args.ownerId}"
    }
  }
}
  • 注意:如果getNode查询未传递ownerId参数,FGAC会直接拒绝访问,导致返回空数据。

3. 检查GraphQL查询参数与索引匹配

  • 确认getNode查询是否正确关联了DynamoDB索引,且传递了匹配索引键结构的参数(如链接中的Cognito用户ID)。若未指定索引或参数不匹配,会导致查询无结果。
  • 示例正确查询结构:
query getNode($ownerId: String!, $nodeId: String!) {
  getNode(ownerId: $ownerId, nodeId: $nodeId) {
    id
    ownerId
    content
  }
}
  • 调用API时需正确传参:
const starsData = await API.graphql({
  query: getNode,
  variables: { ownerId: '链接中的CognitoID', nodeId: '节点ID' },
  authMode: 'AWS_IAM',
});

4. 查看AppSync CloudWatch日志

  • 开启AppSync的CloudWatch日志排查具体问题:
    1. 进入AppSync控制台,选中目标API
    2. 进入Settings页面,将Log level设为ALL
    3. 重新发起查询,查看日志中的权限拒绝、参数错误、索引未命中等具体信息

5. 确认未授权角色的凭证有效性

  • 检查应用是否正确获取未授权IAM角色的临时凭证。若使用Amplify,需确保Auth.configure正确配置未授权角色,且调用API时未附带登录用户的凭证(模拟未授权访问场景)。
  • 可通过打印Auth.currentCredentials()的结果,确认当前使用的是未授权角色的凭证。

内容的提问来源于stack exchange,提问作者Dr-Hades

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:17:09