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

2023-12-13

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


重要更新

由于这个答案最初是写的,应用程序负载均衡器引入了 ALB 根据请求将请求路由到特定目标组的功能Host传入请求的标头.

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

此外,ALB引入了SNI支持,允许您将多个 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 中提供了端口,否则这些是only可用端口。

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

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

ALB 目前不支持此功能。

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

但ALB不直接支持通过主机头进行路由。


在我的基础设施中,我们使用 ELB 或 ALB 的组合,但负载均衡器背后的实例是not应用程序。相反,它们是运行 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 和应用程序之间的一个薄层,它通过检查主机标头或请求的任何其他特征来处理请求路由。

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


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

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

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

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

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

  • Set the 原始 HTTP 端口到 ALB 上服务的特定端口,例如8090。

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

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

你的问题已经解决了。

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

对于您配置的每个主机名,专用的 CloudFront 分配会在标准端口 (80/443) 上接收请求,并且根据主机标头匹配的分配,CloudFront 将请求路由到sameELB/ALB 主机名但是custom端口号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何防止点击标签时页面刷新?

    我需要将一个参数传递到 URL 中 同时阻止页面在单击任何一个时重新加载 a 带有空白的标签href属性 a href 有没有办法用 JS jQuery 来做到这一点 我已经有了这个 jQuery list group item a cli
  • SQL 计数和组

    我有一个与此类似的 MySQL db 表 id date class more info one more info two etc 1 2017 05 03 1 2 2017 05 03 3 3 2017 05 11 1 4 2017 0
  • 在客户端验证行比使用整个主键的二级索引更好?

    在 cassandra 中 众所周知 应该非常谨慎地使用二级索引 例如 如果我有一张桌子 User username usertype email etc 这里的用户名是分区键 现在我想支持当且仅当 usertype 是特定值 X 时返回特
  • 接收方未注册异常错误?

    在我的开发者控制台中 人们不断报告一个错误 我无法在我拥有的任何手机上重现该错误 一个人留言说 当他们尝试打开我的电池服务的设置屏幕时 他收到了消息 正如您从错误中看到的 它表明接收器未注册 java lang RuntimeExcepti
  • Facebook API:所有朋友共享的所有链接?

    访问所有用户 Facebook 好友共享的链接的最实用方法是什么 我希望抓取由经过身份验证的用户的朋友共享的少数域的所有链接 有没有办法询问 域 X 的所有链接 所有链接 我将过滤域 X 或者我是否需要获取每个朋友并解析每个单独的提要 我假
  • T-SQL 读取带有命名空间的 xml 文件

    我尝试读取 sql server 中的 xml 文件 DECLARE XMLToParse XML Load the XML data in to a variable to work with This would typically b
  • TypeScript 2:非类型化 npm 模块的自定义类型

    尝试后发布的建议其他地方 我发现自己无法运行使用非类型化 NPM 模块的打字稿项目 下面是一个最小的示例和我尝试的步骤 对于这个最小的例子 我们假设lodash没有现有的类型定义 因此 我们将忽略该包 types lodash并尝试手动添加
  • 如何更改powershell控制台中的光标位置

    我目前将当前的 CursorPosition 分配给 Powershell 中的一个变量 以便在脚本中执行倒计时时可以覆盖相同的空间 如下所示 errorPos host UI RawUI CursorPosition for i 5 i
  • 在 Core Data 应用程序中更新 NSTableView 的正确方法

    我有一个带有 NSTableView 的核心数据项目 其中列绑定到 NSArrayController 反过来 控制器的内容绑定到 AppDelegate 的主要托管对象上下文 我对 NSTextFieldCell 进行了子类化 以提供更定
  • 访问和操作环境对象中的数组项

    我有一个EnvironmentObject我用来生成一个列表 class ActivityViewModel ObservableObject Published var Activities Activity init self Acti
  • Tableview的Plist搜索

    I have Plist它已填充在带有扩展部分的表格视图上 现在我想搜索表格 下面的图像中 您可以看到当我搜索任何内容时发生的情况 只是因为我正在搜索它 但需要对 cellforrowatindexpath 进行一些更改以获取搜索结果 请检
  • 在Java中按键排序HashMap的最佳方法?

    这是我第一次必须订购HashMap在爪哇 我需要按键执行此操作 但在我的情况下 键是一个对象 因此我需要按特定字段进行排序 尝试自己解决这个问题 我考虑继续编写这个简单的代码 private HashMap
  • 以 Map 作为主体的 Dart HTTP POST

    飞镖http包 s post方法只接受一个String a List
  • 同步期间出错:管道损坏 - 更新 Android Studio 3.2、3.3 后

    将 Android Studio 更新到 3 2 并解决同步 gradle 问题后Gradle 同步失败 将 Android Studio 更新到 3 2 后 我无法安装apk 事件日志 Error during Sync Broken p
  • 如何检索 WiFi Direct MAC 地址?

    我正在尝试检索 Android 设备的 MAC 地址 如果 WiFi 已打开 这通常可以通过 WiFiManager API 实现 如果 WiFi 关闭且 WiFi Direct 打开 有什么方法可以获取 MAC 地址吗 我的手机上无法同时
  • 如何将多个Excel文件合并为一个Excel文件

    所以我试图制作一个 Excel 表格聚合器 在我的工作中 有人向我们发送一堆单独的 Excel 文件 这些文件都是相关的 每个文件只使用了一张纸 我在某种程度上遵循上一篇文章的想法 但这样做后 我复制的一些 Excel 工作表变成了空白 只
  • 我可以创建宽度为百分比高度但像素精确的行高的 HTML 表格吗?

    我需要在网页上创建一个有两行的表 该表格需要填充整个页面 因此我在 CSS 样式表中将表格的高度和宽度设置为 100 并将 HTML 和正文的高度也设置为 100 但是 我需要将表格顶行的高度精确为 100 像素 并扩展第二行以适合表格的其
  • 在模板化嵌套和继承类中未检测到变量

    我有一个像这样的嵌套和继承的结构 template
  • 仅使用给定符号创建固定长度的唯一 ID?

    我试图了解如何在 python 中创建一组固定长度 例如长度 12 的唯一 ID 它使用所有字母数字字符的特定子集 这里的用例是这些 ID 需要被人们读取并在打印文档中引用 因此我试图避免使用字符 L I O 和数字 0 1 我当然需要能够
  • AWS Route 53 - 到应用程序负载均衡器不同端​​口的域名路由

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