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

标签 amazon-web-services amazon-ec2 amazon-route53 amazon-elb

我们正在AWS中实现微服务架构。我们有几个EC2实例,这些实例在不同的端口上部署了微服务。我们也有一个面向应用程序负载平衡器的Internet,它可以根据端口路由到不同的服务。

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

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

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

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

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




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


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

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


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


域不指向端口。主机名不指向端口。 DNS仅用于地址解析。 Internet上的所有地方都是如此。


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分配。
配置每个分发的备用域名以使用该服务的分配主机名。
将原始域名设置为ELB主机名。
Origin HTTP Port设置为ALB上服务的特定端口,例如8090。
配置默认的缓存行为以转发所需的任何标头。如果您不需要CloudFront的缓存功能,请选择转发所有标头。如果需要,还启用转发查询字符串和Cookies。
在Route 53中,创建foo.api.example.com作为该特定CloudFront发行版主机名的别名,例如dxxxexample.cloudfront.net。


您的问题已解决。

你看我在那儿做什么吗?

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

关于amazon-web-services - AWS Route 53-到应用程序负载平衡器不同端​​口的域名路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41821505/

相关文章:

angular - 如何在 S3 上托管的 Angular 4 网站中隐藏基本 href

amazon-web-services - 如何使用 AWS CDK 标记 EBS 卷?

amazon-web-services - 在 Cloudformation 中获取 AutoScaling 组

node.js - 如何修复 ENOENT : no such file or directory, 打开 'upload/"文件名“”?

amazon-web-services - 是否可以在正在运行的 EC2 实例上启用 CloudWatch?

amazon-web-services - 将 Amazon Route 53 域名链接到 EC2 实例

dns - 使用 Terraform,如何有条件地将 VPC 包含在 Route53 定义中

amazon-web-services - eks create cluster 命令失败并显示错误 : computing fingerprint illegal base64 data at input byte 11

java - 如何正确部署 Spring Cloud 服务到 AWS ECS

java - 向 EC2 集群提交作业超时