我对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中的白名单?
更新
但是在GET上,我从缓存中获取过时的数据。
GET /pagesRead/4 test-header: buzz
答案 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-*-Viewer
和CloudFront-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
希望它有所帮助。