API 网关缓存与 CloudFront

API Gateway Caching vs CloudFront

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

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

GET /pagesRead/4
Some-Header: fizz

这returns,例如,'29页'

然后有一个 post 将 id 4 更新为“45 页”

如果我提出这个要求

GET /pagesRead/4
Some-Header: buzz

现在return'45页'

但我使用的是 API 网关,它显然在幕后拥有自己的 CloudFront。有没有一种方法可以配置 API 网关以使用其 'behind-the-scenes' CloudFront 将我的自定义 header 列入白名单?这还需要做吗?

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

我理解正确吗?如果我只想让我的 headers 成为缓存键的一部分,那么 'Enabling API Caching'[=57 之间有什么区别=] 网关并在 API 网关和 CloudFront 中的 white-listing 之上添加 CloudFront 实例?

更新:

我在 API 网关中添加了这样的 header:

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

GET /pagesRead/4 test-header: buzz

区别在于 API 网关实际上并不使用 CloudFront 缓存。 CloudFront 确实为 所有 API 网关 APIs edge-optimized API 端点提供一些 front-end 服务,但缓存不似乎是其中之一,基于以下内容:

API Gateway enables caching by creating a dedicated cache instance.

...和...

You should not use the X-Cache header from the CloudFront response to determine if your API is being served from your API Gateway cache instance.

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

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

对于您想要将 API 网关置于您自己的 CloudFront 分配之后的应用程序,使用新的区域端点之一来部署您的 API 阶段。

it will consider my headers as part of the cache key.

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


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

当您在 API 网关中启用缓存时,

您还可以选择添加,

RequestPath
QueryStringParameters
Http Headers

例如,

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

以上 url 为您提供了缓存选项,

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

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

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

可选择包含 Http Headers:您可以包含常规 header,如 User-Agent 或自定义 headers

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

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

希望对您有所帮助。