amazon-web-services - 使用CloudFront的区域API网关

标签 amazon-web-services amazon-cloudfront aws-api-gateway regions

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

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

CloudFront是否可以为我分配流量?

有代码片段吗?

最佳答案

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


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

以前,您无法做的是在不同区域中配置API网关API端点以期望使用相同的主机名-如果您希望使用API​​进行地理路由或故障转移,则这是以前不可用的一项关键功能网关。

使用之前的设置(现已更名为“边缘优化的端点”),每个API网关API都具有区域性的端点主机名,但会自动在CloudFront之后进行配置。从任何地方访问您的API意味着您正在通过CloudFront进行访问,这意味着优化的连接和从API客户端(在全球任何地方)的传输,都将通过AWS Edge Network返回到API的本地区域,该网络是强大的网络CloudFront,Route 53和S3传输加速。

总体而言,这很好,但在某些情况下可能会更好。

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

在以下情况下,区域API端点是有利的:

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

如果您想在自己控制的CloudFront发行版后面部署API网关终端节点(例如,避免跨域合并或将API Gateway集成到更大的站点中),则以前需要将CloudFront发行版指向CloudFront由API网关管理的分发,因此两次遍历CloudFront,这意味着传输延迟和灵活性的一些损失。

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

如果您在一个区域中只有一个API,并且可以从全球各地访问它,并且您自己并没有使用CloudFront,那么Edge-Optimized端点几乎肯定是最好的选择。

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

因此,假设您想同时使用us-east-2和us-west-2来提供api.example.com,则需要部署各个API,然后在每个区域中为使用区域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基于延迟的路由为api.example.com创建了一个CNAME记录,其中有两个目标-一个来自us-east-2,一个来自us-west-2-指向两个各自的名称以及运行状况检查在目标上。路由53将自动将DNS查询解析到更靠近请求者的区域终结点。例如,如果您尝试从us-east-1到达API,则DNS查询转到Route 53,并且那里没有us-east-1的记录,因此Route 53确定us-east-2距离最近(假设us-east-2端点已通过其健康检查)-路由53返回指向api.example.com的DNS记录。

因此,此功能使您能够在响应相同主机名的多个AWS区域中部署API,这对于Edge Optimized API端点是不可能的(因为在发布此新功能之前,所有端点都是如此)。


CloudFront是否可以为我分配流量?


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

但是,如上所示,基于Route 53延迟的路由可以为您完成此任务。但是,无论如何,仍然有令人信服的理由将这种配置置于CloudFront发行版之后……实际上有两个理由……

从本质上讲,这是DNS故障转移配置,并且众所周知,当浏览器或Java程序员(尚未听说Java似乎无限期地缓存DNS查找)进行访问时,这是不可靠的。浏览器对此也很不利。将CloudFront置于DNS故障转移配置的前面,您无需担心客户端缓存DNS查找,因为CloudFront可以正确进行。 Route 53记录的TTL(用作CloudFront之后的原始服务器)的行为符合预期,因此可以正确进行区域故障转移。

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



请注意,跨区域的地理冗余并不是在每种情况下都可以使用API​​ Gateway完全透明地完成的-取决于您的使用方式。我想到的一个有问题的情况是涉及一种设置,您需要针对传入的请求进行IAM身份验证。 d-aaaaaaaaaa.execute-api.us-east-2.amazonaws.com包括目标区域,因此签名当然会有所不同,因为Signature V4中的签名密钥基于秘密/日期/区域/服务/签名密钥范例(这是一个出色的设计,但我偏离了主题) 。由于呼叫者将不知道目标区域,因此这会使设置复杂化。可能还有其他并发症。 Cognito可能有类似的并发症。但是对于直接通过您自己的应用程序令牌,Cookie等机制进行身份验证的API来说,这项新功能非常重要。

有趣的是,在宣布这项新功能之前,我实际上是在设计托管服务,该服务将处理故障转移和对跨区域API Gateway冗余部署的请求进行地理路由,包括一种具有补偿能力的机制。签名中要求的不同区域。目前,我正在从事的工作的未来前景还不太清楚。

关于amazon-web-services - 使用CloudFront的区域API网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104118/

相关文章:

java - 使用 Lambda 代理集成通过 API Gateway 从 AWS Lambda 抛出错误

database - 降级AWS RDS实例存储类型和备份保留期限是否会导致停机和数据丢失?

ios - 将视频从亚马逊流式传输到 iOS 设备

amazon-web-services - 限制对云端分发背后的 s3 静态网站的访问

amazon-web-services - Cloudfront 等 CDN 对发行版中可存储的最大缓存量有限制吗?

terraform - 通过 terraform 创建 AWS APIGateway 时出现 BadRequestException

amazon-web-services - 即使 Lambda 返回错误,AWS API Gateway 也会返回 200

amazon-web-services - AWS Cognito 用户池如何防御暴力攻击

amazon-web-services - 如何使用适用于 Golang 的 AWS 开发工具包清空 S3 存储桶?

localization - 云前/S3 : Server different file depending on Request Header