これは、なにをしたくて書いたもの?
久しぶりに、RabbitMQを使ってみたくなりまして。まずはインストールするところから見直してみたいと思います。
RabbitMQ
RabbitMQのWebサイトはこちら。
Messaging that just works — RabbitMQ
機能はOSS版、商用版それぞれ以下に書かれています。
ざっくりこんな感じでしょうか。
- OSS RabbitMQ Features
- 様々な種類の非同期メッセージング
- Kubernetes、BOSH、Chef、Puppetなどでのデプロイや、各種プログラミング言語への対応
- 高可用性やスループットを高めるためのクラスター構成
- 認証・認可
- ツールやプラグイン
- 管理機能やモニタリング機能
- Commercial RabbitMQ Features
- クラスター内圧縮
- Warmスタンバイレプリケーション
- 24/7のサポート
ドキュメントは、こちら。
Documentation: Table of Contents — RabbitMQ
RabbitMQの基本的な機能の使い方は、Getting Startedがとてもわかりやすくまとまっていると思います。
以下が紹介されています。
- キュー
- キューを使った複数のワーカーへのタスク送信
- パブリッシュ/サブスクライブ
- ルーティング
- トピック
- RPC
- 送信確認
その他、ドキュメント内にある以下あたりも気になるところです。
とりあえず、今回はRabbitMQをインストールしてみましょう。
環境
今回の環境は、こちらです。Ubuntu Linux 22.04 LTSを対象にします。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy $ uname -srvmpio Linux 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
RabbitMQをインストールする
RabbitMQのダウンロードやインストールに関するページはこちら。
Downloading and Installing RabbitMQ — RabbitMQ
今回はUbuntu Linux 22.04 LTSにインストールするので、こちらのページを参照します。
Installing on Debian and Ubuntu — RabbitMQ
インストール方法は、次の3つがあるようです。
- Cloudsmithのaptリポジトリーを使ってパッケージインストールする
- PackageCloudとLaunchpadのaptリポジトリーを使ってパッケージインストールする
- debパッケージを使ってインストールする
Installing on Debian and Ubuntu / How to Install Latest RabbitMQ on Debian and Ubuntu
推奨は、aptリポジトリーからのインストールです。
サポートされているUbuntu LinuxおよびDebianは、以下になります。
- Ubuntu Linux 18.04からUbuntu Linux 22.10まで
- Debian Buster(10)、Bullseye(11)
Installing on Debian and Ubuntu / / Supported Distributions
今回はPackageCloudとLaunchpadのaptリポジトリーを使うことにします。
Installing on Debian and Ubuntu / Using RabbitMQ Apt Repositories on PackageCloud
依存パッケージをインストール。
$ sudo apt-get install apt-transport-https
リポジトリーの署名キーを追加。
$ curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null $ curl -1sLf "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xf77f1eda57ebb1cc" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg > /dev/null $ curl -1sLf "https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.packagecloud.rabbitmq.gpg > /dev/null
sources.listへの追加。
$ sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF deb [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu $(lsb_release -cs) main deb-src [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu $(lsb_release -cs) main deb [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main deb-src [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main EOF
lsb_release -cs
を使いましたが、使っているディストリビューション名と合わせることが必要です。
更新。
$ sudo apt update
Erlangに関するパッケージのインストール。
$ sudo apt install erlang-base \ erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \ erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \ erlang-runtime-tools erlang-snmp erlang-ssl \ erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
RabbitMQのインストール。
$ sudo apt install rabbitmq-server --fix-missing
RabbitMQ 3.11.9がインストールされました。
$ sudo rabbitmqctl version 3.11.9
バージョンを指定してインストールする場合は、こうですかね。
$ sudo apt install rabbitmq-server=3.11.9-1 --fix-missing
指定できるバージョンは、こちらを見るとよさそうです。
rabbitmq/rabbitmq-server - Packages · packagecloud
RabbitMQを起動する
では、インストールしたRabbitMQを起動してみましょう。
Installing on Debian and Ubuntu / Run RabbitMQ Server
と言いたいところですが、インストール時点ですでに起動済みだったりします。
$ systemctl status rabbitmq-server ● rabbitmq-server.service - RabbitMQ broker Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2023-02-23 23:41:26 JST; 35s ago Main PID: 4655 (beam.smp) Tasks: 25 (limit: 2237) Memory: 96.8M CPU: 5.998s CGroup: /system.slice/rabbitmq-server.service ├─4655 /usr/lib/erlang/erts-13.1.5/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000> ├─4665 erl_child_setup 32768 ├─4693 /usr/lib/erlang/erts-13.1.5/bin/epmd -daemon ├─4714 /usr/lib/erlang/erts-13.1.5/bin/inet_gethost 4 ├─4715 /usr/lib/erlang/erts-13.1.5/bin/inet_gethost 4 └─4758 /bin/sh -s rabbit_disk_monitor
停止。
$ sudo systemctl stop rabbitmq-server
起動。
$ sudo systemctl start rabbitmq-server
Installing on Debian and Ubuntu / Managing the Service
RabbitMQに関するポートはこちら。
- 4369: epmd, a peer discovery service used by RabbitMQ nodes and CLI tools
- 5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS
- 25672: used for inter-node and CLI tools communication (Erlang distribution server port) and is allocated from a dynamic range (limited to a single - port by default, computed as AMQP port + 20000). Unless external connections on these ports are really necessary (e.g. the cluster uses federation or CLI tools are used on machines outside the subnet), these ports should not be publicly exposed. See networking guide for details.
- 35672-35682: used by CLI tools (Erlang distribution client ports) for communication with nodes and is allocated from a dynamic range (computed as server distribution port + 10000 through server distribution port + 10010). See networking guide for details.
- 15672: HTTP API clients, management UI and rabbitmqadmin (only if the management plugin is enabled)
- 61613, 61614: STOMP clients without and with TLS (only if the STOMP plugin is enabled)
- 1883, 8883: MQTT clients without and with TLS, if the MQTT plugin is enabled
- 15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)
- 15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)
- 15692: Prometheus metrics (only if the Prometheus plugin is enabled)
Installing on Debian and Ubuntu / Port Access
ログファイルは/var/log/rabbitmq
ディレクトリ内にあります。
$ sudo ls -l /var/log/rabbitmq 合計 84 -rw-r----- 1 rabbitmq adm 79319 2月 23 23:42 rabbit@ubuntu2204.log -rw-r----- 1 rabbitmq adm 0 2月 23 23:28 rabbit@ubuntu2204_upgrade.log
journalctl
でも確認できます。
$ sudo journalctl -u rabbitmq-server
Installing on Debian and Ubuntu / Log Files and Management
設定について。
Installing on Debian and Ubuntu / Configuring RabbitMQ
こちらは、別ドキュメントになっています。
設定ファイルの場所などは、こちらに記載があります。
Configuration / Configuration File(s)
今回のインストール方法だと、設定ファイルは作られないみたいですね。
$ sudo ls -l /etc/rabbitmq/ 合計 0
データは/var/lib/rabbitmq/mnesia
ディレクトリ内にありそうです。
ユーザーを作成する
インストール時には、guest
/guest
というlocalhost
からのみ接続可能なユーザーが作成されるようです。
The broker creates a user guest with password guest. Unconfigured clients will in general use these credentials. By default, these credentials can only be used when connecting to the broker as localhost so you will need to take action before connecting from any other machine.
Installing on Debian and Ubuntu / Default User Access
ユーザーの追加など、ユーザーの管理についてはこちら。
Authentication, Authorisation, Access Control — RabbitMQ
まずは現在のユーザーを確認。
$ sudo rabbitmqctl list_users Listing users ... user tags guest [administrator]
確かにguest
というユーザーがありますね。
ユーザーはVirtual Hostへのアクセス許可を行うもののようです。
Different users can be granted access only to specific virtual hosts. Their permissions in each virtual hosts also can be limited.
デフォルトのVirtual Hostは、/
のようですね。
a virtual host named / (a slash)
Authentication, Authorisation, Access Control / Default Virtual Host and User
Virtual Hostについては、こちら。
RabbitMQはマルチテナントシステムであり、接続、Exchange、Queue、Binding、ユーザーの権限やポリシーなどはVirtual Hostという
論理的なグループで管理するようです。
RabbitMQ is multi-tenant system: connections, exchanges, queues, bindings, user permissions, policies and some other things belong to virtual hosts, logical groups of entities.
Virtual Hostは設定ファイルではなく、rabbitmqctl
コマンドやHTTP APIで行います。
There is, however, one important difference: virtual hosts in Apache are defined in the configuration file; that's not the case with RabbitMQ: virtual hosts are created and deleted using rabbitmqctl or HTTP API instead.
話を戻して、ユーザーを作成しましょう。
Authentication, Authorisation, Access Control / Managing Users and Permissions
ユーザー名kazuhira
、パスワードpassword
でユーザーを作成。
$ sudo -u rabbitmq rabbitmqctl add_user 'kazuhira' 'password' Adding user "kazuhira" ... Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
パスワードを指定する方法はいくつかあるようですが、今回は引数にそのまま指定しました。
ユーザーが作成されていることを確認。
$ sudo -u rabbitmq rabbitmqctl list_users Listing users ... user tags guest [administrator] kazuhira []
次に、権限を与えます。
$ sudo -u rabbitmq rabbitmqctl set_permissions -p '/' 'kazuhira' '.*' '.*' '.*' Setting permissions for user "kazuhira" in vhost "/" ...
Virtual Hostは/
に、あとは全権限を与えました。
3つの引数の権限は、それぞれ以下のグルーピングのようです。
- First ".*" for configure permission on every entity(設定)
- Second ".*" for write permission on every entity(書き込み)
- Third ".*" for read permission on every entity(読み取り)
確認。
$ sudo -u rabbitmq rabbitmqctl list_user_permissions kazuhira Listing permissions for user "kazuhira" ... vhost configure write read / .* .* .*
これで、ユーザーが作成できました。
管理UIをインストールする
最後に、管理UIをインストールしましょう。
RabbitMQには、組み込みの管理UIやHTTP APIによるモニタリングのオプションがあります。
Management Plugin / Management UI and External Monitoring Systems
管理UIにはいくつか制限があるので、本格的に運用する場合はPrometheusやGrafana、Elastic Stackの利用を勧めていますね。
今回は簡単に管理UIを使います。
Management Plugin / Getting Started
マネジメントプラグインの有効化。
$ sudo rabbitmq-plugins enable rabbitmq_management
即有効になり、特に再起動は不要みたいです。
Enabling plugins on node rabbit@ubuntu2204: rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@ubuntu2204... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins.
ところで、このコマンドを実行するにはroot
またはrabbitmq
ユーザーで実行すること、と言われるのですが、sudo -u rabbitmq
で
実行しても同じメッセージでエラーになりました…。
Only root or rabbitmq can run rabbitmq-plugins
http://[RabbitMQが稼働しているホスト]:15672/
にアクセスすると、管理UIが確認できます。
先ほど作成したユーザーでログインしようとすると、「管理ユーザーではない」と言われます。
以下に従って、適切にタグを設定する必要がありそうです(権限ではなく)。
Management Plugin / Access and Permissions
例に従って、今回はadministrator
タグを付与することにしましょう。
Management Plugin / Command Line Examples
$ sudo -u rabbitmq rabbitmqctl set_user_tags kazuhira administrator Setting tags for user "kazuhira" to [administrator] ...
確認。
$ sudo -u rabbitmq rabbitmqctl list_users Listing users ... user tags guest [administrator] kazuhira [administrator]
ユーザーに付与したタグは、rabbitmq list_users
で確認できるようです。
今度は管理UIにログインできるようになりました。
今回は、このくらいにしておきましょうか。
まとめ
久しぶりにRabbitMQをインストールしてみました。
前に試したのが7年くらい前なのでだいぶ変わっていましたが、特に困ることはなかったですね。
今回はドキュメントも眺めつつやったので、けっこう時間がかかりましたが。
これから少しずつ扱っていきましょう。