API 网关缓存与 CloudFront

Posted

技术标签:

【中文标题】API 网关缓存与 CloudFront【英文标题】:API Gateway Caching vs CloudFront 【发布时间】:2018-03-11 10:59:59 【问题描述】:

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

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

GET /pagesRead/4
Some-Header: fizz

这会返回,例如,'29 pages'

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

如果我提出这个要求

GET /pagesRead/4
Some-Header: buzz

它现在将返回 '45 pages'

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

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

我理解正确吗?如果我只想让我的标头成为缓存键的一部分,那么 API 网关中的 '启用 API 缓存' 和在顶部添加 CloudFront 实例有什么区别API 网关和 CloudFront 中的白名单?

更新:

我在 API Gateway 中添加了这样的标头:

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

GET /pagesRead/4 test-header: buzz

【问题讨论】:

【参考方案1】:

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

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

...和...

您不应使用 CloudFront 响应中的 X-Cache 标头来确定您的 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 网关现在有 two different kinds of endpoints。原始设计现在称为edge-optimized,而新选项称为regional。区域终端节点不使用 CloudFront 的前端服务,并且在从同一 AWS 区域内的 EC2 访问时可能会提供更低的延迟。当推出新的区域功能时,所有现有端点都被归类为边缘优化。对于区域终端节点,CloudFront-* 标头不会出现在请求中,除非您使用自己的 CloudFront 分配并将这些标头列入白名单以转发到源。

【讨论】:

我用我添加到 APIG 的内容编辑了我的帖子。但是,它似乎没有将标题添加到我的缓存键中,因为我不断收到过时的数据。 对于每个请求,您需要更改标头附带的值,以获得新的答案。 我确实在邮递员中尝试过,但没有成功。让我再尝试一次。我经常玩它,所以也许我在邮递员中重复了一个值。我会让你知道它是否有效。谢谢。 @SangminKi​​m 当您连接到边缘优化终端节点时,DNS 响应中的 IP 地址取决于您的位置,将您带到附近的 CloudFront 边缘,与客户端的 TLS 会话在此终止。 CloudFront 解析请求以识别内部目标,然后找到可用(空闲/可重用、保持活动)连接或创建新连接,返回到部署 API 的区域中的 API Gateway,然后发送请求。这些连接是通过 AWS 管理的网络而不是公共 Internet 进行的,从而优化了它们的延迟和性能。 CloudFront 为 S3 Transfer Acceleration 功能提供了与 S3 类似的功能,这也与 API 网关一样始终显示 X-Cache: Miss from CloudFront,因为 CloudFront 提供的服务不包括缓存。在这两种情况下,客户都没有在 CloudFront 中配置任何内容,并且 CloudFront 不会就 CloudFront 基础设施的伴随使用向客户收费。【参考方案2】:

当您在 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/?queryparam=queryanswer

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

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

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

希望对你有帮助。

【讨论】:

您能帮我导航到可以放入请求路径和 URL 查询字符串参数的页面吗?我非常需要这个,但在任何地方都看不到这些设置。我希望在管理控制台 -> Amazon API Gateway -> APIs -> my api -> Stages -> Settings 中看到它们缓存设置,但它们不是。 @kannaiyan 我们如何根据查询参数/路径参数使缓存失效? 您可以使每个 api 的缓存失效。没有根据查询/路径参数使缓存无效的选项。 aws apigateway flush-stage-cache --rest-api-id 1234123412 --stage-name dev 。如果您的 api 网关带有云前端,则可以通过路径无效。

以上是关于API 网关缓存与 CloudFront的主要内容,如果未能解决你的问题,请参考以下文章

API网关服务-20190908

升级微服务架构5:API网关

cloudfront的默认缓存策略是啥(当常规lambda运行由api网关调用时)

在微服务中使用API网关(Gateway)如此简单

什么是API网关 如何设计亿万级统一网关

如何设计一个亿级API网关?