亚马逊AWS官方博客

通过自定义域名 + SSL 的方式访问Amazon MQ for RabbitMQ

引言:

一般为了解决应用解耦,异步处理,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性的架构;我们会引入消息队列中间件来完善架构设计。

对于需要消息传递协议的应用程序,包括JMS、NMS、AMQP、STOMP、MQTT和WebSocket,Amazon提供了Amazon MQ。这是一个针对Apache ActiveMQ和RabbitMQ的托管消息代理服务,可以更轻松地在云中设置和操作消息代理。

Amazon MQ提供了两个托管代理部署连接选项:公共代理和私有代理。公共代理接收互联网可访问的IP地址,而私人代理仅从其专有网络子网中的相应CIDR范围接收私有IP地址。在某些情况下,出于安全目的,客户可能更愿意将代理放置在私有子网中,但也允许通过持久公共端点(例如其公司域的子域,如“mq”)访问代理。

这里介绍了如何在私有VPC中,通过Route53、NLB、ACM相结合,通过SSL的方式访问自定义域名指向的RabbitMQ代理。

  1. 部署在EC2/ECS/EKS中的客户端服务尝试使用自定义域名连接RabbitMQ Broker.
  2. 通过Route53将自定义域名解析到NLB的DNS domain。
  3. 客户端使用AWS证书管理器(ACM)提供的安全套接字层(SSL)证书创建到NLB的传输层安全(HTTPS/AMQPS)连接。
  4. NLB从目标组中选择一个健康的端点,并创建一个单独的SSL连接。这在客户端和代理之间提供了安全的端到端SSL加密消息传递。

一、前提

要构建此架构,首先您需要一个VPC,每个可用区域一个Private Subnet,以及一个用于堡垒主机的Public subnet(如果需要)。

本演示VPC使用10.1.0.0/16 CIDR范围。此外,您必须为您的MQ Broker创建自定义安全组。您必须设置此安全组,以允许从网络负载平衡器到RabbitMQ Broker的流量。安全组需要开放5671(AMQP端口)和443(web控制台端口)的流量。

二、创建AmazonMQ Broker

设置网络子网后,添加Amazon MQ代理:

  1. 在Amazon MQ主页上选择创建代理。
  2. 切换RabbitMQ旁边的单选按钮,然后选择Next。
  3. 选择单实例代理(用于开发环境)或集群部署(用于生产环境)的部署模式。
  4. 在配置设置中,指定代理名称和实例类型,以及管理员用户的用户名和密码。

  1. 确认代理引擎版本为9.16或更高版本,并将访问类型设置为私有访问。
  2. 选择您的VPC和子网,并选择刚创建的安全组。
  3. 按需选择版本升级及维护窗口,选择下一步并创建Broker。

三、获取RabbitMQ  Broker的IP地址

在配置NLB的目标组之前,必须获取 Broker的IP地址。Amazon MQ在每个子网中创建一个VPC端点,其静态地址在删除代理之前不会更改。

  1. 导航到Broker的详细信息页面并滚动到连接面板。
  2. 查找EndPoint的完整域名,它的格式类似于broker-id.mq.region.amazonaws.com
  3. 在本地客户端上打开命令终端。
  4. 使用host(Linux)或nslookup(Windows)命令检索“A”记录值。
  5. 为以后的NLB配置步骤记录这些值。

四、配置负载平衡器的目标组

 

下一步配置负载平衡器的目标组。您使用代理的私有IP地址作为NLB的目标。创建一个目标组,将目标类型选择为IP,并确保为每个所需的端口以及您的代理所在的专有网络选择TLS协议。

五、创建网络负载平衡器

创建一个网络负载平衡器。端口5671(AMQP)上有TLS侦听器,将流量路由到代理的VPC和Subnet。您选择创建的目标组,为NLB和代理之间的连接选择TLS。为了允许客户端安全地连接到NLB,请为在Route53中注册的子域选择一个ACM证书(例如“mq.yourdomain.com”)。

要了解ACM证书设置,请在此处阅读有关该过程的更多信息。确保ACM证书在与NLB相同的区域中设置,或者该证书未显示在下拉菜单中。

六、配置Route53

最后,在Route53配置为在您选择的子域为NLB提供流量服务:

转到Route53托管区域并创建新的子域记录集,例如mq.test.youdomain.com,它与您先前创建的ACM证书相匹配。

在“类型”字段中,选择“A–IPv4地址”,然后为别名选择“是”。这允许您选择NLB作为别名目标。

从alias target菜单中选择刚刚创建的NLB并保存记录集。

现在,调用方可以在RabbitMQ连接字符串中使用自定义域名。此功能改善了开发人员的体验,并在重建集群时降低了操作成本。由于您在NLB的目标组中添加了多个VPC端点(每个子网一个),因此该解决方案具有多AZ冗余。

七、使用RabbitMQ客户端进程进行测试

整个过程可以使用任何RabbitMQ客户端进程进行测试。一种方法是启动Docker官方镜像并与本地客户端连接。服务文档还提供了用于验证、发布和订阅RabbitMQ通道的示例代码。

要登录到代理的RabbitMQ web控制台,有三个选项。根据安全组规则,仅允许来自专有网络内部的流量流向代理:

  1. 使用从公司网络到专有网络的VPN连接。许多客户使用此选项,但对于快速测试,有一种更简单、更具成本效益的方法。
  1. 通过路由53子域连接到代理的web控制台,这需要在现有NLB上创建单独的web控制台端口侦听器(443),并为代理创建单独的TLS目标组。
  1. 使用bastion主机将流量代理到web控制台。

八、总结

在本文中,您将在私有子网中构建一个高可用的Amazon MQ Broker。您可以通过将代理置于高度用可扩展的NLB之后来分层管理。并且通过Route53解析到NLB的方式,实现采用自定义域名+SSL的方式访问Amazon MQ Broker。

本篇作者

孙权

AWS ProServe Senior DevOps顾问,致力于解决企业客户DevOps咨询和实施,在云原生/DevOps/微服务框架/性能优化和加速研发效能领域有深入研究的热情

曹赫洋

AWS 专业服务团队DevOps顾问。主要负责DevSecOps咨询和技术实施。在DevSecOps加速企业数字化转型方面领域拥有多年经验,对公有云、DevSecOps、基于云原生的微服务架构、敏捷加速研发效能等有深入的研究和热情。