AWS Api Gateway + Lambda + 自定义域 (Route53) 缺少身份验证令牌问题
Posted
技术标签:
【中文标题】AWS Api Gateway + Lambda + 自定义域 (Route53) 缺少身份验证令牌问题【英文标题】:AWS Api Gateway + Lambda + custom domain (Route53) Missing Authentication Token issue 【发布时间】:2017-12-07 10:07:35 【问题描述】:我知道这里已经发布并回答了许多类似的问题,但没有一个与我所经历的完全一样。
我有一个处理传入请求(GET 和 POST)的 Lambda 函数。我还设置了一个 api 网关作为面向公众的端点。另外,我在Set up Custom Domain Name for API Host Name之后设置了自定义域
测试调用在 lambda 和 api 网关控制台中均有效。一切都可以使用调用 URL,但不适用于我设置的自定义域。
这里有更多细节:
调用 URL(工程):
https://api gateway id.execute-api.us-west-2.amazonaws.com/prod/endpoint
自定义域 endpint(不起作用):
https://api.my domain.com/endpoint
基本路径映射:
/endpoint endpoint:prod
所有方法验证:
Authorization None
API Key Not required
Route53:
A record as alias that points api.my domain.com to the cloudfront distribution domain name as alias target.
如果有人知道这里发生了什么,我将不胜感激。
【问题讨论】:
您是否还设置了指向CloudFront-Distribution
的Route53-Record-Set
?
@MaiKaY 是的。我有一条 A 记录作为 api.my domain.com 的别名。别名目标是 CloudFront 分配域名
我想您需要将您的BasePath Mapping
更改为:/ endpoint:prod
。或者尝试使用现有的BasePath Mapping
访问https://api.my domain.com
@jlai 您能否提及您收到的错误或您的请求未到达 API 网关
【参考方案1】:
我发现问题在于误解了基本路径映射的工作原理。
我所有的配置都是正确的。
我的API资源不在/下,而是在/endpoint下
要使用自定义域,而不是访问https://api.my domain.com/endpoint,它需要转到https://api.my domain.com/endpoint/endpoint
当然这是愚蠢和多余的。
我有两个选择。我要么设置到 / 而不是 /endpoint 的基本路径映射,要么我可以只使用 API 资源 / 而不是 /endpoint。
我选择后者,因为如果将基本路径映射设置为 /,我的 api.my domain.com 将只能托管一个 API(我仍然可以使用同一 API 下的资源,但为什么要浪费额外的抽象层?)。
这似乎是垃圾,但我仍然很高兴我想通了。
【讨论】:
不清楚为什么您会期望/endpoint
的基本路径和名为 /endpoint
的资源会导致任何行为其他,而不是要求请求转到 @ 987654325@,因为资源是通过基本路径+资源访问的。
我实际上使用 lambda 的模板设置了 api 网关,模板自动将其放置在 API 的名称下,而不是 API 的根目录下。这是我第一次使用它,所以我没想到会出现这种行为。我预计资源是在 API 的根目录下创建的,这意味着 API 的名称应该只是 API 的名称,并且根默认用于第一个资源。
我明白你的意思了。
我遇到了同样的问题,也没有意识到 lambda 在网关中创建了一个嵌套资源。我收到 "message":"Missing Authentication Token"
是的,杰莱。我同意你。我的 api 是“abcd12345.execute-api.us-east-1.amazonaws.com/Dev/resource”但是当我创建自定义 api 域名并只添加阶段而不是路径时,我只能通过 example.com 访问它/资源。它真的很傻。【参考方案2】:
几年前我遇到过同样的问题,并通过从 URL 中删除“舞台”名称解决了这个问题。
-
网关 API 的 URL 如下所示:
https://id.execute-api.region.amazonaws.com/stage/todos
-
如果您已将自定义域
https://api.xxx.com
路由到网关 API apiName:stage
,则如下所示:
https://api.xxx.com
path: /
target: apiName:stage
-
最后,正确的调用方式是去掉stage名:
// **remove stage name!!!!**
// Right
https://api.xxx.com/todos
// Wrong
https://api.xxx.com/stage/todos
【讨论】:
天哪!这正是我的问题!!! I wrote about it here. 基本上艺名也换成自定义域名了。 (注:我希望你的答案更清楚一点,因为我第一次阅读时没有得到它。)【参考方案3】:另一个原因可能是您的用户虽然是管理员,但没有该死的CloudFrontFullAccess
权限!我只花了几个小时,因为我依靠serverless
为我做这件事,但它在另一个具有不同凭据的项目上完美运行。所以仔细检查文章! https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html
【讨论】:
以上是关于AWS Api Gateway + Lambda + 自定义域 (Route53) 缺少身份验证令牌问题的主要内容,如果未能解决你的问题,请参考以下文章
AWS API Gateway - Lambda - 内部服务器错误
是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?
通过 API-Gateway 将动态路径传递给 AWS-Lambda
如何将特定 AWS API Gateway 阶段连接到特定 AWS lambda 别名