RabbitMQ: Utilizar Python para se ligar ao RabbitMQ

Esta documentação faz parte do guia Primeiros passos. Consulte o guia completo aqui: Como utilizar o Stackhero para RabbitMQ.

Vamos mostrar-lhe como pode ligar a sua aplicação Python ao RabbitMQ utilizando a biblioteca Aio Pika. Na maioria dos casos, só precisa de fornecer o URL AMQPS para estabelecer uma ligação segura:

connection = await aio_pika.connect_robust(
  "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)

Segue-se um exemplo completo que demonstra como estabelecer uma ligação segura ao RabbitMQ, criar um canal e declarar uma fila básica. Esta é uma excelente forma de verificar a sua configuração:

import asyncio
import logging
import aio_pika

async def main() -> None:
    # Se quiser ver logs de debug, pode descomentar a linha seguinte
    # logging.basicConfig(level=logging.DEBUG)

    connection = await aio_pika.connect_robust(
        "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>"
    )

    async with connection:
        print("The connection worked!")
        channel = await connection.channel()
        await channel.set_qos(prefetch_count=10)
        queue = await channel.declare_queue("test_queue", auto_delete=True)

if __name__ == "__main__":
    asyncio.run(main())

Se encontrar um erro semelhante ao seguinte ao ligar-se a partir do Python:

aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)

isto normalmente significa que o certificado da autoridade certificadora (CA) Let's Encrypt não está instalado no seu sistema. Para resolver, instale o pacote de certificados CA adequado ao seu sistema operativo:

  1. Em Ubuntu/Debian, execute:

    sudo apt install ca-certificates
    
  2. Em Alpine Linux, execute:

    apk add ca-certificates
    

Se não conseguir utilizar estes comandos, pode sempre instalar o certificado CA manualmente:

  1. Faça o download do certificado CA Let's Encrypt em https://letsencrypt.org/certs/isrgrootx1.pem.

  2. Depois, pode ligar-se ao RabbitMQ no seu código Python especificando o ficheiro do certificado CA:

    import ssl
    
    ssl_context = ssl.create_default_context()
    ssl_context.load_verify_locations(cafile='isrgrootx1.pem')
    
    connection = await aio_pika.connect_robust(
      "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
      ssl_context=ssl_context
    )
    

Segue um exemplo completo utilizando o certificado CA Let's Encrypt para ligações seguras:

import asyncio
import logging
import ssl
import aio_pika

async def main() -> None:
    # Para ativar logs de debug, pode descomentar esta linha
    # logging.basicConfig(level=logging.DEBUG)

    ssl_context = ssl.create_default_context()
    # Carregue o certificado CA Let's Encrypt que descarregou
    # Por exemplo: wget https://letsencrypt.org/certs/isrgrootx1.pem
    ssl_context.load_verify_locations(cafile='isrgrootx1.pem')

    connection = await aio_pika.connect_robust(
        "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
        ssl_context=ssl_context
    )

    async with connection:
        print("The connection worked!")
        channel = await connection.channel()
        await channel.set_qos(prefetch_count=10)
        queue = await channel.declare_queue("test_queue", auto_delete=True)

if __name__ == "__main__":
    asyncio.run(main())