使用Forbidden响应aws cloudfront api端点(403)

时间:2018-04-13 03:35:26

标签: amazon-web-services aws-api-gateway

我在api网关后面有一个lambda函数。使用调用URL 触发时,此功能正常。调用URL是阶段下方法选项卡中提供的链接。

enter image description here

我正在向资源发送请求,如下所示,这很好用。 enter image description here

我想为我的api设置一个自定义域,所以我按照标准程序设置了ACM证书。除此之外,我在route53中设置了域名(api.tarkshala.com)。检查下面给出的截图。

导入ACM证书 enter image description here

自定义域映射 enter image description here

在route53中映射的域名 enter image description here

但是当我使用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"
}

1 个答案:

答案 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标题,以便进行测试,如果您使用的工具允许它。