O blog da AWS

Implementando federação no Amazon MQ para brokers privados do RabbitMQ

Por Ishita Chakraborty, gerente de contas tecnica senior na Amazon Web Services (AWS) e Vinodh Kannan Sadayamuthu, arquiteto especialista sênior de soluções na Amazon Web Services (AWS).

A federação no RabbitMQ ajuda na troca e no fluxo de mensagens entre vários brokers do RabbitMQ. O Amazon MQ para RabbitMQ permite trocas e filas federadas por meio do Federation Plugin. O plug-in de federação permite que um agente downstream consuma uma mensagem de uma troca ou fila em um upstream. Isso é usado para conectar vários brokers RabbitMQ e fornece vários benefícios, como escalabilidade, permitindo expandir a infraestrutura de mensagens horizontalmente em vários nós ou clusters. Ele também fornece alta disponibilidade para replicação de mensagens entre brokers para redundância e a capacidade de segregar com base na segurança ou em outros critérios. Esses benefícios permitem que a federação seja usada nos casos de uso abaixo:

  1. Implantações em várias regiões
  2. Implantações de nuvem híbrida
  3. Recuperação de desastres
  4. Migração do local para a nuvem

Atualmente, o plug-in de federação no Amazon MQ para RabbitMQ se conecta somente a brokers upstream disponíveis publicamente. Esta postagem explica como implementar a federação para Amazon MQ RabbitMQ Private Brokers usando Network Load Balancers (NLB). As etapas permitem que brokers privados se comuniquem entre si para criar um sistema distribuído.

Visão geral

Nessa solução, você usará dois brokers de instância única para implementar a federação com brokers privados.

  1. Crie duas Amazon Virtual Private Cloud (VPC) — uma para broker upstream e outra para o broker downstream. Cada VPC tem uma sub-rede privada e uma pública, além de gateway de internet, grupos de segurança e tabelas de rotas.
  2. Crie agentes privados Amazon MQ RabbitMQ nas sub-redes privadas de cada VPC. Na verdade, o broker reside em uma conta de propriedade do serviço Amazon MQ, em uma sub-rede privada com um Network Load Balancer (NLB) à sua frente. O NLB é usado para acessar o broker a partir da sua conta usando a Elastic Network Interface (ENI) associada ao VPC Endpoint para o NLB.
  3. Crie um NLB apontando para a ENI para o broker upstream. O security group associado ao NLB é usado para restringir o tráfego somente aos IPs NAT associados ao broker downstream. O broker upstream, que estava acessível apenas de forma privada, agora estará conectado à Internet pública com uma lista de permissões de IP e as mensagens potencialmente transitarão pela Internet.
  4. Crie uma instância do Amazon EC2 na VPC downstream na sub-rede pública para se conectar a ela e configurar a federação. Você precisa da instância EC2 somente para a configuração e o teste.
  5. Envie uma mensagem para o broker upstream usando o endpoint NLB, a mensagem também estará disponível para o broker downstream para consumo.

Pré-requisitos

A seguir estão os pré-requisitos para essa configuração:

A pilha cria duas novas VPC. Verifique se você tem menos de cinco VPCs na região selecionada, caso contrario, você pode solicitar o aumento de limite usando cotas.

Implantando a solução

Você implantará a solução usando o AWS CloudFormation:

As etapas de alto nível são as seguintes:

  1. Implante a pilha CFN do broker para criar VPCs, sub-redes, gateway de internet, grupos de segurança e tabelas de rotas, junto com os brokers Amazon MQ RabbitMQ
  2. Obtenha o endereço IP do broker upstream privado criado na pilha de brokers
  3. Abra um caso de suporte da AWS para obter o IP para permitir o NLB
  4. Crie uma pilha NLB com o Network Load Balancer e as regras para acessá-la usando o AWS CloudFormation
  5. Configure a federação entre os brokers Amazon MQ RabbitMQ e teste a configuração

Essa solução está disponível no GitHub no repositório AWS Samples.

Etapa 1: implantar o modelo do AWS CloudFormation para a pilha de brokers

  1. Acesse o console do CloudFormation e escolha Create Stack. Escolha Com novos recursos (Padrão) no menu suspenso.

2. Em Preparar modelo, escolha um modelo existente e, em Especificar modelo, escolha Carregar um arquivo de modelo e usar esse arquivo de modelo

3. Forneça um nome de pilha (como BrokerStack).

4. Atualize o nome de usuário e os blocos CIDR fornecidos como parâmetros para a pilha ou deixe-os como padrões. Para facilitar a configuração, esse modelo usa o EC2 com listas de prefixos gerenciadas para o EC2 Instance Connect em cinco regiões: us-east-1, us-west-1, us-west-2, eu-west-1 e ap-south-1. Adicione listas de prefixos para outras regiões no modelo para executar esse modelo de formação de nuvem nessas regiões.

5. Escolha Avançar e deixe todo o resto como padrão.

6. Escolha Enviar.

A implantação da pilha de brokers leva de 10 a 15 minutos.

O modelo cria duas VPCs junto com uma sub-rede pública e privada em cada VPC com gateway de internet, grupos de segurança e tabelas de rotas. Ele também cria dois brokers privados em cada VPC junto com uma instância EC2 (t2.micro) na VPC downstream.

Etapa 2: recuperar o endereço IP do broker upstream privado

  1. Quando a criação da pilha acima estiver concluída, navegue até a guia Saídas da pilha e copie a saída para PrivateUpstreamBrokerEndpoints.
  2. Extraia somente o nome do host dos “PrivateUpstreamBrokerEndpoints” na saída acima.

Resolva o nome do host usando os comandos a seguir.Linux ou Mac$

$ dig +short {hostname}
Bash

Windows

C:\> nslookup {hostname}
Bash
Anote o endereço IP. Você o usará em etapas posteriores.

Etapa 3: Crie um caso de suporte para obter os IPs NAT do Amazon MQ Rabbit MQ Downstream Broker

Crie um caso de suporte com o AWS Support para obter os IPs NAT associados ao MQ Broker downstream. Forneça ao broker o Amazon Resource Name (ARN) e explique seu caso de uso e a necessidade de fazer a listagem de permissões de federação na descrição. Use esse endereço IP para permitir que o Network Load Balancer seja acessado somente a partir de IPs específicos.

Etapa 4: implantar o modelo do AWS CloudFormation para o NLB Stack

    1. Acesse o console do CloudFormation e escolha Create Stack. Escolha Com novos recursos (Padrão) no menu suspenso.

2. Em Preparar modelo, Escolha um modelo existente. Em Fonte do modelo, escolha Carregar um arquivo de modelo e escolha esse arquivo de exemplo.

3. Escolha Avançar.

4. Em Especificar detalhes da pilha, forneça um nome da pilha (como NLBStack).

5. Use o endereço IP das etapas 2 e 3 acima nos parâmetros e escolha Avançar.
Certifique-se de que o endereço IP NAT seja um intervalo CIDR válido, como 52.0.0.1/32.

6. Mantenha o resto como padrão e escolha Avançar novamente

7. Escolha Enviar.

O modelo cria um Network Load Balancer com 2 target groups e um security group para ele e adiciona regras ao grupo Upstream Default Security.

Etapa 5: Configurar a federação no broker downstream

    1. Use a saída do URL NLB do Upstream Broker do NLBStack e substitua-a nos seguintes comandos de exportação junto com o Uri do Downstream Broker da saída do BrokerStack.
export Upstream_Broker_NLB= <UpstreamBrokerNLBURL>
export Downstream_Broker_Uri= <DownstreamBrokerURI> 
Bash

2. No console da AWS, pesquise o AWS Secrets Manager e escolha Segredos. Você encontrará 2 segredos com nomes como DownstreamBrokerUsernamePassword e UpstreamBrokerUsernamePassword. Abra um deles e escolha Recuperar valor secreto para obter as senhas e nomes de usuário dos brokers. Repita o procedimento para o outro.

3. Substitua os valores de Upstream_Broker_Username, Upstream_Broker_Password, Downstream_Broker_Username e Downstream_Broker_Password nos comandos a seguir.</p

##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
Bash

4. No console do EC2, selecione a instância do EC2 criada como parte do Broker Stack na Etapa 1. Escolha Connect e faça login na instância usando o EC2 Instance Connect. Depois de conectado ao terminal, cole as linhas acima com os valores substituídos para criar o upstream da federação e a política associada a ela.

Etapa 6: criar o TestExchange e a fila de teste e vinculá-los

  1. Execute as etapas a seguir para criar uma troca de teste, uma fila e a vinculação para elas. Substitua os valores de Downstream_Broker_Username e 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
Bash

Etapa 7: Validar o status da federação e testar a federação entre brokers

  1. Verifique o status da Federação executando o comando a seguir enquanto ainda estiver conectado ao EC2 na mesma sessão. Substitua os valores de Downstream_Broker_Username e 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
Bash

A saída será semelhante à mostrada abaixo, com o status de execução.

[
    {
        "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",
…
    }
]
JSON
  • 2. (Opcional) Envie uma mensagem de teste agora. Como você restringiu o Upstream Broker NLB a receber apenas tráfego do downstream broker (por meio do endereço IP recebido do caso de suporte), você precisará permitir manualmente o endereço IP público EC2 no security group do NLB que foi criado para a porta 443 execute a etapa abaixo. Você também precisará permitir a saída do EC2 para acessar o 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
Bash

Depois que a mensagem for enviada, ela aparecerá como roteada: verdadeira. Isso significa que a mensagem foi roteada para o agente downstream com sucesso.

3. Use o comando a seguir para validar a mensagem no agente downstream. Isso deve mostrar a carga que você enviou anteriormente.

## 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
Bash

Saída:

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

Limpeza

Esta seção fornece informações para excluir vários recursos criados como parte desta publicação.

  1. Exclua a pilha NLBStack criada como parte da Etapa 4. Para obter instruções, consulte Excluir uma pilha no console do AWS CloudFormation.
  2. Exclua o BrokerStack criado na Etapa 1.

Conclusão

Esta postagem explicou como implementar a federação para os brokers privados do Amazon MQ RabbitMQ. Você pode estender essa solução aos brokers RabbitMQ em uma implantação de cluster, da mesma forma que um agente de instância única. Com trocas federadas, você pode criar um sistema distribuído de brokers RabbitMQ para melhorar a confiabilidade e a escalabilidade do sistema de mensagens. Você também pode usar isso como um modelo de arquitetura híbrida para mover mensagens de um agente local privado para a nuvem, conforme explicado em Migração de aplicativos orientados por mensagens para o Amazon MQ for RabbitMQ. Obtenha mais detalhes sobre o plugin Federation na documentação oficial do RabbitMQ. Obtenha mais detalhes sobre o Amazon MQ para RabbitMQ em nosso guia do desenvolvedor.

Este conteúdo foi traduzido da postagem original do blog, que pode ser encontrada aqui.

Biografia dos Autores

Ishita Chakraborty é uma gerente de contas tecnica senior na Amazon Web Services (AWS)
Vinodh Kannan Sadayamuthu é arquiteto especialista sênior de soluções na Amazon Web Services (AWS)

Biografia do tradutor

Daniel Abib é arquiteto de soluções sênior na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/

Nicolas Tarzia é Senior Technical Account Manager na AWS, com mais de 13 anos de experiencia, com ampla experiencia em arquitetura cloud, engenharia e design de software. Atualmente está habilitando empresas do ramo de ISV (Independent Software Vendors) simplificando a operação na nuvem e otimizando os custos em cloud. Sua area de interesse são tecnologias serverless.

https://www.linkedin.com/in/nicolastarzia