带有 CloudFront 的区域 API 网关

2023-11-21

亚马逊发布新功能 - 支持区域 API 端点

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

CloudFront 是否为我分配流量?

有代码片段吗?


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

这已经是可能的了。您已经可以在多个区域部署相同的 API 代码并使用 API Gateway 创建不同的 HTTPS 终端节点。

以前,您无法做的是将不同区域中的 API Gateway API 端点配置为具有相同的主机名,如果您想使用 API 进行地理路由或故障转移场景,那么这是以前不可用的关键功能网关。

在之前的设置中(现已更名为“边缘优化端点”),每个 API 网关 API 都有一个区域端点主机名,但会在 CloudFront 后面自动配置。从任何地方访问您的 API 意味着您通过 CloudFront 访问它,这意味着从 API 客户端(全球任何地方)到 AWS 边缘网络(该网络的支持网络)的优化连接和传输回到 API 的主区域CloudFront、Route 53 和 S3 传输加速。

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

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

区域 API 端点在以下情况下具有优势:

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

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

创建区域 API 终端节点后,您可以将自己的 CloudFront 分配直接指向 API 终端节点。

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

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

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

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

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

那么,接下来怎么办?

您使用 Route 53 基于延迟的路由来创建 CNAME 记录api.example.com有两个目标(一个来自 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 返回指向的 DNS 记录d-aaaaaaaaaa.execute-api.us-east-2.amazonaws.com.

因此,此功能创建了在多个 AWS 区域部署 API 的能力,这些 API 将响应相同的主机名,而边缘优化 API 端点则无法实现这一点(在宣布此新功能之前,所有端点都是如此)。

CloudFront 是否为我分配流量?

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

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

这本质上是一种 DNS 故障转移配置,当浏览器或未听说过 Java 似乎会无限期缓存 DNS 查找的 Java 程序员进行访问时,这是众所周知的不可靠。浏览器对此也很糟糕。通过将 CloudFront 置于 DNS 故障转移配置之前,您不必担心客户端缓存您的 DNS 查找,因为 CloudFront 可以正确执行此操作。 Route 53 记录(用作 CloudFront 后面的源服务器)的 TTL 行为符合预期,因此区域故障转移正确发生。

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 CloudFront 的区域 API 网关 的相关文章

随机推荐

  • 如何使用 Nokogiri 将嵌套哈希转换为 XML

    我有很多级别的嵌套哈希 例如 foo gt bar foo1 gt foo2 gt bar2 foo3 gt bar3 foo4 gt foo5 gt bar5 我怎样才能将它们转换成这样的XML
  • 如何选择 nHibernate 子查询结果的 Count(*)

    为了在 nHibernate 中分页查询 我需要执行以下操作 Select count from Select e ID e Name from Object as e where 我尝试过以下方法 select count from Ob
  • C# 将字符串“0”解析为整数

    我有一台新笔记本电脑在工作 本周早些时候运行的代码今天不起作用 之前工作的代码经过简化 while dr Read int i int Parse dr GetString 1 现在 当数据库值为 0 时 它会失败 有时 但不可靠 这会起作
  • 使用 pandas 创建矩阵结构

    我已将包含代码和系数数据的以下 CSV 文件加载到以下数据框 df 中 CODE COEFFICIENT A 0 5 B 0 4 C 0 3 import pandas as pd import numpy as np df pd read
  • PHP 中的 A* 搜索算法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有实施A 算法在 PHP 中 我知道维基百科有一个伪代码和一个 C 伪代码的链接 但我似乎找不到已经用 PHP 编写的伪代码 我也在寻找一种高效的书面 A 算法 None
  • 理解java 8流的过滤方法

    我最近了解到StreamJava 8 中的 s 并看到了这个示例 IntStream stream IntStream range 1 20 现在 假设我们想要找到第一个既能被 3 又能被 5 整除的数字 我们可能会filter两次并且fi
  • 具有特定类型的 Backbone.Js 集合

    我有一个名为 History 的 BackboneJS 集合 它可以包含多个 Backbone JS 模型之一 从 HistoryItem 扩展 而 HistoryItem 又从 Backbone Model 扩展 我试图找到一种在加载时重
  • 身份“iPhone Developer”与钥匙串中任何有效、未过期的证书/私钥对不匹配

    我想在设备中测试我的应用程序 但我被这个错误困扰了几个小时 身份 iPhone Developer 与钥匙串中任何有效 未过期的证书 私钥对不匹配 我已经关注了本指南 我在 stackoverflow 上搜索了类似的问题 这可能会有所帮助
  • 检查颜色是否为蓝色(ish)、红色(ish)、绿色(ish)、

    我想实现一个可以按颜色过滤图像的搜索 我的图像模型最多包含该特定图像中出现的 10 个 UIColor 现在我想要一个过滤器 例如蓝色 绿色 红色 黄色 如何检查 使用指定的容差 该特定图像是否包含蓝色 绿色 我尝试使用 CIE94 差异
  • 如何破译 boost asio ssl 错误代码?

    我在 boost asio ssl 实现中偶尔会出现通信失败 boost 返回的超级有用的错误消息是 asio ssl 336458004 我怀疑数字是由 SSL 标志组成的某种聚合构造 我说因为 linux 错误代码 boost asio
  • 从 FileSystemWatcher 错误中恢复的最佳实践是什么?

    After a FileSystemWatcher Error事件被提出 我不知道下一步该做什么 该例外可以是 相对 较小的例外 例如 目录中一次更改太多 这不会影响观察者的观看过程 但它也可能是一个大问题 例如观看的目录被删除 在这种情况
  • 如何以编程方式设置可发现时间而无需用户确认?

    我通常用这个 private void ensureDiscoverable if D Log d TAG ensure discoverable if mBluetoothAdapter getScanMode BluetoothAdap
  • 不使用 Android 导航抽屉显示叠加层

    我想知道是否可以删除最近实现的导航抽屉所做的自动覆盖 第二张图的灰色层 你只需要设置setScrimColor int color 给你的DrawerLayout mDrawerLayout setScrimColor Color WHIT
  • postgresql:共享内存不足?

    我正在使用 Python 和 psycopg2 运行大量查询 我创建了一个包含约 200 万行的大型临时表 然后使用以下命令一次从中获取 1000 行cur fetchmany 1000 并运行涉及这些行的更广泛的查询 不过 广泛的查询是自
  • 如何使用 StoreKit 2 进行恢复?

    iOS 15 引入了 StoreKit 2 我正在研究它 看看是否可以在我现有的应用程序中采用它 但我不知道该怎么做 特别是 我不知道如何实现所需的恢复功能 例如 如果用户删除了我的应用程序 我想我们应该使用Transaction late
  • 当我向 Firebase 实时数据库添加新值时如何保存当前日期/时间

    当我通过控制面板向 Firebase 实时数据库添加新值时 我想将当前日期 时间保存在特定字段中 我怎样才能做到这一点 请帮我 Answer recommended by Google Cloud Collective 最佳实践是将数据保存
  • JSP/JSTL 中的嵌套表达式

    我使用 JSP 作为视图 使用 Spring MVC 3 0 作为控制器 在我的 JSP 中 我想显示当前的日期时间 为此我有以下代码
  • Linux 内核模块字符设备权限

    是否可以在以 mod 666 启动的 Linux 内核模块中创建字符设备 现在它总是 600 由 root 拥有 我必须 chmod 它 我可以创建 udev 条目来解决它 但我真的宁愿模块自动执行它 是否可以 我在 cdev init 或
  • 异步/等待返回 Promise { } [重复]

    这个问题在这里已经有答案了 我的问题是 尽管我使用了 async await 为什么这个日志还是 promise pending 我检查了类似的问题和答案 看起来应该没问题 但事实并非如此 我该如何改变它才能得到结果 为什么 谢谢 cons
  • 带有 CloudFront 的区域 API 网关

    亚马逊发布新功能 支持区域 API 端点 这是否意味着我可以在两个区域部署相同的 API 代码 并向 Lambda 微服务发送请求 这将是两个不同的 Https 端点 CloudFront 是否为我分配流量 有代码片段吗 这是否意味着我可以