Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

启用 API 缓存以增强响应能力

您可以在 Amazon API Gateway 中启用 API 缓存以缓存您的终端节点的响应。借助缓存,您可以减少向终端节点发起的调用数量,同时减少向 API 发出的请求的延迟。为某个阶段启用缓存时,API Gateway 会在指定的生存时间 (TTL) 期间 (以秒为单位) 缓存来自终端节点的响应。然后,在响应请求时,API Gateway 会从缓存中查找终端节点响应,而不会向终端节点发出请求。API 缓存的默认 TTL 值为 300 秒。最大 TTL 值为 3600 秒。TTL = 0 表示缓存功能处于禁用状态。

这是一项符合 HIPAA 要求的服务。有关 AWS、《1996 年健康保险可携性与责任法》(HIPAA) 以及使用 AWS 服务处理、存储和传输受保护的医疗信息 (PHI) 的更多信息,请参阅 HIPAA 概述

重要

为某个阶段启用缓存时,默认情况下,仅 GET 方法已启用缓存。这有助于确保您的 API 的安全性和可用性。您可以通过 覆盖方法设置 为其他方法启用缓存。

重要

缓存功能按小时计费,不在 AWS 免费套餐范围内。

启用 Amazon API Gateway 缓存

在 API Gateway 中,您可以为某个指定阶段启用缓存。

启用缓存时,您必须选择一个缓存容量。一般而言,容量越大,性能越高,但成本也更高。

API Gateway 通过创建专用的缓存实例来实现缓存功能。这一过程耗时最多 4 分钟。

API Gateway 通过删除现有缓存实例并重新创建一个具有修改后的容量的新实例来更改缓存容量。所有现有的缓存数据均将被删除。

在 API Gateway 控制台中,您可以在某个已命名的 Stage Editor (阶段编辑器)Settings (设置) 选项卡中配置缓存。

要为指定阶段配置 API 缓存,请执行以下操作:

  1. 转到 API Gateway 控制台。

  2. 选择 API。

  3. 选择 Stages (阶段)

  4. 在 API 的Stages (阶段) 列表中,选择阶段。

  5. 选择 Settings 选项卡。

  6. 选择 启用 API 缓存

  7. 等待缓存创建完成。

注意

API Gateway 大约需要 4 分钟来完成对缓存的创建或删除。缓存创建完成后,Cache status (缓存状态) 值会从 CREATE_IN_PROGRESS 变为 AVAILABLE。缓存删除完成后,Cache status (缓存状态) 值会从 DELETE_IN_PROGRESS 变为一个空字符串。

当您在阶段的 Cache Settings (缓存设置) 中启用缓存时,仅对 GET 方法进行缓存。要确保您的 API 的安全性和可用性,我们建议您不要更改此设置。不过,您可以通过 覆盖方法设置 为其他方法启用缓存。

如果想要验证缓存是否按预期正常运行,您有两种常规选择:

  • 针对您的 API 和阶段,检查 CacheHitCountCacheMissCount 的 CloudWatch指标。

  • 在响应中放置一个时间戳。

注意

您不应使用来自 CloudFront 响应的 X-Cache 标头来确定您的 API 是否由 API Gateway 缓存实例提供服务。

覆盖方法缓存的 API Gateway 阶段级缓存

您可以通过启用或禁用覆盖阶段级缓存设置缓存特定方法;通过增加或减少其 TTL 期限;或通过打开加密或关闭针对缓存响应。

如果您预计某个进行缓存的方法将在其响应中接收敏感数据,请在 缓存设置 中选择 加密缓存数据

要使用控制台为各个方法配置 API 缓存,请执行以下操作:

  1. 通过 https://console.amazonaws.cn/apigateway 登录 API Gateway 控制台。

  2. 转到 API Gateway 控制台。

  3. 选择 API。

  4. 选择 Stages (阶段)

  5. 在 API 的 Stages (阶段) 列表中,展开阶段,然后在 API 中选择方法。

  6. Settings (设置) 中选择 Override for this method (覆盖此方法)

  7. Cache Settings (缓存设置) 区域中,您可以设置或清除 Enable Method Cache (启用方法缓存) 或自定义任何其他所需选项。(仅当启用了 阶段级缓存 时,才显示此部分。)

将方法或集成参数用作索引缓存响应的缓存键

当缓存的方法或集成具有参数(可以是自定义标头、URL 路径或查询字符串格式)时,您可以使用部分或全部参数来构建缓存键。API Gateway 可以缓存方法的响应,具体取决于使用的参数值。

例如,假设您在以下格式中提出一个请求:

GET /users?type=... HTTP/1.1 host: example.com ...

在这个请求中,type 的值可以是 adminregular。如果您添加 type 参数作为缓存键的组成部分,则 GET /users?type=admin 的响应将与 GET /users?type=regular 的响应分开缓存。

当某种方法或集成请求采用多个参数时,您可以选择添加部分或全部参数来创建缓存键。例如,对于在 TTL 期内按列出的顺序提出的以下请求,您可以在缓存键中只添加 type 参数:

GET /users?type=admin&department=A HTTP/1.1 host: example.com ...

该请求的响应会被缓存,并用于响应以下请求:

GET /users?type=admin&department=B HTTP/1.1 host: example.com ...

要在 API Gateway 控制台中将一个方法或集成请求参数添加为缓存键的一部分,请在添加参数后选择 Caching


                将方法或集成参数添加为索引缓存响应的缓存键

在 API Gateway 中刷新 API 阶段缓存

启用 API 缓存时,您可以刷新 API 阶段的整个缓存,以确保您的 API 客户端可以从集成终端节点获得最新响应。

要刷新 API 阶段缓存,可以在 API Gateway 控制台某个阶段编辑器中的Settings (设置) 选项卡中,选择 Cache Settings (缓存设置) 部分下的 Flush entire cache (刷新整个缓存) 按钮。缓存刷新操作几乎可以在瞬间完成。刷新之后,缓存状态将立即变成 AVAILABLE

注意

刷新缓存之后,在重新构建缓存之前,从集成终端节点为响应提供服务。在此期间,发送到集成终端节点的请求数量可能会增加。这可能会临时增加 API 的整体延迟。

使 API Gateway 缓存条目失效

您的 API 客户端可以使某个现有缓存条目失效,也可以从各个请求的集成终端节点重新加载该条目。客户端必须发送一个包含 Cache-Control: max-age=0 标头的请求。客户端将直接从集成终端节点 (而非缓存) 收到响应,前提是客户端获得授权执行此操作。这会将现有缓存条目替换为从集成终端节点获得的新响应。

要为客户端授予权限,请将以下格式的策略附加到用户的 IAM 执行角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:InvalidateCache" ], "Resource": [ "arn:aws:execute-api:region:account-id:api-id/stage-name/GET/resource-path-specifier" ] } ] }

此策略允许 API Gateway 执行服务让指定资源上的请求对应的缓存失效。要指定一组目标资源,请将 account-id 的 ARN 值中的 api-idResource 和其他条目替换为通配符 (*)。有关如何为 API Gateway 执行服务设置权限的更多信息,请参阅 使用 IAM 许可控制对 API 的访问

如果您未应用 InvalidateCache 策略,则任何客户端都可以使 API 缓存失效。如果大部分或全部客户端都使 API 缓存失效,这会显著增加 API 的延迟。

当应用了策略、启用了缓存并设定了权限限制时,您可以从 API Gateway 控制台中的处理未授权的请求选择相应选项,控制对未经授权的请求的处理方式。


                配置缓存失效

这三个选项会引发以下行为:

  • Fail the request with 403 status code (请求失败,显示 403 状态代码): 返回“403 Unauthorized”响应。

    要使用 API 设置该选项,请使用 FAIL_WITH_403

  • 忽略缓存控制标头;在响应中添加一条警告标头:处理请求并在响应中添加一条警告标头。

    要使用 API 设置该选项,请使用 SUCCEED_WITH_RESPONSE_HEADER

  • 忽略缓存控制标头: 处理请求,但不在响应中添加警告标头。

    要使用 API 设置该选项,请使用 SUCCEED_WITHOUT_RESPONSE_HEADER