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

AWS Route 53 - Domain name route to different ports of an Application load balancer

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

eg: 
xxxx-xx.xx.elb.amazonaws.com:8080/ go to microservice 1 
xxxx-xx.xx.elb.amazonaws.com:8090/ go to microservice 2

我们需要一个域名而不是ELB,端口也不应该通过域名暴露。我找到的关于 53 号公路的几乎所有资源都使用执行以下操作的别名:

xx.xxxx.co.id -> xxxx-xx.xx.elb.amazonaws.com or
xx.xxxx.co.id -> 111.111.111.11 (static ip)

1) 每个微服务是否需要单独的域?

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

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

重要更新

由于这个答案最初是写的,Application Load Balancer introduced the capability for ALB to route requests to a specific target group based on the Host header of the incoming request

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

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

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

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


1.) Do we need separate domains for each micro service?

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

同一域中的不同主机名也不会直接完成您的 objective。

2.) How to use alias to point domains to a specific port of the ELB?

域没有指向端口。主机名不指向端口。 DNS 仅用于地址解析。网上到处都是这样。

3.) Is it possible to use this setup if the domains are from another provider other than AWS.

这不是 AWS 的限制。 DNS 根本无法以这种方式工作。

服务终结点不知道指向它的 DNS 记录。 DNS 条目本身严格用于发现可用于访问端点的 IP 地址。之后,端点实际上对 DNS 一无所知,也无法通过 DNS 告诉浏览器使用不同的端口。

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

但是,在 HTTP 和 HTTPS 中,每个请求都伴随着一个 Host: header,由网络浏览器随每个请求一起发送。这是地址栏中的主机名。

为了区分到达设备的不同主机名请求(例如 ELB/ALB),端点处的设备必须解释传入主机 header 并将请求路由到 back-end 提供该服务的系统。

ALB 当前不支持此功能。

但是,ALB 确实支持根据路径前缀选择端点。所以 microservices.example.com/api/foo 可以路由到一组服务,而 microservices.example.com/api/bar 可以路由到另一组服务。

但是ALB不直接支持主机路由header。


在我的基础架构中,我们结合使用了 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: header 并选择请求将发送到的后端(一组 1 个或多个实例)路由。它是 ELB 和应用程序之间的薄层,通过检查主机 header 或请求的任何其他特征来处理请求路由。

这是一个解决方案,但配置有点高级,具体取决于您的专业知识。


如果您正在寻找 out-of-the-box、无服务器、AWS-centric 解决方案,那么实际上可以在 CloudFront 中找到答案。是的,它是一个 CDN,但它还有其他几个应用程序,包括作为反向代理。

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

  • 为每个服务创建一个 CloudFront 分配。

  • 配置每个分配的备用域名以使用该服务的分配主机名。

  • 将源域名设置为 ELB 主机名。

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

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

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

您的问题已解决。

你看到我在那里做了什么吗?

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

我认为他有可能构建他所描述的内容。我在同一条船上呆了一段时间,这里有一些选项供您考虑:

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

我没有使用过 SLA,但这肯定会为您指明方向。