RabbitMQ: はじめに
Stackhero で RabbitMQ を利用する方法
Python で RabbitMQ に接続する
ここでは、Aio Pika ライブラリを使って Python アプリケーションから RabbitMQ に接続する方法をご案内します。ほとんどの場合、セキュアな接続には AMQPS URL を指定するだけで十分です:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
以下は、RabbitMQ へのセキュアな接続を確立し、チャネルを作成し、基本的なキューを宣言する完全なサンプルです。セットアップの確認にも最適です:
import asyncio
import logging
import aio_pika
async def main() -> None:
# デバッグログを表示したい場合は、次の行のコメントを外してください
# 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())
unable to get local issuer certificate エラーの対処方法
Python から接続する際に、次のようなエラーが発生する場合:
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
これは、Let's Encrypt の CA 証明書がシステムにインストールされていないことが原因である場合がほとんどです。これを解決するには、ご利用の OS に応じて CA 証明書パッケージをインストールしてください:
-
Ubuntu/Debian の場合:
sudo apt install ca-certificates -
Alpine Linux の場合:
apk add ca-certificates
これらのコマンドが利用できない場合は、CA 証明書を手動でインストールすることも可能です:
-
https://letsencrypt.org/certs/isrgrootx1.pem から Let's Encrypt の CA 証明書をダウンロードします。
-
その後、Python コードで CA 証明書ファイルを指定して RabbitMQ に接続します:
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 )
Let's Encrypt の CA 証明書を使ったセキュアな接続の完全な例は以下の通りです:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# デバッグログを有効にする場合は、次の行のコメントを外してください
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# ダウンロードした Let's Encrypt の CA 証明書を読み込みます
# 例: 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())
GoLang で RabbitMQ に接続する
Go アプリケーションから RabbitMQ に接続する場合は、公式の Go RabbitMQ Client Library を利用すると簡単です。以下の手順で始められます:
- 新しいディレクトリを作成し、Go モジュールを初期化します:
go mod init rabbitmq-example
- プロジェクトに RabbitMQ ライブラリを追加します:
go get github.com/rabbitmq/amqp091-go
-
main.goというファイルを作成し、次のコードを追加します:package main import ( "fmt" amqp "github.com/rabbitmq/amqp091-go" ) func main() { connection, err := amqp.Dial("amqps://<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>") if err != nil { panic(err) } defer connection.Close() fmt.Println("Successfully connected to RabbitMQ instance") } -
次のコマンドでコードを実行します:
go run main.go
接続が成功すると、"Successfully connected to RabbitMQ instance" というメッセージが表示されます。これは認証と TLS 暗号化を使って安全に接続できていることを意味します。
さらに詳しい例については、公式 RabbitMQ リポジトリの Go サンプルもご参照ください:https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go。
PHP で RabbitMQ に接続する
PHP で開発されている場合は、php-amqplib ライブラリを使って RabbitMQ インスタンスに接続できます。Stackhero では TLS(SSL)暗号化を利用しているため、AMQPSSLConnection の利用を推奨します:
use PhpAmqpLib\Connection\AMQPSSLConnection;
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
array()
);
/**
* @param \PhpAmqpLib\Connection\AbstractConnection $connection
*/
function shutdown($connection)
{
$connection->close();
}
register_shutdown_function('shutdown', $connection);
CA 証明書を手動でダウンロードする
TLS 接続時に認証局(CA)証明書が必要になる場合があります。多くのシステムには既に含まれていますが、必要に応じて手動でダウンロードすることも可能です。手順は以下の通りです:
- https://letsencrypt.org/certs/isrgrootx1.pem から証明書をダウンロードし、サーバーに保存します。
- その後、PHP でダウンロードした証明書を指定して接続します:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
PHP/Symfony で RabbitMQ に接続する
Symfony をご利用の場合は、MESSENGER_TRANSPORT_DSN 環境変数を設定することで RabbitMQ をメッセージブローカーとして利用できます。.env ファイルを次のように更新してください:
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
<USER>,<PASSWORD>,<HOST>,<PORT>をご自身の RabbitMQ 情報に置き換えてください。
次に、config/packages/messenger.yaml ファイルで MESSENGER_TRANSPORT_DSN 変数が使われていることを確認します。設定例は以下の通りです:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
Spring Boot で RabbitMQ に接続する
Spring Boot アプリケーションの場合、application properties を更新することで Stackhero の RabbitMQ インスタンスへセキュアに接続できます:
spring.rabbitmq.host=<XXXXXX>.stackhero-network.com
spring.rabbitmq.port=<AMQP_PORT_TLS>
spring.rabbitmq.username=admin
spring.rabbitmq.password=<PASSWORD>
spring.rabbitmq.ssl.enabled=true
spring.rabbitmq.ssl.algorithm=TLSv1.2
.NET と MassTransit で RabbitMQ に接続する
.NET と MassTransit を利用して開発されている場合、TLS 暗号化を用いて Stackhero RabbitMQ にセキュアに接続するには、以下のようにプロジェクトを設定します:
using MassTransit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
public class Program
{
public static void Main(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
services.AddMassTransit(x =>
{
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host(new Uri("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>"), h =>
{
h.UseSsl(s =>
{
s.Protocol = System.Security.Authentication.SslProtocols.Tls12;
});
});
});
});
services.AddMassTransitHostedService(true);
})
.Build();
host.Run();
}
}
Elixir で CLIENT ALERT: Fatal - Handshake Failure エラーが発生した場合
Elixir から接続時に次のエラーメッセージが表示される場合:
CLIENT ALERT: Fatal - Handshake Failure
これは、AMQP ライブラリの TLS 1.3 サポートに関するバグが原因であることが多いです。確実な回避策として、接続時に TLS 1.2 を明示的に指定してください:
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
Node.js で Error: Socket closed abruptly during opening handshake エラーが発生した場合
Node.js で Error: Socket closed abruptly during opening handshake というエラーが表示される場合、RabbitMQ 4.1.0 以降と amqplib ライブラリのバージョンが 0.10.7 未満であることが原因です。これは RabbitMQ 4.1.0 で導入された frame_max 設定に関連しています。
この問題を解決するには、amqplib ライブラリを 0.10.7 以上にアップデートしてください。