CloudFront 区域 API 网关

Regional API Gateway with CloudFront

亚马逊发布new feature - to support regional api endpoints

这是否意味着我可以在向 Lambda 微服务发送请求的两个区域中部署相同的 API 代码? (这将是两个不同的 Https 端点)

让 CloudFront 为我分配流量?

有代码片段吗?

这意味着您可以根据区域部署您的 API,从而减少延迟。

一个用例是,假设您有一个调用 API 请求的 Lambda 函数。如果 Lambda 和 API 都在同一区域,那么您可以获得高性能

请看https://docs.aws.amazon.com/apigateway/latest/developerguide/create-regional-api.html

Does it mean I can deploy my same API code in two regions which sends request to Lambda micro-services? (It will be two different Https endpoints)

这已经成为可能。您已经可以在多个区域部署相同的 API 代码,并使用 API 网关创建不同的 HTTPS 端点。

你以前不能做的是配置 API 网关 API 不同区域的端点期望相同的主机名——这是一个以前不可用的关键功能,如果您想使用 API 网关进行地理路由或故障转移方案。

使用之前的设置——现在已重命名 "Edge-Optimized Endpoints"——每个 API 网关 API 都有一个区域端点主机名,但在 CloudFront 后面自动配置。从任何地方访问您的 API 意味着您是通过 CloudFront 访问它,这意味着从 API 客户端(全球任何地方)到您的 API 的优化连接和传输通过 AWS Edge Network 的主区域,该网络为 CloudFront、Route 53 和 S3 Transfer Acceleration 提供支持。

总的来说,这很好,但在某些情况下,还可以更好。

称为区域 API 端点的新配置产品不使用 CloudFront 或边缘网络...但是您的 API 仍然只在一个区域(但请继续阅读)。

区域 API 端点在这些情况下是有利的:

如果您的流量来自该区域内的 EC2,这将避免跳转到边缘网络并再次退出的必要性,这将优化来自同一 EC2 区域内的 API 请求的性能。

如果您想在您控制的 CloudFront 分配后面部署一个 API 网关端点(例如,为了避免跨域复杂性,或者以其他方式将 API 网关集成到一个更大的站点中) ,这以前要求您将 CloudFront 分配指向由 API Gateway 管理的 CloudFront 分配,从而循环两次 CloudFront,这意味着传输延迟和一些灵活性损失。

创建区域 API 端点允许您将自己的 CloudFront 分配直接指向 API 端点。

如果您在单个区域中有一个 API,并且可以从全球各地的点访问它,并且您自己没有使用 CloudFront,那么边缘优化端点几乎肯定仍然是最好的方式去。

但区域 API 端点在涉及自定义域名时变得有趣。由于 API Gateway 对 CloudFront 的依赖,以前无法在多个 AWS 区域创建具有相同自定义域名(例如 api.example.com)的 API。 CloudFront 是一项全球服务,因此主机名命名空间也是全球性的——全球只有一个 CloudFront 分配可以响应特定的传入请求主机名。由于区域 API 端点不依赖于 CloudFront,因此可以在多个 AWS 区域中使用相同的自定义域名配置 API。

因此,假设您想在 us-east-2 和 us-west-2 中为 api.example.com 提供服务,您需要部署个人 API,然后在每个区域中,使用区域 API 端点在每个区域为 api.example.com 创建自定义域名配置,为每个部署选择一个 ACM 证书。 (这需要与 API 在同一区域的 ACM 证书,而不是总是在 us-east-1。)

这会为您提供两个不同的主机名,每个区域各一个,供您用于 DNS 路由。它们看起来像这样:

d-aaaaaaaaaa.execute-api.us-east-2.amazonaws.com
d-bbbbbbbbbb.execute-api.us-west-2.amazonaws.com

接下来呢?

您使用 Route 53 基于延迟的路由为 api.example.com 创建了一个 CNAME 记录,其中有两个目标——一个来自 us-east-2,一个来自 us-west-2——指向两个目标各自的名称,以及对目标的健康检查。 Route 53 将自动将 DNS 查询解析到距离请求者较近的区域端点。例如,如果您尝试从 us-east-1 到达 API,您的 DNS 查询将转到 Route 53,但那里没有 us-east-1 的记录,因此 Route 53 确定 us-east- 2 是两个区域中较近的一个,并且——假设 us-east-2 端点已通过其健康检查——Route 53 returns 指向 d-aaaaaaaaaa.execute-api.us-east-2.amazonaws.com 的 DNS 记录。

因此,此功能创建了在多个 AWS 区域部署 API 的能力,这些区域将响应相同的主机名,这对于边缘优化的 API 端点是不可能的(因为所有端点都是,在此新功能宣布之前)。

And have CloudFront distribute the traffic for me?

不完全是。或者,至少,不是直接的。 CloudFront 不会根据请求者的区域确定来源,但 Lambda@Edge dynamic origin selection 可用于根据请求者的大致位置修改来源服务器(通过评估哪个 API 区域最接近恰好为特定请求提供服务的 CloudFront 边缘)。

但是,正如您在上面看到的,Route 53 基于延迟的路由可以为您做到这一点。然而,仍然有一个令人信服的理由将此配置置于 CloudFront 分发之后,无论如何......实际上有两个原因......

这本质上是一个 DNS 故障转移配置,当访问是由浏览器或 Java 程序员进行访问时,这是众所周知的不可靠 Java 似乎无限期地缓存 DNS 查找。浏览器对此也不好。在您的 DNS 故障转移配置之前使用 CloudFront,您不必担心客户端会缓存您的 DNS 查找,因为 CloudFront 会正确执行。您的 Route 53 记录的 TTL(用作 CloudFront 后面的原始服务器)的行为符合预期,因此区域故障转移正确发生。

将此配置置于 CloudFront 后面的第二个原因是您是否希望在边缘网络上传输流量。如果请求仅来自托管 API 的两个 AWS 区域,这可能没有帮助,但否则应该会提高整体响应能力。


请注意,跨区域的地理冗余并不是可以在每个场景中使用 API 网关完全透明地完成的事情——这取决于您如何使用它。想到的一个有问题的案例涉及您需要针对传入请求进行 IAM 身份验证的设置。 X-Amz-Credential 包括目标区域,签名当然会有所不同,因为 Signature V4 中的签名密钥基于 secret/date/region/service/signing-key 范例(这是一个绝妙的设计,但我离题了)。这会使设置复杂化,因为调用者不知道目标区域。可能还有其他并发症。 Cognito 可能有类似的并发症。但对于通过您自己的应用程序令牌、cookie 等机制完成身份验证的简单 API,此新功能非常重要。

有点有趣的是,在宣布这项新功能之前,我实际上正在设计一个托管服务,该服务将处理故障转移和请求的地理路由到跨区域 API 网关的冗余部署,包括一种能够补偿签名中所需的不同区域的机制。我正在从事的工作的未来前景目前还不太明朗。