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-DistributionRoute53-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 别名

使用代理通过 AWS API Gateway 的 Lambda 错误

如何调试 AWS Api Gateway 和 Lambda 的“AWS/ApiGateway 5XXError”