AWS Route 53 - 到应用程序负载均衡器

时间:2017-01-24 06:34:32

标签: amazon-web-services amazon-ec2 amazon-route53 elastic-load-balancer

我们正在AWS中实施微服务架构。我们有几个EC2实例,它们在不同的端口上部署了微服务。我们还有一个面向互联网的应用程序负载均衡器,它根据端口路由到不同的服务。

例如:
xxxx-xx.xx.elb.amazonaws.com:8080/转到微服务1
xxxx-xx.xx.elb.amazonaws.com:8090/转到微服务2

我们需要有一个域名而不是ELB,端口也不应该通过域名公开。我找到的关于路线53的几乎所有资源都使用了以下的别名

xx.xxxx.co.id - > xxxx-xx.xx.elb.amazonaws.com或
xx.xxxx.co.id - > 111.111.111.11(静态IP)

1.。)我们是否需要为每个微服务提供单独的域名?
2.)如何使用别名将域指向ELB的特定端口?
3.)如果域来自AWS以外的其他提供商,是否可以使用此设置。

2 个答案:

答案 0 :(得分:6)

重要更新

由于此答案最初编写,因此应用程序负载均衡器introduced the capability for ALB to route requests to a specific target group based on the Host header of the incoming request

传入的主机头现在可用于将请求路由到特定的实例和端口。

此外,ALB introduced SNI support允许您将多个TLS(SSL)证书与单个平衡器相关联,并且将根据协商TLS时客户端提供的SNI自动选择正确的证书。 Amazon Certificate Manager的多域和通配符证书也适用于ALB。

基于这些因素,不需要单独的端口或不同的侦听器 - 只需为每个服务分配主机名和/或路径前缀,并将这些模式映射到适当的目标实例组。

原始答案不再准确,但包含在下面。

  

1.。)我们是否需要为每个微服务提供单独的域名?

不,这对你没有帮助。 ALB不解释附加到传入请求的主机名。

同一个域中的单独主机名也不会直接实现您的目标。

  

2.。)如何使用别名将域指向ELB的特定端口?

域名不指向端口。主机名不指向端口。 DNS仅用于解析地址。互联网上的每个地方都是如此。

  

3.如果域来自AWS以外的其他提供商,是否可以使用此设置。

这不是AWS的限制。 DNS根本不起作用。

服务端点不知道指向它的DNS记录。 DNS条目本身严格用于发现可用于访问端点的IP地址。在此之后,端点实际上并不知道有关DNS的任何信息,并且无法通过DNS告知浏览器使用其他端口。

对于HTTP,隐式端口为80.对于HTTPS,它为443.除非URL中提供了端口,否则它们是可用端口。

但是,在HTTP和HTTPS中,每个请求都附带一个Host:标头,由Web浏览器随每个请求发送。这是地址栏中的主机名。

要区分对到达设备的不同主机名(例如ELB / ALB)的请求,端点上的设备必须解释传入的主机头并将请求路由到提供该服务的后端系统。

ALB目前不支持此功能。

但是,ALB支持基于路径前缀选择端点。因此microservices.example.com/api/foo可以路由到一组服务,而microservices.example.com/api/bar可以路由到另一组服务。

但是ALB不直接支持按主机头进行路由。

在我的基础架构中,我们使用ELB或ALB的组合,但负载均衡器背后的实例应用程序。相反,它们是运行HAProxy负载平衡器软件的实例,并将请求路由到后端。

重要配置元素的简短示例如下所示:

frontend main
  use_backend svc1 if { hdr(Host) -i foo.example.com }
  use_backend svc2 if { hdr(Host) -i bar.example.com }

backend svc1
  server foo-a 192.168.2.24:8080
  server foo-b 192.168.12.18:8080

backend svc2
  ....

ELB终止SSL并随机选择代理,代理检查Host:标头并选择将请求路由到的后端(一组1个或更多实例)。它是ELB和应用程序之间的一个薄层,它通过检查主机头或请求的任何其他特征来处理请求路由。

这是一个解决方案,但根据您的专业知识,它是一种稍微高级的配置。

如果您正在寻找开箱即用,无服务器,以AWS为中心的解决方案,那么实际上可以在CloudFront中找到答案。是的,它是CDN,但它有其他几个应用程序,包括作为反向代理。

  • 对于每项服务,请从您的域中选择要分配给该服务的主机名foo.api.example.com或bar.api.example.com。

  • 对于每项服务,请创建CloudFront分配。

  • 配置每个发行版的备用域名以使用该服务的指定主机名。

  • 将Origin Domain Name设置为ELB主机名。

  • Origin HTTP Port设置为ALB上服务的特定端口,例如8090。

  • 配置默认缓存行为以转发您需要的任何标头。如果您不需要CloudFront的缓存功能,请选择“转发所有标头”。如果需要,还可以转发查询字符串和Cookie。

  • 在Route 53中,将foo.api.example.com创建为该特定CloudFront分配的主机名的别名,例如dxxxexample.cloudfront.net。

你的问题已经解决了。

你看我在那里做了什么?

对于您配置的每个主机名,专用CloudFront分配在标准端口(80/443)上接收请求,并且 - 根据主机标头匹配的分发 - CloudFront将请求路由到相同 ELB / ALB主机名,但自定义端口号。

答案 1 :(得分:0)

我认为他有可能建立他所描述的东西。我在同一条船上呆了一段时间,这里有一些选择供你考虑:

  • 在R53中创建一个托管区域 - 并指向您的域名。
  • 可选步骤:创建ALIAS记录。您可以为每个子域执行此操作 应用程序。如果使用根域,请将ALIAS字段留空。
  • 使用SLA选项创建记录集,该选项是端口的服务查找 重定向。尝试将其指向您的LB端口80,为子域别名。
  • 更改负载均衡器的侦听器,侦听端口80 - 然后根据应用端口设置重定向应用流量。

我没有使用SLA,但这肯定会指向你那个方向。