如何在AWS API Gateway中调试“缺少身份验证令牌”?

11

我有一个 API 网关资源,被代理到 AWS Lambda 函数。这对于传递尾部路径参数 (/periodicals/{tail+}) 是可以正常工作的,但是当我希望这些参数是可选的时,我还在高级资源(/periodicals)中添加了ANY方法:

当我从AWS控制台测试该方法时,它可以正常工作。然而,当我直接从浏览器请求此资源时,会得到以下响应:

{"message":"Missing Authentication Token"}

使用此标题:

x-amzn-errortype: MissingAuthenticationTokenException

页面还带有一个值为“Error from cloudfront”的x-cache头,所以我猜这可能与CloudFront有关。虽然我并没有明确设置CloudFront,也不知道如何检查?

我想我读了每个关于此错误消息的主题,但似乎都不适用于我:

  • 我的方法不需要授权:
  • 我非常确定URL是正确的。当我在浏览器中访问/periodicals/whatever(即{tail+}资源)时,它运行良好,但对于/periodicals则不行。
  • CORS已启用,因为两个资源都指向同一个Lambda函数,该函数处理CORS并对子路径有效。
  • HTTP动词不应该有影响,因为它正在监听ANY
  • 是否添加尾随斜杠结果相同。
  • API已部署。
  • 我认为API资源在我的Lambda函数上具有足够的权限,因为我可以从AWS控制台成功执行它:

感谢@Lakindu提供的一个有趣的观察结果,即在Stages视图下面没有列出任何方法:

还有什么我可以做来找出问题所在吗?


你是否在API网关中,在选择Lambda函数后的左侧菜单中检查了“阶段”?它是否被阻止了? - Lakindu Gunasekara
@Lakindu 嗯,那看起来很可疑:http://i.imgur.com/8bpfgGT.png 你知道为什么/periodicals没有列出任何方法吗? - Vincent
你需要有一个资源,在资源内部可以有方法。点击/期刊,然后点击操作按钮,创建方法。 - Lakindu Gunasekara
@Lakindu 你是说在左边的“资源”部分吗?因为我觉得我已经有一个方法在那里了?https://i.stack.imgur.com/VdLcm.png - Vincent
@Lakindu 对的,这看起来与工作的 /{tail+} 资源相同:http://i.imgur.com/RdFS5QF.png - Vincent
显示剩余2条评论
1个回答

4
我发现了问题的原因:
我的API是使用TerraForm部署的。在TerraForm中,你需要指定API网关部署作为其中一个资源。我认为如果它所依赖的任何资源(包括/periodicals资源)发生更改,它会重新部署API。
不过,我现在认为我必须更新其state_description以强制进行新的部署。这样做的好处是可以更新配置而不影响API用户,但这也意味着当你想要部署更新的配置时,你必须明确执行一个操作。
希望这能对大家有所帮助。 tl;dr与我之前的想法相反,在添加方法后,API实际上并没有被部署。(你可以在AWS API Gateway控制台中手动执行此操作,方法是选择“操作”下拉菜单中的“部署API”。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接