我有一个代理到 AWS Lambda 函数的 API 网关资源。这对于传递尾随路径参数 (/periodicals/{tail+}
) 效果很好,但由于我希望这些参数是可选的,所以我还添加了一个 ANY
方法高级资源(/periodicals
):
这在 AWS 控制台中测试该方法时效果很好。然而,直接从我的浏览器对该资源执行请求会导致以下响应:
{"message":"Missing Authentication Token"}
有了这个标题:
x-amzn-errortype: MissingAuthenticationTokenException
它还有一个 x-cache
header ,其值为 Error from cloudfront
,所以我猜它可能与 CloudFront 有关。不过,我还没有明确设置 CloudFront,也不知道如何检查?
我想我已经阅读了关于此错误消息的所有主题,但它们似乎都不适用于我:
- 我的方法不需要授权:
- 我很确定 URL 是正确的。当我在浏览器中访问
/periodicals/whatever
(即{tail+}
资源)时,它工作正常,但对于/periodicals
则不然。 - CORS 已启用,因为这两个资源都指向处理 CORS 并为子路径工作的同一个 Lambda 函数。
- HTTP 动词应该无关紧要,因为它正在监听
ANY
。 - 无论是否添加尾部斜杠,结果都是一样的。
- API 已部署。
- 我认为 API 资源对我的 Lambda 函数有足够的权限,因为我可以从 AWS 控制台成功执行它:
感谢@Lakindu,一个有趣的观察是 Stages View 中的资源下方没有列出任何方法:
我还能做些什么来找出问题所在?
最佳答案
我发现发生了什么:
我的 API 是使用 TerraForm 部署的。在 TerraForm 中,您指定的资源之一是 an API Gateway Deployment .我认为如果它依赖的任何资源(包括 /periodicals
资源)发生变化,它会重新部署 API。
唉,我现在想我必须更新它的 state_description
以强制进行新的部署。这样做的好处是您可以在不影响 API 用户的情况下更新配置,但这确实意味着您在要部署更新的配置时明确需要执行操作。
希望这对任何人都有帮助。
tl;dr 与我的想法相反,添加方法后 API 并未实际部署。 (您可以通过在“操作”下拉列表中选择“部署 API”,在 AWS API Gateway 控制台中手动执行此操作。
关于node.js - 如何在 AWS API 网关中调试 "Missing Authentication Token"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46072388/