AWS API Gateway + Lambda + 自定义域名(Route53)缺少身份验证令牌问题

27

我知道在这里有很多类似的问题被发布和回答,但没有一个与我所经历的完全相同。

我有一个处理传入请求(GET和POST)的Lambda函数。我还设置了一个作为公共终端点的API网关。此外,我设置了自定义域名,遵循设置API主机名的自定义域名

测试调用在Lambda和API网关控制台中都可以工作。使用调用URL也可以正常工作,但是使用我设置的自定义域名无法工作。

以下是一些更多详细信息:

调用URL(可用):

https://{api gateway id}.execute-api.us-west-2.amazonaws.com/prod/endpoint

自定义域名终点(无效):

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分发的Route53记录集? - MaiKaY
@MaiKaY 是的。我有一个A记录作为api.{我的域名}.com的别名。别名目标是CloudFront分发域名。 - jlai
1
我猜你需要将BasePath Mapping更改为:/ endpoint:prod。或者尝试使用现有的BasePath Mapping来访问https://api.{my domain}.com - MaiKaY
@jlai,您能否提供您遇到的错误或者您的请求未能到达API网关? - Ali
4个回答

38

几年前我曾遇到过同样的问题,并通过从URL中删除“stage”名称来解决它。

  1. 网关API的URL看起来像下面这样:
https://{id}.execute-api.{region}.amazonaws.com/{stage}/todos
  1. 如果您将自定义域名 https://api.xxx.com 路由到网关API {apiName}:{stage},则结果看起来应该像这样:
https://api.xxx.com

path: /
target: {apiName}:{stage}
  1. 最后,正确的称呼方式是去掉艺名:
// **remove stage name!!!!**

// Right
https://api.xxx.com/todos

// Wrong
https://api.xxx.com/{stage}/todos

5
哇!这正是我的问题!我在这里写了一些内容。 基本上,舞台名称也被自定义域名所取代。(注:我希望你的回答能再清晰一些,因为我第一次读时没有理解清楚。) - ADTC
1
炸了!!!刚刚去掉了开发者的舞台名称,它就可以工作了!!! - Ameer Ul Islam
这真是美丽的 - undefined

28

我发现问题是对基本路径映射的理解有误。

所有的配置都是正确的。

我的API资源不在 / 下,而是在 /endpoint 下。

要使用自定义域名,需要访问 https://api.{my domain}.com/endpoint/endpoint,而不是访问 https://api.{my domain}.com/endpoint。

当然,这很傻和多余。

我有两个选择。我可以将基本路径映射设置为 / 而不是 /endpoint;或者我可以只使用 API 资源 / 而不是 /endpoint。

我选择后者,因为如果将基本路径映射设置为 /,则 api.{my domain}.com 只能托管一个 API (我仍然可以使用同一 API 下的资源,但为什么要浪费额外的抽象层呢?)。

这似乎很愚蠢,但我还是很高兴我弄清楚了。


不清楚为什么您希望基路径为/endpoint,并且资源名为/endpoint的结果是除了需要将请求发送到/endpoint/endpoint之外的任何行为,因为该资源在基路径+资源处访问。 - Michael - sqlbot
6
我实际上使用Lambda的模板搭建了API网关,该模板会自动将其放置在API名称下方而不是API的根目录下。这是我第一次使用它,所以我没有预料到这种行为。我原本期望资源直接创建在API的根目录下,也就是说API的名称应该只是API的名称,而默认情况下根目录应该用于第一个资源。 - jlai
1
我明白你的意思。 - Michael - sqlbot
我遇到了相同的问题,也没有意识到 Lambda 在网关中创建了嵌套资源。我收到了 {"message": "缺少身份验证令牌"}。 - Skyler
没错,jlai。我同意你的观点。我的API是“abcd12345.execute-api.us-east-1.amazonaws.com/Dev/resource”,但当我创建自定义API域名并仅添加阶段而不是路径时,我只能通过example.com/resource访问它。这真的很愚蠢。 - k''
我也不清楚,谢谢,真不敢相信我错过了这个。 - code4cause

0

0

步骤1:将子域名.yourdomain.com的A记录映射到API自定义域名/API网关域名(API网关->自定义域名->选项卡配置/端点配置)。

步骤2:从API网关/API自定义域名中添加API映射。将“路径”留空。

终端格式:

原始终端:https://{api gateway id}.execute-api.us-west-2.amazonaws.com/prod/endpoint

带有API自定义域名的终端:https://api.yourdomain.com/**endpoint**


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