CLOVER🍀

That was when it all began.

Ubuntu Linux 22.04 LTSにRabbitMQをインストールする

これは、なにをしたくて書いたもの?

久しぶりに、RabbitMQを使ってみたくなりまして。まずはインストールするところから見直してみたいと思います。

RabbitMQ

RabbitMQのWebサイトはこちら。

Messaging that just works — RabbitMQ

機能はOSS版、商用版それぞれ以下に書かれています。

ざっくりこんな感じでしょうか。

ドキュメントは、こちら。

Documentation: Table of Contents — RabbitMQ

RabbitMQの基本的な機能の使い方は、Getting Startedがとてもわかりやすくまとまっていると思います。

RabbitMQ Tutorials — RabbitMQ

以下が紹介されています。

  • キュー
  • キューを使った複数のワーカーへのタスク送信
  • パブリッシュ/サブスクライブ
  • ルーティング
  • トピック
  • 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は、以下になります。

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 — RabbitMQ

設定ファイルの場所などは、こちらに記載があります。

Configuration / Configuration File(s)

今回のインストール方法だと、設定ファイルは作られないみたいですね。

$ sudo ls -l /etc/rabbitmq/
合計 0

データは/var/lib/rabbitmq/mnesiaディレクトリ内にありそうです。

ユーザーを作成する

インストール時には、guestguestという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については、こちら。

Virtual Hosts — RabbitMQ

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をインストールしましょう。

Management Plugin — RabbitMQ

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年くらい前なのでだいぶ変わっていましたが、特に困ることはなかったですね。
今回はドキュメントも眺めつつやったので、けっこう時間がかかりましたが。

これから少しずつ扱っていきましょう。