我在api网关后面有一个lambda函数。使用调用URL 触发时,此功能正常。调用URL是阶段下方法选项卡中提供的链接。
我想为我的api设置一个自定义域,所以我按照标准程序设置了ACM证书。除此之外,我在route53中设置了域名(api.tarkshala.com)。检查下面给出的截图。
但是当我使用cloudfront链接(d3pn2j4magp6tp.cloudfront.net)或使用POSTMAN的域名(api.tarkshala.com)访问API时,它最终会进入 403 Forbidden 。
我不知道我到底错过了什么?
响应标题如下所示:
Connection →keep-alive
Content-Length →23
Content-Type →application/json
Date →Fri, 13 Apr 2018 03:17:25 GMT
Via →1.1 a1cf0e6cf29b584b5fe1ada9ccee9758.cloudfront.net (CloudFront)
X-Amz-Cf-Id →9Jh5HeQIuDNfm5WGlTae34oYZ7BiN3nI2VlH_8PJHLQ0mr2C20njJQ==
X-Cache →Error from cloudfront
x-amz-apigw-id →FQoiyF1phcwFVrg=
x-amzn-ErrorType →ForbiddenException
x-amzn-RequestId →3013c239-3ec9-11e8-abe6-53449bcfc96c
响应:
{
"message": "Forbidden"
}
答案 0 :(得分:1)
文档似乎没有提到与API网关端点关联的CloudFront分配配置的一个重要方面......似乎只能推断出来:
为边缘优化API创建自定义域名时,API Gateway会设置CloudFront分配。但您必须设置DNS记录,以便将自定义域名的API请求映射到CloudFront分配域名[按顺序],以便通过映射的CloudFront分配[正确]路由到API网关[并在他们到达时理解] 。您还必须提供自定义域名的证书。 (强调添加,括号内的单词是我的,为清晰起见而添加)
https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html
在内部,CloudFront发行版有两种方式处理传入请求中的Host
标头 - CloudFront可以移交浏览器提交的Host
标头,如果它位于列表中期望值,或者总是可以将单个静态值传递给它从原始配置推断出的后端原点。
对于由API Gateway管理的CloudFront发行版,配置显然是通过浏览器发送的内容,这很有意义,因为另一个替代方案需要API网关进行额外的传入请求操作至少可以说是错综复杂的。
因此,要在API网关部署上测试自定义域名,请求者必须将自定义域名包含为HTTP Host
标头。 cloudfront.net别名目标主机名仅用于 用于DNS映射 - 它不是API网关在处理传入请求时实际与部署阶段关联的备用主机名。
如果您的自定义域名指向" target" DNS中的域名,并且您通过自定义域访问API,这一切都会自动发生。否则,您可以手动设置Host
标题,以便进行测试,如果您使用的工具允许它。