みんな大好き!MQTTは、TCP/IPベースの軽量シンプルなPub/Subメッセージングモデルのプロトコルです。
ご存知の通り、AWS IoTやAzure IoTHubなどのクラウドサービスでもMQTT Brokerが提供されており、こうしたサービスを使う機会も多いと思うのですが、本記事ではオープンソースのブローカーであるVerneMQを使って、自力でMQTT Broker立ち上げてみます。
VerneMQとは
VerneMQは、Erlio GmbH社が開発しているMQTT Brokerで、Apache license 2.0で公開されています。Erlang/OTPで書かれており、クラスタを組むこともできます。
ちなみに気になる”VerneMQ”の発音ですが、海外YouTubeの動画をみていると、Verneの最後の”e”が次の”M”と重なって”べるねむきゅー”と発音している感じです。
#といいつつ、私は”べるね・えむきゅー”と読んでます
インストール
それではAWS EC2上でやってみましょう。debian, ubuntu, redhat向けのバイナリパッケージも提供されているので、インストールは簡単です。まずはパッケージをダウンロードして、yum installします。
1 2 |
$ sudo yum install VerneMQ-1.1.0-1.el7.centos.x86_64.rpm |
vernemq.confの設定
設定ファイルは、/etc/vernemq/vernemq.conf にあります。ひとまず今回は、以下の設定で動かしてみます。ダウンロードしたバージョンでは、デフォルト設定の通りでした。
1 2 3 4 5 6 7 8 9 10 |
allow_anonymous = off #匿名での接続を禁止 plugins.vmq_passwd = on #パスワードファイルで認証する vmq_passwd.password_file = /etc/VerneMQ/vmq.passwd plugins.vmq_acl = on #ACLファイルで認可する vmq_acl.acl_file = /etc/VerneMQ/vmq.acl vmq_passwd.password_reload_interval = 0 #変更は即座に反映する |
passwdファイルの作成
次に認証情報を設定していきます。VerneMQに接続するユーザは、vmq-passwd コマンドで追加していきます。-c オプションでpasswdファイルの新規作成、-D オプションは削除です。
まず、ユーザ pub を作成します。
1 2 |
$ sudo vmq-passwd -c /etc/vernemq/vmq.passwd pub |
同様に、sub1, sub2 ユーザを作成します。すでにパスワードファイルが存在しているので、-c オプションは必要ありません。
1 2 3 |
$ sudo vmq-passwd /etc/vernemq/vmq.passwd sub1 $ sudo vmq-passwd /etc/vernemq/vmq.passwd sub2 |
acl設定
次に、aclファイルを設定します。aclファイルは、VerneMQに接続したクライアントが、何のトピックに対してpublish, subscribeできるかを定義するファイルです。ファイルパスは、vernemq.confで指定します。
ユーザごとにルールを定義していくと、クライアント数が多くなったときに管理が大変になります。しかしながらMQTTクライアントは、現実的には、特定topicへのpublishと自分自身へのメッセージのみsubscribeで十分というケースも多いです。こうした場合、VerneMQではtopicの指定に文字クラスが指定可能なので、これを活用します。例えば %u は接続時のユーザ名を表します。
以下のような指定の場合、すべてのクライアントは、data/(接続したユーザID) のtopicをsubscribleすることができます。
1 2 |
pattern read user/%u |
さらに記述を追加しましょう。
以下のように設定すると、pub1 ユーザは、data/ 以下のすべてのtopicに対し、publishをすることができます。
1 2 3 4 5 |
pattern read user/%u user pub topic write user/+ |
長くなってしまいました。次回、プログラムから実際に publish/subscribeを実行してみます。