API网关缓存与CloudFront

时间:2017-09-29 14:03:45

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

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

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

GET /pagesRead/4
Some-Header: fizz

这会返回' 29页'

然后有一条帖子更新了 ID 4到45页

如果我提出此请求

GET /pagesRead/4
Some-Header: buzz

现在将返回' 45页'

但我正在使用API​​网关,显然它在幕后拥有了自己的CloudFront。有没有办法我可以配置API网关使用它的幕后花絮' CloudFront将我的自定义标题列入白名单?这甚至需要做吗?

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

我是否理解正确?如果我想要的是我的标题是缓存键的一部分,那么 API网关中'启用API缓存之间的区别是什么?在API网关之上的CloudFront 实例和在CloudFront中的白名单?

更新

我在API网关中添加了这样的标题: enter image description here

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

GET /pagesRead/4 test-header: buzz

2 个答案:

答案 0 :(得分:8)

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

  

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

...和...

  

您不应使用CloudFront响应中的X-Cache标头来确定您的API是否来自API网关缓存实例。

     

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

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

对于要将API Gateway置于自己的CloudFront分配之后的应用程序,请使用其中一个新的区域端点来部署API阶段。

  

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

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

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

答案 1 :(得分:0)

在API网关中启用缓存时,

您也可以选择添加

RequestPath
QueryStringParameters
Http Headers

如,

  

http://example.com/api/ {feature} /?queryparam = queryanswer [with header customheader = value1]

以上网址为您提供了基于

缓存的选项

只有没有PathParameters的网址: http://example.com/api/

可选择包含PathParameter:http://example.com/api/ {feature} /

可选择包含QueryStrings:http://example.com/api/ {feature} /? queryparam = queryanswer

可选择包含Http标头:您可以包含常规标头,如User-Agent或Custom header

无论您在API网关中使用哪种缓存模式,您也可以在CloudFront下使用它。

另外清除缓存,在您的http响应中发送缓存控制:max-age = 0

希望它有所帮助。

CloudFront cache image