RabbitMQ: Utilizzare Python per connettersi a RabbitMQ

Questa documentazione fa parte della guida Guida introduttiva. Consulta la guida completa qui: Come utilizzare Stackhero per RabbitMQ.

Vediamo insieme come collegare la vostra applicazione Python a RabbitMQ utilizzando la libreria Aio Pika. Nella maggior parte dei casi, è sufficiente fornire l'URL AMQPS per stabilire una connessione sicura:

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

Ecco un esempio completo che mostra come stabilire una connessione sicura a RabbitMQ, creare un canale e dichiarare una coda di base. Questo è un ottimo modo per verificare la vostra configurazione:

import asyncio
import logging
import aio_pika

async def main() -> None:
    # Se desiderate visualizzare i log di debug, potete decommentare la riga seguente
    # 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 riscontrate un errore di questo tipo durante la connessione da Python:

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

significa generalmente che il certificato CA Let's Encrypt manca sul vostro sistema. Per risolvere, installate il pacchetto dei certificati CA adatto al vostro sistema operativo:

  1. Su Ubuntu/Debian, eseguite:

    sudo apt install ca-certificates
    
  2. Su Alpine Linux, eseguite:

    apk add ca-certificates
    

Se non potete utilizzare questi comandi, avete comunque la possibilità di installare manualmente il certificato CA:

  1. Scaricate il certificato CA Let's Encrypt da https://letsencrypt.org/certs/isrgrootx1.pem.

  2. Poi, potete collegarvi a RabbitMQ nel vostro codice Python specificando il file del certificato 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
    )
    

Ecco un esempio completo che utilizza il certificato CA Let's Encrypt per connessioni sicure:

import asyncio
import logging
import ssl
import aio_pika

async def main() -> None:
    # Per abilitare i log di debug, potete decommentare questa riga
    # logging.basicConfig(level=logging.DEBUG)

    ssl_context = ssl.create_default_context()
    # Caricate il certificato CA Let's Encrypt che avete scaricato
    # Ad esempio: 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())