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-*-Viewer
和 CloudFront-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 的内容编辑了我的帖子。但是,它似乎没有将标题添加到我的缓存键中,因为我不断收到过时的数据。 对于每个请求,您需要更改标头附带的值,以获得新的答案。 我确实在邮递员中尝试过,但没有成功。让我再尝试一次。我经常玩它,所以也许我在邮递员中重复了一个值。我会让你知道它是否有效。谢谢。 @SangminKim 当您连接到边缘优化终端节点时,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的主要内容,如果未能解决你的问题,请参考以下文章