亚马逊AWS官方博客

使用AWS Application Load Balancer实现基于主机名的路由分发

负载均衡器在应用架构设计中是重要的组件,负责接收来自客户端的流量,将流量按一定的算法转发给后端的一组实例,并将后端实例的响应再返回给客户端。AWS提供一款托管的负载均衡服务, Elastic Load Balancer(简称ELB),ELB除了能够做负载均衡分发流量之外,还能对后端的实例健康检查,并将流量仅转发给通过健康检查的实例,同时ELB还能与自动扩展组(Auto Scaling Group)以及监控服务(CloudWatch)配合,设置根据后端实例CPU使用率的高低,流量大小,处理时间长短等指标,自动完成添加或缩减实例数量。

ELB又分两种,Classic ELB和Application Load Balancer(简称ALB),ELB的一个重要组件是侦听器,前者支持4层和7层的协议和端口(TCP,SSL,HTTP,HTTPS),对后端实例按轮询(TCP协议)或者最少未完成请求数(HTTP协议)的算法对后端实例进行流量转发。

ALB是应用层负载均衡器,支持HTTP/HTTPS的协议,与Classic ELB不同的是,ALB支持基于请求路径的分发,即根据HTTP标头的请求URL路径的不同,分发给后端不同的目标组(Target Group)。目标组是一个或多个目标(这里的“目标”可以是EC2实例)的集合,通常一组目标运行相同的应用或服务,一个目标可以注册到一个或多个目标组中。在目标组中可以配置运行状况检查,实例监控,等待连接耗尽及粘性会话等等。ALB中的规则决定了如何将流量路由到后端不同的目标组,每条规则对应一个目标组、条件及优先级,一旦匹配规则,则执行相应的流量路由,比如将请求URL中路径是/api的请求路由给运行api服务的目标组,将请求URL中路径是/mobile的访问路由给mobile的目标组。

两者的转发模型可见下图。

过去ALB仅支持基于请求路径的流量分发,客户为了实现基于主机名的分发往往使用多组Classic ELB或Classic ELB + Nginx集群的方式,现在ALB提供了新功能,即可以基于主机名进行路由分发,详情请参考:

https://aws.amazon.com/cn/elasticloadbalancing/applicationloadbalancer/

接下来,我们将详细介绍如何使用ALB完成基于主机名的流量分发。

本例中我们将创建以下资源:

(1)1个ALB;

(2)5个目标组,分别为api-prod,api-sandbox,mobile-prod,mobile-sandbox,default;

(3)每个目标组注册不同的EC2实例,其中api-prod目标组将注册两个EC2实例;

(4)一个侦听器;

(5)创建基于主机名和路径的分发规则,实现流量的分发。

1、创建目标组

2、输入目标组名称,选择协议(HTTP/HTTPS)及端口,ALB所在的VPC,配置运行状况检查(协议,路径,阈值等)。此处我们选择了默认HTTP,路径/。

3、注册实例

目标组的重要实体是目标(比如说EC2实例),在此将实例注册到目标组下面,注意选中实例后点击”添加到已注册”,然后保存。此处我们选中了该目标组对应的实例ALBDemo_api_prod,ALBDemo_api_prod_2两个实例。您可以向一个或多个目标组注册多个目标实例以便满足需求。只要注册过程完成且新注册的目标实例通过初始运行状况检查,负载均衡器就会开始将请求路由至此目标。同样,您也可以从目标组取消目标注册。

同理创建api-sandbox,mobile-prod,mobile-sandbox,default目标组,此处省略创建过程。

创建完成后,选中目标组,在目标页我们可以看见注册到该目标组的实例的状态,healthy表示实例正常,另外该状态还有unhealthy(实例未通过健康检查),initial(实例注册中),unused(无流量传入,该目标组未注册到ALB)等。

4、创建负载均衡器

下面我们来创建ALB

5、选择ELB类型

这里我们选择应用程序负载均衡器ALB

6、配置负载均衡器

输入ALB名称,模式可选择该ALB面向Internet或是内部使用;配置侦听器协议,端口,根据需要可以配置多个侦听器,此处我们选择HTTP/80;同时选择ALB部署在哪个可用区及子网,建议多可用区方式部署,同样将应用部署在多可用区,达到高可用的设计目标。

7、配置安全设置

如果侦听器配置了HTTPS,需要配置证书。使用HTTPS,ELB可以完成与客户端的SSL安全连接的建立与SSL卸载,减轻后端服务器的压力。

如果从ACM(AWS Certificate Manager)申请过证书,则可以直接选择该证书,也可以自己上传证书到IAM或者在此上传证书。由于此次我们仅配置了HTTP 80端口侦听器,此处将不配置证书。配置安全证书的截图如下:

8、配置安全组

安全组的概念及用法此处不做复述,我们可以为ALB配置安全组,仅允许指定的协议、端口及来源的流量进入ALB

9、配置路由

这里可以选择”现有目标组”,选择我们前面的创建的default目标组。此处只能选择一个目标组,我们可以在创建完成后,对此ALB添加编辑规则的时候对应路由规则添加目标组。

10、注册目标

11、审核

创建完成后,可以在负载均衡器的控制台看到该ALB的相关描述与信息。

12、配置规则

选中该ALB,在页面下方的侦听器下按端口选择“查看/编辑规则”。

13、添加/编辑规则

与之前不同的是,现在ALB提供了一个规则编辑器。进入规则编辑器后,我们看到的是一条默认规则,并看到目标组是我们前面创建过程中选择的default组。点击左上方”+”,可以添加规则。

目前路由规则支持三种方式:

a.基于URL路径;

b.基于主机名(New Feature);

c.基于主机名+路径(New Feature);

点击&,可以实现基于主机名+路径的规则;

添加了4条规则,将不同主机及路径的流量分发到不同的目标组,如下:

规则 规则(if) 目标组(then)
1 路径/sandbox/* &主机名为api.shishuai.tech api-sandbox
2 主机名为api.shishuai.tech api-prod
3 路径/sandbox/* &主机名为mobile.shishuai.tech mobile-sandbox
4 主机名为mobile.shishuai.tech mobile-prod

通过左上角的添加、编辑、排序、删除可以对规则进行相应的修改与排序,需要注意的是,流量路由匹配规则的时候按规则的顺序匹配,并按最先匹配到的规则执行相应的路由。最多可以添加75条规则。每条规则在主机名处支持最多3个通配符(”*”或者”?”)。

最后规则配置完成,我们检查下规则是否生效。使用Route53 DNS解析服务,将相应的域名(本例中为api.shishuai.tech和mobile.shishuai.tech)CNAME到该ALB的域名(本例中为ALBDemo-2043343612.us-west-2.elb.amazonaws.com,可在选中该ALB,在描述页中看到该DNS地址)。

本例中每个EC2有一个简单的页面,表明自己主机名,以及instance-id,以此区分是否按规则路由到相应的EC2。

http://api.shishuai.tech

在api-prod目标组,我们注册了两台机器,刷新几次会出现另一台EC2的页面。

http://api.shishuai.tech/sandbox/

http://mobile.shishuai.tech

http://mobile.shishuai.tech/sandbox/

综上所述,使用应用负载均衡器基于主机名/路径的流量分发特性,客户可以仅用一组应用负载均衡器就可实现将流量路由给多个后端服务,这可以大大简化客户的架构、减轻运维负担以及优化成本。

作者介绍

王世帅

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内教育、医疗行业的应用和推广。在加入AWS之前曾在国航担任系统工程师,负责存储方案的架构设计,在企业私有云方面有丰富经验。