以前の記事でMQTTプロトコルについて説明しました。
今回は実際にMQTT通信を行うためのブローカー(サーバ)の構築について紹介します。
とある案件でAmazon Linux 2023上にMQTT(ブローカー/クライアント)ソフトウェアのmosquittoをインストールし、ブローカーを構築したのでその時の記録を記載します。
dnfによるmosquittoインストール → 失敗
Amazon Linux 2023ではyumの代わりにdnfを使ってソフトウェアをインストールしますが、mosquittoはインストールできないようでした。
その他の方法はないか確認していたところ、mosquittoのダウンロードページ(https://mosquitto.org/download/) に「Linux distributions with snap support」とあったのでsnapを使ってインストールすることにしました。
snapによるmosquittoインストール
snapはyumやdnf同様パッケージマネージャーで、様々なLinuxディストリビューションで動作します。
まず、snapdをインストールします。(参考: https://github.com/bboozzoo/snapd-amazon-linux)
sudo wget -O /etc/yum.repos.d/snapd.repo https://bboozzoo.github.io/snapd-amazon-linux/al2023/snapd.repo
sudo dnf install snapd -y
snapからmosquittoをインストールするため以下のコマンドを実行します。
sudo snap install mosquitto
これでmosquittoのインストールは完了しました。
次に設定ファイルを作成します。
mosquittoの設定
設定ファイルは以下の場所に作成・配置します。
/var/snap/mosquitto/common/mosquitto.conf
内容は以下のとおりです。
listener 1883
allow_anonymous false
password_file /var/snap/mosquitto/common/password.txt
log_dest file /var/log/mosquitto.log
listenerは通信を行うポート番号です。通常1883番ポートを利用します。
allow_anonymousは不特定多数の接続を許可するかの設定です。falseの場合、通信時にユーザ名とPasswordを要求します。
password_fileはアクセス時に参照するIDとパスワードのリストが記載されたファイルのパスを指定します。
log_destはログファイルの出力先を指定します。ここではfile形式の/var/log/mosquitto.logを指定しています。
ユーザ・パスワード登録
パスワードファイルは以下の手順で作成します。
まず、以下のようにユーザ名と平文のパスワードの組を記載したファイルを用意します。
test:password
sekappy:sekappypassword
admin:adminpassword
次にmosquitto_passwdを実行します。この時-Uオプションに先ほど作ったファイルを指定します。
sudo mosquitto_passwd -U password.txt
実行後、パスワードファイル内のパスワードが暗号化されます。
% cat password.txt
test:$7$101$KGoGpnw/M8XSUezk$3+z9q7aUxPC3jeXEZQjeXH/3IMeqaZua57MbDz2KTsW+6bzvM4fRmlNXwYrUMgn+gVjXhTCSCLrF+7XHw4o04w==
sekappy:$7$101$E8/KibHeO2kbO1ja$MPQE7FzSTQ2q/DS8DW3rOC1Rn34ebAblPzacfqjbSxxlr14v3w+pBrL3tVWTGfcUVZecC5r4e6aRZG9XNE4iYA==
admin:$7$101$RG8Ik5G3SNTiKSQC$HLo9XEOLaxFGzJYsQ4c1CRjR/mjDS0lqDoSnVTHOdzGsq7HR1GK2Nk3LWxk7KQ0N71aVxfZ2d2wZn1OA7Y3Zlg==
暗号化したパスワードファイルを設定ファイルのpassword_fileで指定したパスに移動させ、以下のコマンドでmosquittoを再起動し、設定を反映させます。
sudo snap restart mosquitto
動作確認
mosquittoをインストールしたサーバ上でMQTT通信の動作確認をしてみます。
ターミナルのウィンドウを2つ用意して片方でサブスクライブ(メッセージ受信)、もう片方でパブリッシュ(メッセージ送信)をしてみます。
サブスクライブ
サブスクライブは以下のコマンドを実行します。
mosquitto_sub -h localhost -t topic/test -u test -P password
-hにブローカーのアドレス(ホスト名・IPアドレス)、-tに通信を行うトピック名、-uにユーザ名、-Pにパスワードを設定します。
ブローカーに接続できなかったり、ユーザ名やパスワードが正しくない場合はエラーになります。
接続成功した場合は、受信待機状態になります。
パブリッシュ
パブリッシュは以下のコマンドで実行します。
mosquitto_pub -h localhost -t topic/test -m "Hello, MQTT" -u test -P password
-mにメッセージの内容を記述します。
正しく処理されれば、パブリッシュ実行後に、サブスクライブしているウィンドウに「Hello, MQTT」が出力されます。
まとめ
今回はAmazon Linux 2023にMQTTソフトウェアのmosquitteをインストールする方法と、初期設定そして実際のMQTT通信の動作について紹介しました。
MQTTにはTLSによる通信の暗号化など他にも機能がありますので、別の機会に紹介したいと思います。