亚马逊AWS官方博客

使用 AWS Global Accelerator 加速全球访问

背景及介绍

如果您的应用程序通过公共 Internet 向全球用户提供访问,那么当用户遍历多个公共网络到达你的应用程序时,他们可能会获得不一致的可用性和性能。因为这些公共网络有可能会发生拥塞,而每次跳转都会带来可用性和性能的风险。而这挑战则可以借助于AWS Global Accelerator服务进行改善。

AWS Global Accelerator 是一种网络服务,可以提高您为全球用户提供的应用程序的可用性和性能。它依赖AWS分布全球的骨干网和边缘节点(Edge location),将 Internet 流量从您的用户引导至您在 AWS 上运行的应用程序,从而使您获得更加一致的用户体验。由于使用了AWS 骨干网,所以网络性能拥有更少的抖动和拥塞。

另外该服务可以轻松设置、配置和管理。它通过全球静态 IP 地址(Global Static IP Address)为您的应用程序提供固定的入口点,并消除了为不同 AWS 区域和可用区管理特定 IP 地址的复杂性。

 

使用场景

AWS Global Accelerator 适用的场景有游戏行业,一般来说,游戏需要全球部署。玩家从世界各地接入不同region的游戏服务器,并对网络连接的性能非常高的要求,任何的网络延迟都会对可玩性造成影响,影响游戏的体验。同样,对于金融行业也是适用的。对于支付系统,任何的服务不可用会导致业务收入的减少。

另外 Global Accelerator 提供了 Anycast 静态 IP 地址,对于安全行业中应用需要使用静态IP地址作为白名单来说也是适用的。由于少量的静态IP,所以便于安全系统的系统管理员进行管理。Global Accelerator提供了几项关键功能,可帮助您分配流量,同时提高应用程序的可用性和性能。

您可以在一个或多个AWS区域中使用加速器,从而为最终用户提供更高的可用性和性能。媒体,金融和游戏组织通常使用的低延迟应用程序将受益于Accelerator对AWS全球网络的使用以及用户与边缘网络之间的优化。另外,也适合于数字出版业,移动应用,物联网,广告业等。

 

原理

在不使用 Global Accelerator 的情况下,终端用户如果需要访问位于AWS各个区域(Region)的应用程序,从网络的访问路径上看,可能需要经过不同的ISP或许多网络节点才能到达应用程序。进出应用程序的路径可能不同。所以网络的性能并不能确保足够稳定。可能由于不同的ISP或者不同路由,访问应用系统会带来抖动。

当新建 AWS Global Accelerator 后,该服务分配两个由独立网络区域 (NetWork Zone) 提供服务的 IPv4 静态 IP 地址。而这组静态 IP 地址从逻辑上可以表示AWS 上托管的应用程序的固定入口点。不管应用程序或者负载均衡的IP地址如何变化,但对于 AWS Global Accelerator 对外提供的静态地址来讲,是没有影响的。这能够更加轻松地管理全球应用程序,消除了管理不同 AWS 区域和可用区的不同 IP 地址的复杂性。

具体的原理如下:

 

服务特性

通过使用这些静态IP地址,您可以将用户流量载入尽可能靠近该用户的 AWS 全球网络,从而提高面向用户的服务质量 (QoS)。由于可以使用DNS的A记录指向Global Accelerator所提供的静态IP地址,无需依赖于客户端设备的 IP 地址缓存设置,如果更改可用区或 AWS 区域的终端节点配置,不必更新 DNS 配置或对面向客户端的应用程序进行修改。

AWS Global Accelerator 支持后端的节点类型有网络负载均衡器(NLB),应用负载均衡器(ALB),以及弹性IP地址(EIP)三种类型。因为可以依赖NLB,ALB以及EIP的健康检查服务,持续监控应用程序终端节点的运行情况。当终端节点发生故障时,AWS Global Accelerator 可以绕过绕过故障终端节点进行路由,将流量路由到正常提供服务的终端节点,而无需让客户端感知变化,提高了应用系统的可用性。

另外AWS Global Accelerator支持故障自动转移功能,如果运行状况发生变化或您进行配置更新,AWS Global Accelerator 会立即做出反应,将您的用户路由到下一个可用终端节点。故障自动转移的功能不仅在可以在同一Region的不同可用区直接切换,也支持在不同的Region之间进行切换,并且无需更新 DNS 配置或更改面向客户端的应用程序配置。

AWS Global Accelerator使您能够构建将状态保持为基本要求的应用程序。有状态应用程序在初始连接后将用户路由到同一端点。Global Accelerator通过将客户端请求者的SourceIP设置为维护状态的标识符来实现此目的,而不管端口和协议如何。

如果需要对应用程序进行A/B测试或者蓝绿部署,那么需要对分布不同Region的终端节点分配不同的流量,而这可以通过对终端节点组配置流量调配权重百分比(Traffic Dial),为特定 AWS 区域调高或调低流量,以进行更精细的控制。

 

核心组件

网络区域 (Network Zone)

网络区域为来自唯一IP子网的加速器的静态IP地址提供服务。与AWS可用区类似,网络区域是一个独立的单元,具有自己的一组物理基础结构。配置加速器时,Global Accelerator会为其分配两个IPv4地址。如果由于某些客户端网络阻止IP地址或网络中断,网络区域中的一个IP地址变得不可用。

预置 AWS Global Accelerator 时,将为您分配两个由独立网络区域(Network Zone)提供服务的 IPv4 静态 IP 地址。而网络区域类似于可用区,这些网络区域是隔离的单元,具有自己的物理基础设施。一个网络区域不能影响另外的一个网络区域,保证了Global Accelerator的高可用性。

静态任播(Anycast) IP地址

网络区域为来自唯一IP子网的加速器的静态IP地址提供服务。与AWS可用区类似,网络区域是一个独立的单元,具有自己的一组物理基础结构。配置加速器时,Global Accelerator会为其分配两个IPv4地址。如果由于某些客户端网络阻止IP地址或网络中断,网络区域中的一个IP地址变得不可用,

Global Accelerator 使用静态 IP 地址作为进入 AWS 区域内托管的应用程序的固定入口点。这些 IP 地址是来自 AWS 边缘站点的 Anycast,这意味着这些 IP 地址是从多个 AWS 边缘站点宣布的,进而使流量能够以尽可能接近您的用户的方式进入 AWS 全球网络。在不同的网络区域之间使用 Anycast BGP 宣告。您可以将这些地址与区域AWS资源或端点相关联,例如网络负载均衡器,应用程序负载均衡器和弹性IP地址。在修改或替换端点时,无需进行任何面向客户端的更改或更新DNS记录。加速器的IP地址是静态的,可作为面向用户的应用程序的前置。

示例如下:在Network Zone A 的 CIDR 为 192.0.2.0/24, Network Zone B 的 CIDR为 192.51.1100.0/24

倾听器 (Listener)

侦听器根据您配置的协议和端口处理从客户端到Global Accelerator的入站连接。每个侦听器都有一个或多个与之关联的端点组,并且流量将转发到其中一个组中的端点。通过指定要将流量分配到的区域,可以将端点组与侦听器关联。流量被分发到与侦听器关联的端点组内的最佳端点。

端点组(Endpoint Group)

每个端点组都与特定AWS区域相关联。端点组包括Region中的一个或多个端点。您可以通过调整称为流量拨号的设置来增加或减少将以其他方式定向到端点组的流量百分比。例如,通过流量拨号,您可以轻松地对跨不同AWS区域的新版本进行性能测试或蓝/绿部署测试。

端点(EndPoint)

端点是弹性IP地址,网络负载均衡器或应用程序负载均衡器。根据多种因素将流量路由到端点,包括与用户的地理位置,端点的运行状况以及您选择的配置选项(如端点权重)。对于每个端点,您可以配置权重,这些数字可用于指定路由到每个端点的流量比例。例如,这可以用于在Region中执行性能测试。

AWS Global Accelerator 流程

假设用户在Route53上设置了一个域名,域名的解析记录类型是A-IPv4地址,而值指向Global Acclerator的两个静态任播IP地址。

Step1: 当用户请求DNS域名解析时,会返回一个静态任播IP地址时,请求首先通过Anycast BGP协议通过公共互联网路由到附近的Global Acclerator 边缘节点。

Step2:检查协议和监听端口,如何符合,则根据如下条件选择端口组

  • 离该边缘站点最接近的区域 (Region)。
  • Traffic dial 配置
  • 端点组中端点的运行健康状况。

Step3: 如果最靠近边缘位置的端点组的Trffic dial 配置为100%并且Region中的端点已经通过运行状况检查,则通过AWS全局网络转发请求。如果最靠近边缘位置的端点组将Trffic dial配置为小于100%,则边缘位置接收的请求百分比将发送到最近的端点组,其余请求将分配给其他端点组加权地理位置接近和Trffic dial设置。在所有情况下,端点组中的端口都必须通过健康检查才能接收请求。

Step4:对于具有多个端点的端点组,Global Accelerator使用基于协议,源IP地址,目标IP地址,源端口和目标端口的5元组哈希来跨端点传播流量。如果配置了端点权重,则Global Accelerator会根据您为其分配的权重将流量发送到端点,该权重占组中所有端点的总权重的比例。

您可以开始配置AWS Global Accelerator并将其与运行在其上的应用程序相关联:网络负载均衡器,应用程序负载均衡器,或弹性IP地址。然后,AWS Global Accelerator会从AWS网络分配两个静态Anycast IP地址,作为工作负载的入口点。AWS Global Accelerator支持TCP和UDP协议,对目标端点进行运行状况检查,并将流量从不健康的应用程序中分离出来。

 

创建步骤

首先创建Global Accelerator后会得到两个静态的IP地址,然后设置监听端口。对于流入的流量,转发给后端的端口组。

逻辑示意图

具体创建步骤如下:

创建Global Acclerator

创建加速器,它将预置与其相关联的静态 IP 地址。然后,根据您指定的协议和端口,配置一个或多个侦听器来处理从终端客户端到加速器的入站连接。

在Route 53 中 创建公有托管区域,在公有托管区域中创建记录集(类型:A-IPV4 地址),路由策略字段选择 “简便”

如图所示

配置终端节点组(Endpoint groups)

通过指定要将流量分配到的 AWS 区域,选择一个或多个区域终端节点组来与加速器的侦听器相关联。侦听器将请求路由到此终端节点组中已注册的终端节点。AWS Global Accelerator 使用为每个终端节点定义的运行状况检查设置监控组内终端节点的运行状况。您可以为每个终端节点组配置流量调配百分比,从而控制终端节点组将接受的流量。默认情况下,所有区域终端节点组的流量调配都设置为 100%。

选择终端节点的策略

Global Accelerator周期性对目标终端节点进行运行状况检查,并将流量从运行状况不佳的应用程序中路由选择分离出来

您能够利用 AWS Global Accelerator 构建以状态为基本要求的应用程序。在初始连接后,有状态的应用程序会将用户路由到同一终端节点。Global Accelerator 通过将客户端请求者的 SourceIP 设置为维护状态的标识符来实现此目的,且不管端口和协议如何。

如果您使用有状态应用程序,您可以选择将来自用户的所有请求定向到同一终端节点,而不考虑源端口和协议,从而保持客户端关联。这让您实现了精细控制。

即时区域故障转移:AWS Global Accelerator 会自动检查应用程序的运行状况,并仅将用户流量路由到运行状况良好的应用程序终端节点。如果运行状况发生变化或您进行配置更新,AWS Global Accelerator 会立即做出反应,将您的用户路由到下一个可用终端节点。

高可用性:AWS Global Accelerator 采用故障隔离设计,可提高应用程序的可用性。预置 AWS Global Accelerator 时,将为您分配两个由独立网络区域提供服务的 IPv4 静态 IP 地址。类似于可用区,这些网络区域是隔离的单元,具有自己的物理基础设施和来自唯一 IP 子网的服务静态 IP 地址。如果由于 IP 封锁或无法访问的网络而导致一个静态 IP 地址变得不可用,AWS Global Accelerator 会重新路由到其他隔离网络区域内运行状况良好的静态 IP 地址,以此为客户端应用程序提供容错功能。

客户端缓存 IP 地址无变化:由于某些客户端设备和 Internet 解析器会长时间缓存 DNS 答案,因此在配置更新、应用程序故障或路由首选项更改时,您不知道用户在多久之后才能获得最新 IP 地址。使用 AWS Global Accelerator,您无需依赖于客户端设备的 IP 地址缓存设置。更改传播时间只需几秒钟,从而减少了应用程序的停机时间。

经过提升的性能:AWS Global Accelerator 通过任播静态 IP 地址从最靠近终端客户端的边缘站点中获取流量。这些流量流经无封锁且冗余的 AWS 全球网络,从而能优化通向您在 AWS 区域中运行的应用程序的路径。AWS Global Accelerator 根据终端客户端的地理位置选择最佳 AWS 区域,从而能减少首字节延迟并提高性能。

易管理性:静态 IP 地址是固定的,为您的应用程序提供单一入口点。这让您可以轻松在可用区或 AWS 区域之间移动终端节点,而不必更新 DNS 配置或面向客户端的应用程序。使用案例包括 A/B 测试、应用程序更新和故障转移模拟。企业代理还可以将您应用程序的静态 IP 地址列入他们防火墙中的白名单。

精细控制:AWS Global Accelerator 允许您为区域终端节点组设置权重。这使您可以在执行性能测试或应用程序更新时为特定 AWS 区域调高或调低流量。此外,

为终端节点组注册终端节点

您可以在每个终端节点组中注册一个或多个区域资源,比如弹性 IP 地址、Application Load Balancer 或网络负载均衡器。然后,您可以选择路由到每个终端节点的流量。以下的截图只选用了Application Load Balance做示例。

 

测试

为了模拟用户从全球进行范围,分别再美国(俄勒冈region)及日本(东京region)分别分别创建1台EC2并安装WebServer,然后使用Global Acclerator指向这两台EC2。然后

Web Server 1: 美西-俄勒冈, IP 地址 34.217.239.xx

Web Server 2: 日本-东京, IP 地址 13.112.153.xx

模拟用户分别从美国和中国请求。对于美国的用户(52.12.86.xx)来讲,Gloabal Acclerator 会选择离用户最近的34.217.239.xx作为返回。

从美国发起请求(部分IP地址使用xx代替)

[ec2-user@ip-10-192-10-xx ~]$ curl ip.tl
IP: 52.12.86.xx
Amazon.com, Inc. (AS165xx) Boardman Oregon United States
[ec2-user@ip-10-192-10-xx ~]$ curl www.fxxxxxxxxx.tk/index.html
www index.html
34.217.239.xx
us-west-2

对于中国的用户(52.12.86.xx)来讲,Gloabal Acclerator 会选择离用户最近的并位于日本的(13.112.153.xx)作为返回。

从中国发起请求(部分IP地址使用xx代替)

➜  ~ curl ip.tl
IP: 54.222.61.xx
中国 北京市 AS48xx 亚马逊(Amazon)公司数据中心
➜  ~ curl www.fxxxxxxxxx.tk/index.html
ec2-13-112-153-xx.ap-northeast-1.compute.amazonaws.com
13.112.153.xx
ap-northeast-1a

通过上述的验证,AWS Global Accelerator 都会智能地将流量路由到提供最佳应用程序性能的终端节点,从而加速用户的访问。

 

日志记录 Flow Log

AWS Global Acclerator 同样也具有类似于VPC Flow Log的功能,通过Flow Log,您可以在AWS Global Accelerator中捕获有关进出加速器中网络接口的IP地址流量的信息。流日志数据发布到Amazon S3,您可以在创建流日志后检索和查看数据。

Flow Log可以帮助您完成许多任务。例如,您可以解决特定流量未到达端点的原因,从而帮助您诊断过度限制的安全组规则。您还可以使用流日志作为安全工具来监控到达端点的流量。

Flog Log 记录表示流日志中的网络流。每条记录捕获特定捕获窗口的特定5元组的网络流。 5元组是一组五个不同的值,用于指定IP流的源,目标和协议。捕获窗口是流日志服务在发布流日志记录之前聚合数据的持续时间。捕获窗口大约需要10秒钟,但最多可能需要1分钟。Flow日志收集流日志记录,将它们合并到日志文件中,然后以5分钟为间隔将日志文件发布到Amazon S3存储桶。每个日志文件都包含前五分钟记录的IP地址流量的流日志记录。

另外,日志文件的最大文件大小为75 MB。如果日志文件在5分钟内达到文件大小限制,则流日志将停止向其添加流日志记录,将其发布到Amazon S3存储桶,然后创建新的日志文件。

如何开启AWS Global Acclerator 流日志功能

1.在您的AWS账户中为您的流日志创建Amazon S3存储桶。

2.为正在启用流日志的AWS用户添加以下IAM策略。 有关更多信息,请参阅用于将流日志发布到Amazon S3的IAM角色。

IAM Policy 如下

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DeliverLogs",
"Effect": "Allow",
"Action": [
"logs:CreateLogDelivery",
"logs:DeleteLogDelivery"
],
"Resource": ""
},
{
"Sid": "AllowGlobalAcceleratorService",
"Effect": "Allow",
"Action": [
"globalaccelerator:"
],
"Resource": ""
},
{
"Sid": "s3Perms",
"Effect": "Allow",
"Action": [
"s3:GetBucketPolicy",
"s3:PutBucketPolicy"
],
"Resource": ""
}
]
}

3.运行以下AWS CLI命令,请根据实际情况替换如下变量Amazon S3存储桶名称(globalac??? ),前缀 (P????) 和 AccountID (8?????????):

aws globalaccelerator update-accelerator-attributes
--accelerator-arn arn:aws:globalaccelerator::8?????????:accelerator/32c0f0af-b5d5-48b5-b743-95ba7e4b2873
--flow-logs-enabled
--flow-logs-s3-bucket globalac???
--flow-logs-s3-prefix P????

4.另外还需要对S3存储桶设置Bucket Policy , 如下变量需要根据实际情况替换 (bucket_name, option_folder, account_id, bucket_name)

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSLogDeliveryWrite",
"Effect": "Allow",
"Principal": {"Service": "delivery.logs.amazonaws.com"},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket_name/optional_folder/AWSLogs/account_id/*",
"Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
},
{
"Sid": "AWSLogDeliveryAclCheck",
"Effect": "Allow",
"Principal": {"Service": "delivery.logs.amazonaws.com"},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::bucket_name"
}
]
}

5.设置好后,访问AWS Global Accelerator, 稍等几分钟,会发现 Flow Log已经存入到S3

具体Flow Log 信息如下

 

限制

截止到2019年6月,Global Accelerator 仅支持IPV4地址,并不支持IPV6地址。

 

总结

借助Global Accelerator,则可以消除影响网络性能的问题,应为该服务借助于分布全球的 Edge Location, 无论用户位于何处,AWS Global Accelerator 都会智能地将流量路由到提供最佳应用程序性能的终端节点。确保用户的网络连接尽快的进入AWS 的骨干网络。而AWS的骨干网络是由AWS完全管理的资源,并且是受到良好监管、无拥塞且冗余的网络,而非借助传统的Intenet, 从而在安全性,性能上得到保障。

 

本篇作者

刘春华

AWS 解决方案架构师,AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内和全球的应用和推广,在大规模并发应用架构、无服务器架构,人工智能与安全等方面有丰富的实践经验。 曾任IBM云架构师,对企业应用迁移到云及应用系统改造有深入的研究。