AppSync 始终以“获取失败”作为响应,并且日志不显示任何内容

Posted

技术标签:

【中文标题】AppSync 始终以“获取失败”作为响应,并且日志不显示任何内容【英文标题】:AppSync always responds with "Failed to Fetch" and logs don't show anything 【发布时间】:2018-12-30 19:10:26 【问题描述】:

我有一个连接到 DynamoDB 表的 AppSync API,并且两者都使用 CF 模板进行部署,但是当我向特定解析器发出请求时,它总是挂起,然后失败并显示“无法获取”。我已经使用 IAM Policy Simulator 验证了连接到 API 的角色足以运行 requestMappingTemplate 中指定的扫描:


   "version": "2017-02-28",
   "operation": "Scan",
   "limit": 500

我还在控制台中使用虚拟数据验证了以下 responseMappingTemplate 是否有效:

#set($uniqueStates = [])
    #foreach($item in $ctx.result.items)
        #set($found = false)
        #foreach($state in $uniqueStates)
            #if(!$found && $item.state == $state.name)
                #set($found = true)
                $util.qr($state.institutions.add("name": "$item.name", "id": "$item.id"))
            #end
        #end
        #if(!$found)
         $util.qr($uniqueStates.add("name":"$item.state","institutions":["name": "$item.name", "id": "$item.id"]))
        #end
    #end

  "states": $util.toJson($uniqueStates)

我还按照说明设置了日志记录角色并将其附加到 API。它将成功地为可通过 cloudwatch 访问的自省查询创建日志,并将日志级别设置为 ERROR。

当我转到我的 API 的 AppSync 控制台时,所有设置都按应有的方式显示,但是当我从控制台(或其他任何地方)执行有效查询(由查询构建控制台中的便捷工具验证)时,它挂起并响应“无法获取”。日志部分也没有显示任何内容。我正在撕扯我的头发试图找出原因。提前感谢您的帮助!

【问题讨论】:

在 Chrome 开发者工具中,响应似乎总是以 504 错误的形式返回... 【参考方案1】:

原来我的问题是我从响应映射模板返回的数据与架构不匹配,所以它静默失败并导致超时错误。很容易修复,但很难诊断。我经历的调试过程是创建一个专门用于一个示例端点的新 AppSync API,并逐步使其与我为失败的端点所拥有的一切相同。

【讨论】:

【参考方案2】:

我遇到了类似的问题,亚马逊支持帮助我解决了这个问题。我在这里添加它是为了帮助其他有类似“无法获取”响应的人。

事实证明,我在 lambda 数据源所使用的角色中缺少必需的信任策略。将以下信任策略添加到角色后,我的问题就消失了。

“效果”:“允许”, “主要的”: “服务”:“appsync.amazonaws.com” , “动作”:“sts:AssumeRole”

【讨论】:

【参考方案3】:

您为 API 启用了哪些身份验证设置?您的响应映​​射模板中是否还有一行在评估模板后输出有效负载?类似于 $util.toJson($uniqueStates)?

【讨论】:

感谢您的回复。是的,我忘了在我的答案中添加它(经过编辑以反映这一点),但我确实有“$util.toJson($uniqueStates)”。我也在使用 API_KEY 身份验证,它成功地用于自省查询。 感谢您提供详细信息。还有一个问题。设置页面上是否列出了有效的 API 密钥?默认情况下提供的 API 密钥是短暂的,因此它可能已经过期,然后您必须创建另一个。另一个假设可能是尝试减小分页大小。如果 chrome 显示 504 网关超时,则可能是请求时间过长,您需要减小页面大小。 另一个想法。您能否验证使用附加到解析器的数据源配置的角色是否已正确配置为允许访问您的 DynamoDB 表。您能否进一步验证该表是否存在以及数据源页面中的 arn 是否正确? 这些都是很棒的想法。不幸的是,活动 API 密钥(在我的 CF 模板中生成)确实出现并匹配。该表中只有 2 个元素,使用默认限制似乎没有什么区别。同样,我可以验证该表是否存在于正确的 ARN 中,并且对附加到数据源的角色的偏执跟踪和 IAM 模拟器测试允许在适当的表上进行扫描... 你能分享一个请求ID吗?在超时请求的响应中,应该有一个标题“aws-request-id”,这将有助于调试。

以上是关于AppSync 始终以“获取失败”作为响应,并且日志不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章

用于塑造响应数据的 AWS AppSync 查询(类似于 SQL 中的 Group By)

使用 AWS AppSync 将项目附加到 DynamoDB

okhttp 获取失败响应

AWS AppSync 响应排序结果?

iOS AWS Appsync Fetch 回调从未被调用

AWS AppSync WebUI 非常慢