AWS Route 53 - 域名路由到应用程序负载均衡器的不同端口

问题描述 投票:2回答:2

我们正在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以外的其他提供商,是否可以使用此设置。

amazon-web-services amazon-ec2 amazon-route53 elastic-load-balancer
2个回答
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主机名但是自定义端口数。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.