13

API Gateway 和 CloudFront 如何协同工作让我有些困惑。最终,我希望能够将自定义标头和值视为我的缓存键的一部分。我知道这可以通过白名单来完成(如果我使用的是 CloudFront)。

所以当我提出以下要求时:

GET /pagesRead/4
Some-Header: fizz

例如,这将返回“ 29 页”

然后有一个帖子将id 4 更新为 '45 pages'

如果我提出这个要求

GET /pagesRead/4
Some-Header: buzz

它现在将返回“45 页”

但我使用的是 API Gateway,它显然在幕后拥有自己的 CloudFront。有没有办法可以将 API Gateway 配置为使用其“幕后”CloudFront 将我的自定义标头列入白名单?这甚至需要做吗?

根据此文档:AWS-API-Gatway,似乎我可以在 API Gateway 中启用 API 缓存,它会将我的标头视为缓存键的一部分。

我是否正确理解这一点?如果我只想让我的标头成为缓存键的一部分,那么API Gateway 中的“启用 API 缓存”与在API Gateway之上添加 CloudFront 实例和 CloudFront中的白名单之间有什么区别?

更新:

我在 API Gateway 中添加了这样的标头: 在此处输入图像描述

但是在 GET 上,我从缓存中获取过时的数据。

GET /pagesRead/4 test-header: buzz
4

2 回答 2

14

不同之处在于 API Gateway 实际上并不使用 CloudFront 缓存。CloudFront 确实为所有 API Gateway API边缘优化 API 端点提供了一些前端服务¹ ,但缓存似乎不是其中之一,基于以下几点:

API Gateway 通过创建专用缓存实例来启用缓存。

...和...

您不应使用X-CacheCloudFront 响应的标头来确定您的 API 是否是从您的 API Gateway 缓存实例提供的。

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-caching.html

可以在您创建的 CloudFront 分配后面级联边缘优化 API 网关端点,但这并非没有某些不便之处。延迟会有所增加,因为您要通过更多系统。鉴于该配置,CloudFront-Is-*-ViewerCloudFront-Viewer-Country标头以及可能的任何客户端 IP 概念都将无效,因为 API Gateway 部署将看到位于其前面的附加 CloudFront 分配的属性,而不是真实客户端的属性。 X-Forwarded-For仍然是正确的,但必须小心处理,因为它将包含一个必须正确处理的额外跃点。

对于您希望将 API Gateway 置于您自己的 CloudFront 分配之后的应用程序,请使用新的区域终端节点之一来部署您的 API 阶段。

它会将我的标头视为缓存键的一部分。

您确实必须根据您引用的文档显式配置缓存键,但是是的,API 网关缓存随后将根据该标头的值和缓存键中的其他属性缓存响应。


¹边缘优化端点。API Gateway 现在有两种不同的端点。原始设计现在称为边缘优化,新选项称为区域。区域终端节点不使用 CloudFront 的前端服务,并且在从同一 AWS 区域内的 EC2 访问时可能会提供更低的延迟。当推出新的区域功能时,所有现有端点都被归类为边缘优化。对于区域终端节点,CloudFront-*请求中不存在标头,除非您使用自己的 CloudFront 分配并将这些标头列入白名单以转发到源。

于 2017-09-29T20:01:07.043 回答
1

当您在 API Gateway 中启用缓存时,

您还可以选择添加,

RequestPath
QueryStringParameters
Http Headers

例如,

http://example.com/api/ {feature}/?queryparam=queryanswer [ 带有标题 customheader=value1 ]

上面的 url 为您提供了基于缓存的选项,

只是没有 PathParameters 的 URL:http://example.com/api/

可选地包括 PathParameter: http://example.com/api/ {feature} /

可选地包括 QueryStrings:http ://example.com/api/ {feature}/? 查询参数=查询答案

可选地包括 Http 标头:您可以包括常规标头,如 User-Agent 或自定义标头

无论您在 API-Gateway 中拥有何种缓存模式,您也可以在 CloudFront 下拥有它。

还要清除缓存,在您的 http 响应中发送Cache-Control: max-age=0

希望能帮助到你。

CloudFront 缓存映像

于 2017-09-29T21:36:01.777 回答