在 Amazon MQ 上为 RabbitMQ 私有代理实施联邦

作者: ISHITA CHAKRABORTY, Vinodh Kannan Sadayamuthu |

RabbitMQ 中的联邦有助于在多个 RabbitMQ 代理之间进行消息交换和流动。适用于 RabbitMQ 的 Amazon MQ 允许通过联邦插件进行联合交换和队列。联邦插件使下游代理能够使用来自上游交换或队列的消息。它用于连接多个 RabbitMQ 代理,并提供多种好处,例如可扩展性,允许在多个节点或集群上横向扩展消息基础架构。它还为跨代理的消息复制提供了高可用性,以实现冗余并能够根据安全或其他标准进行隔离。这些优势允许联邦用于以下用例:

  1. 多区域部署
  2. 混合云部署
  3. 灾难恢复
  4. 从本地迁移到云端

目前,适用于 RabbitMQ 的 Amazon MQ 上的联邦插件仅连接到公开的上游代理。这篇文章解释了如何使用网络负载均衡器 (NLB) 为 Amazon MQ RabbitMQ 私有代理实现联邦。这些步骤允许私有代理相互通信以创建分布式系统。

概述

在此解决方案中,您将使用两个单实例代理来实现与私有代理的联邦。

  1. 创建两个 Amazon Virtual Private Cloud (VPC),一个用于上游代理,一个用于下游代理。每个 VPC 都有一个私有子网和一个公有子网以及互联网网关、安全组、路由表。
  2. 在每个 VPC 的私有子网中创建 Amazon MQ RabbitMQ 私有代理。代理实际上位于由 Amazon MQ 服务拥有的账户中,该账户位于私有子网中,前面有一个网络负载均衡器 (NLB)。NLB 用于使用与 NLB 的 VPC 终端节点关联的弹性网络接口 (ENI) 从您的账户访问代理。
  3. 为上游代理创建指向 ENI 的 NLB。与 NLB 关联的安全组用于仅将流量限制为与下游代理关联的 NAT IP。只能私下访问的上游代理现在将通过 IP 允许列表连接到公共互联网,消息可能会通过互联网传输。
  4. 在公有子网的下游 VPC 中创建 Amazon EC2 实例以连接到该实例并设置联邦。您只需要使用 EC2 实例进行设置和测试。
  5. 使用 NLB 端点向上游代理发送消息,该消息也可供下游代理使用。

先决条件

以下是此设置的先决条件:

  • 访问亚马逊云科技账户。
  • 具有部署基础设施所需权限的 Amazon IAM 用户/委托人。

该堆栈创建了两个新的 VPC。确保您在所选区域拥有少于五个 VPC。您可以使用配额来提高此限额。

部署解决方案

您将使用 Amazon CloudFormation 部署解决方案:

高级步骤如下:

  1. 部署代理 CFN 堆栈以创建 VPC、子网、互联网网关、安全组和路由表,以及 Amazon MQ RabbitMQ 代理
  2. 获取在代理堆栈中创建的私有上游代理的 IP 地址
  3. 打开亚马逊云科技支持案例以获得 IP 以允许 NLB
  4. 使用网络负载均衡器创建 NLB 堆栈并使用 Amazon CloudFormation 访问该堆栈的规则
  5. 在 Amazon MQ RabbitMQ 代理之间建立联邦并测试设置

该解决方案可在 GitHub 的亚马逊云科技示例存储库中找到。

第 1 步:为代理堆栈部署 Amazon CloudFormation 模板

  1. 前往 CloudFormation 控制台并选择 "创建堆栈"。从下拉列表中选择 "使用新资源(标准)"。
  2. 在 "准备模板" 中,选择 "使用现有模板",然后在 "指定模板" 中选择 "上传模板文件并使用此模板文件"
  3. 提供堆栈名称(例如 BrokerStack)。
  4. 更新作为堆栈参数提供的用户名和 CIDR 块,或将其保留为默认值。为了便于设置,此模板使用了包含五个区域的 EC2 实例连接托管前缀列表的 EC2:美国东部-1、美国-西部 1、美国-西部 2、eu-west-1、eu-west-1 和 ap-south-1。在模板中为其他区域添加前缀列表,以在这些区域运行此云形成模板。
  5. 选择 "下一步",将其他所有内容保留为默认值。
  6. 选择 "提交"

代理堆栈部署需要 10-15 分钟。

该模板使用互联网网关、安全组和路由表在每个 VPC 上创建两个 VPC 以及一个私有和公有子网。它还在每个 VPC 中创建两个私有代理,并在下游 VPC 上创建一个 EC2 实例 (t2.micro)。

第 2 步:检索私有上游代理的 IP 地址

  1. 完成上述堆栈创建后,导航到堆栈的 "输出" 选项卡,然后复制 PrivateUpstreamBrokerEndPoints 的输出。
  2. 在上面的输出中,仅从 "PrivateUpstreamBrokerEndPoints" 中提取主机名。
  3. 使用以下命令解析主机名。
    Linux 或 Mac

    $ dig +short {hostname}

    Windows

    C:\> nslookup {hostname}

记下 IP 地址。你将在以后的步骤中使用它。

第 3 步:创建支持案例以获取 Amazon MQ RabbitMQ 下游代理 NAT IP

使用亚马逊云科技支持创建支持案例,获取与下游 MQ 代理关联的 NAT IP。向代理提供亚马逊资源名称 (ARN),并解释您的用例以及在描述中列出联邦许可的必要性。使用此 IP 地址仅允许从特定 IP 访问网络负载均衡器。

第 4 步:为 NLB 堆栈部署 Amazon CloudFormation 模板

  1. 前往 CloudFormation 控制台并选择 "创建堆栈"。从下拉列表中选择 "使用新资源(标准)"。
  2. 对于准备模板,选择使用现有模板。对于模板源,选择上传模板文件并选择此模板文件。
  3. 选择 "下一步"。
  4. 在 "指定堆栈详细信息" 下,提供堆栈名称(例如 NLBStack)。
  5. 在参数中使用上述步骤 2 和步骤 3 中的 IP 地址,然后选择下一步
    确保 NAT IP 地址是有效的 CIDR 范围,如 52.0.0.1/32。
  6. 将其余部分保留为默认值,然后再次选择 "下一步"
  7. 选择 "提交"。

该模板创建了一个包含 2 个目标组和一个安全组的网络负载均衡器,并向上游默认安全组添加规则。

第 5 步:在下游代理中配置联邦

  1. 使用 NLBStack 的上游代理 NLB URL 输出,并在以下导出命令中将其替换为 BrokerStack 输出中的下游代理 Uri。
    export Upstream_Broker_NLB= <UpstreamBrokerNLBURL>
    export Downstream_Broker_Uri= <DownstreamBrokerURI> 
  2. 在亚马逊云科技控制台中,搜索 Amazon Secrets Manager 并选择 Secrets。你会发现 2 个名为DownstreamBrokerUsernamePasswordUpstreamBrokerUsernamePassword的秘密。打开其中一个并选择 "检索机密值" 以获取代理的密码和用户名。对另一个重复此操作。
  3. 替换以下命令中Upstream_Broker_UsernameUpstream_Broker_PasswordDownstream_Broker_UsernameDownstream_Broker_Password的值。
    ##creates federation on the private downstream broker
    curl -XPUT -d'{"value":{"uri":"amqps://Upstream_Broker_Username:Upstream_Broker_Password@'"$Upstream_Broker_NLB"':5671","expires":3600000}}' https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/parameters/federation-upstream/%2f/my-upstream
    
    ##creates policy for federation on the private downstream broker with pattern for exchange with Test in its name
    curl -XPUT -d'{"pattern":"^Test", "definition":{"federation-upstream-set":"all"},"apply-to":"exchanges"}' https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/policies/%2f/federate-me
  4. 在 EC2 控制台中,选择在步骤 1 中作为代理堆栈的一部分创建的 EC2 实例。选择连接并使用 EC2 实例连接登录实例。连接到终端后,使用替换的值粘贴上述行,以在上游创建联邦以及与之相关的策略。

第 6 步:创建 TestExchange 和测试队列并绑定它们

  1. 运行以下步骤,为其创建测试交换、队列和绑定。替换 Downstream_Broker_Username 和 Downstream_Broker_Password
    ##creates a test exchange on the private downstream broker
    curl -H "content-type:application/json" -XPUT -d'{"type":"fanout","durable":true}' https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/exchanges/%2f/TestExchange
    
    ##creates a test queue on the private downstream broker
    curl -H "content-type:application/json" -XPUT -d'{"durable":true,"arguments":{"x-dead-letter-exchange":"", "x-dead-letter-routing-key": "my.queue.dead-letter"}}' https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/queues/%2f/TestQueue
    
    ##Binds the queue to the exchange on the private downstream broker
    curl -H "content-type:application/json" -XPOST -d'{"routing_key":"","arguments":{}}' https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/bindings/%2f/e/TestExchange/q/TestQueue

第 7 步:验证联邦状态并测试代理之间的联邦

  1. 在同一会话中仍连接到 EC2 时,通过运行以下命令来检查联邦状态。替换 Downstream_Broker_Username 和 Downstream_Broker_Password
    ##check federation status on the private downstream broker and format it as JSON
    curl -XGET https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/federation-links | python3 -m json.tool

    输出将如下所示,状态为正在运行。

    [
        {
            "node": "rabbit@localhost",
            "exchange": "TestExchange",
            "upstream_exchange": "TestExchange",
            "type": "exchange",
            "vhost": "/",
            "upstream": "my-upstream",
            "id": "5cd2293f",
            "status": "running",
            "local_connection": "<rabbit@localhost.1746117897.30989.0>",
            "uri": "amqps://MyUpstreamNLB-XXXXXXXX.elb.us-east-1.amazonaws.com:5671",
    …
        }
    ]
  2. (可选)立即发送测试消息。由于您限制上游代理 NLB 仅接收来自下游代理的流量(通过从支持案例中收到的 IP 地址),因此您需要手动允许为端口 443 创建的 NLB 安全组中的 EC2 公有 IP 地址执行以下步骤。您还需要允许从 EC2 的出口访问 NLB。
    ##Send test message on the upstream broker
    curl -k -H "content-type:application/json" -XPOST -d'{"properties":{},"routing_key":"MYKEY","payload":"Hello World","payload_encoding":"string"}' https://Upstream_Broker_Username:Upstream_Broker_Password@{$Upstream_Broker_NLB}/api/exchanges/%2f/TestExchange/publish

    消息发送后,它将显示为已路由:true。这意味着消息已成功路由到下游代理。

  3. 使用以下命令验证下游代理上的消息。这应该显示您之前发送的有效负载。
    ## Get message from queue on the downstream broker
    curl -H "content-type:application/json" -XPOST -d'{"ackmode":"ack_requeue_true","count":1,"encoding": "auto"}' https://Downstream_Broker_Username:Downstream_Broker_Password@{$Downstream_Broker_Uri}/api/queues/%2f/TestQueue/get

    输出:

    [
        {
            "payload_bytes": 11,
            "redelivered": true,
            "exchange": "TestExchange",
            "routing_key": "MYKEY",
            "message_count": 0,
             …
            "payload": "Hello World",
            "payload_encoding": "string"
        }
    ]

清理

本节提供有关删除作为本文一部分创建的各种资源的信息。

  1. 删除在步骤 4 中创建的 NLBStack 堆栈。有关说明,请参阅 Amazon CloudFormation 控制台上删除堆栈。
  2. 删除步骤 1 中创建的 BrokerStack。

结论

这篇文章解释了如何为 Amazon MQ RabbitMQ 私有代理实施联邦。您可以将此解决方案扩展到集群部署中的 RabbitMQ 代理,就像单实例代理一样。通过联邦交换,您可以创建 RabbitMQ 代理的分布式系统,以提高消息系统的可靠性和可扩展性。您也可以将其用作混合架构的模板,将消息从私有本地代理迁移到云端,如将消息驱动的应用程序迁移到 Amazon MQ for RabbitMQ 中所述。从 RabbitMQ 的官方文档中获取有关联邦插件的更多详细信息。如需详细了解适用于 RabbitMQ 的 Amazon MQ,请参阅我们的开发者指南。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。