API网关的自定义域名返回403错误

45

我正在使用API Gateway和Lambda创建一个API。在API Gateway Stage编辑器中指定的URL可以正常工作;但是,当我尝试切换到自定义域时遇到了一些问题。

我尝试的第一件事是在Route 53中直接使用CNAME记录将我的域名映射到从API Gateway获取的域名上。这返回了一些错误,我认为这不是正确的解决方案,这是正确的吗?

接下来,我尝试了API Gateway中的自定义域名功能。我的理解是,这将卷起一个CloudFront分发,然后我可以从Route 53进行映射。当我创建自定义域并添加域映射时,它会为我提供一个URL,我认为这是一个CloudFront分发链接。该链接返回403响应,并且在CloudFront中没有进行分发。有什么好的方法来调试这个问题?


3
在使用API Gateway时,您始终会有一个CloudFront分发,而不仅在启用自定义URL时才有。您无法在CloudFront仪表板中看到它,因为它在幕后进行管理,您无法直接访问它。 - Mark B
1
好的,那很有道理。这和我没有等待 CloudFront 滚动起来足够久有关。我今天早上回来后它就可以工作了。 - BBS
1
我曾经遇到过这个问题,并发现等到第二天早上才“解决”了它。我认为创建和分配边缘域的过程非常异步化。 - Rich
顺便提一下,我在我的托管域名URL上收到了 {“message”:“Forbidden”},但当我打开API端点时,我的服务是可以访问的。请注意,我的API是公开的,但我的路由53条目在不同的AWS帐户中,我的为API创建的自定义域和CloudFront也在不同的AWS帐户中。 - Ashish Karpe
6个回答

33

tldr; 确保您不再添加 /path/ANDSTAGE 而是只添加 /path,因为 APIGW 会为您映射。

如果您还没有看过这里的开发人员指南,请点击链接。 http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

您需要做的只是通过 DNS 提供商设置一个 CNAME 指向 API Gateway 给您的 CF 分发。 您将无法直接向 CF 分发进行 API 调用。 API Gateway 通过在 API Gateway 中设置的基路径映射映射 API/stage,因此只有针对域名的 API 调用才能正常工作。


我想知道是否可以在没有CloudFront分发的情况下使用APIGW自定义域名... - Marcello Romani
啊,这取决于端点类型,是边缘还是区域性的... - Marcello Romani
1
顺便说一下,我在托管的域名URL上得到了{“message”:“Forbidden”},但当我打开API端点时,我的服务被访问。请注意,我的API是公开的,但我的路由53条目位于不同的AWS帐户中,我的为API创建的自定义域和CloudFront位于不同的AWS帐户中。 - Ashish Karpe

30

您需要在请求中使用主机头。主机应该是您的自定义域名。

curl https://<cf-id>.cloudfront.net/myapi -H "Host: api.myapi.com"

对我来说,添加主机头是缺失的部分。我需要一个API密钥才能使用APIG,已经提供了x-api-key自定义头,但是没有主机头,使用Cloudfront时请求总是被禁止。 - Thiago Silva
2
这才是真正的答案! - Nate Barbettini
26
不,不是这样的。使用自定义域名的整个目的就是可以使用“它”,而不是使用“cloudfront.net”。 - JamesQMurphy
1
在将其连接到“真实”域之前,验证一切是否正常运行非常有用。 - shrumm
我用Postman尝试了一下,解决了问题的一半。但是在AJAX请求中无法设置Host头,浏览器不允许这样做。有没有解决办法? - Steven
在我的情况下,添加此 Host 标头并使用我想要的 api.example.com 是允许我的 api.example.com Route 53 记录通过的 - 我没有触及我的 cloudfront 控制台选项卡。 - Fernando Piancastelli

21

在我的情况下,我需要添加基本路径映射。


2
是的,即使您不想在URL布局中添加额外的位(例如api.mydomain.com/whatever),为了使其正常工作,您仍需要添加“/”基本路径映射。 - bormansquirrel
这个答案解决了我的问题。 - Jesse Barnum
资源名为'aws_api_gateway_base_path_mapping' - 在文档中很容易被忽略,因为'aws_api_gateway_domain_name'的示例没有明确包含它。 - Joseph Siefers

6
在我的情况下,问题是我没有在自定义域名配置中创建API映射到api-gateway。
Api网关主菜单->自定义域名->在列表中选择您新创建的自定义域名->单击右侧的api映射->在部署的api和自定义域名之间创建映射。

1

在我的情况下,遗留缓存设置标头是问题所在。

如果您在云前端行为中选择了遗留缓存设置,则在云前端分发中的行为-> 遗留缓存设置-> 标头下拉菜单中选择值为“无”可以解决我的问题。

请注意保留HTML标签。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - l33tHax0r

0
我会在这里再发表一个答案,因为我们的情况有点复杂,这可能会为将来的某个人节省很多时间(我也把自己算在内)。
我们正在使用全球加速器为一些API提供静态IP。关键在于其中一个API仍在使用EDGE端点而不是PRIVATE端点。这导致了相同的{"message":"Forbidden"}问题,尽管域名映射正确,并且API网关执行日志中没有任何内容。

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