Skip to content

クイックスタート:ネームスペースの体験

本セクションでは、MQTTXクライアントを使用してEMQXに接続し、ネームスペース機能のコア機能であるテナント識別、クライアントおよびトピックの分離、ACLの分離を素早く体験する方法を案内します。

ネームスペースソースの有効化(tns属性の生成)

ネームスペースソースを設定することで、EMQXはクライアント接続情報からネームスペースを識別し、クライアント接続時に対応するネームスペースを自動的に作成できます。

設定ファイルによる有効化

base.hoconに以下の設定を追加し、ユーザー名からネームスペース識別子を抽出します。

mqtt.client_attrs_init = [
  { expression = "nth(1, tokens(username, '-'))", set_as_attr = tns }
]

クライアントがユーザー名 tenantA-user1 で接続すると、EMQXは tenantA をネームスペース識別子として抽出します。

ダッシュボードによる有効化

ダッシュボードでもネームスペースソースを設定できます。

  1. 管理 -> ネームスペース -> 設定 に移動します。

  2. ネームスペースを取得する元に以下の式を入力します。

    nth(1, tokens(username, '-'))
  3. 確定をクリックして設定を保存します。

namespace_source

ネームスペースの自動作成を確認

  1. MQTTXを使い、テナント tenantA をシミュレートしたMQTTクライアント接続を作成します。

    • ユーザー名tenantA-user1
    • EMQXに接続します。
  2. ネームスペースページで、明示的に作成されたネームスペースのみ表示を無効にします。

  3. ネームスペース tenantA が自動的に作成されていることを確認します。

  4. 操作列の クライアント をクリックし、このネームスペースに接続しているクライアントを表示します。

    namespace_client

ネームスペース分離の設定と検証

クライアントIDおよびトピック分離の有効化

異なるネームスペース間でクライアントIDとトピックを分離するには、グローバルネームスペース設定で該当オプションを有効にします。

設定ファイルによる有効化

base.hoconに以下の設定を追加します。

hocon
mqtt.clientid_override = "concat([client_attrs.tns, '-', clientid])"
mqtt.namespace_as_mountpoint = true

これらの設定により、

  • クライアントIDにネームスペースのプレフィックスが自動付与され、ネームスペース間のクライアントID競合を防止します。
  • ブローカー内部でトピックに {namespace}/ プレフィックスが自動付与され、ネームスペース単位のトピック分離を実現します。

ダッシュボードによる有効化

  1. ダッシュボードの 管理 -> ネームスペース -> 設定 に移動します。

  2. 以下のオプションを有効にします。

    • クライアントID分離(デフォルト値は concat([client_attrs.tns, '-', clientid])
    • ネームスペースをマウントポイントとして使用
  3. 確定をクリックして設定を保存します。

クライアントおよびトピック分離の検証

  1. MQTTXを使い、2つのテナント tenantAtenantB をシミュレートする2つのMQTTクライアント接続を作成します。

    クライアントA(テナント:tenantA)

    パラメータ
    クライアントIDclient1
    ユーザー名tenantA-user1
    サブスクライブtest/topic

    クライアントB(テナント:tenantB)

    パラメータ
    クライアントIDclient1
    ユーザー名tenantB-user2
    パブリッシュtest/topic
  2. クライアントBでメッセージをパブリッシュします。MQTTXおよびEMQXダッシュボードで結果を確認します。

    • 両クライアントは同じクライアントID(client1)を使用していますが、プレフィックスルールにより tenantA-client1tenantB-client1 として接続され、競合を回避しています。
    • 両クライアントは同じトピック(test/topic)を使用していますが、ネームスペースで分離されているため、クライアントAはクライアントBからパブリッシュされたメッセージを受信しません
  3. モニタリング -> クライアント ページで以下を確認します。

    • クライアントAのサブスクライブトピックは tenantA/test/topic として表示されます。
    • クライアントBのパブリッシュトピックは tenantB/test/topic として表示されます。

namespace_client_list

namespace_client_sub

マウントポイントベースのACLチェックを有効化

デフォルトでは、後方互換性を維持するために、認可(ACL)チェックはトピックプレフィックス(マウントポイント)を含みません。つまり、認可ルールは名前空間付きトピック(例:tenantA/test/topic)ではなく、元のトピック名(例:test/topic)に対してマッチングされます。

EMQX 6.1以降では、トピックプレフィックスを含む認可チェックを有効にして、ネームスペース単位のACL分離を強制できます。

設定ファイルによる有効化

base.hoconに以下の設定を追加します。

hocon
authorization.include_mountpoint = true

ダッシュボードによる有効化

  1. ダッシュボードの 管理 -> ネームスペース -> 設定 または アクセス制御 -> クライアント認可 -> 設定 に移動します。

  2. 認可にマウントプレフィックスを含める を有効化します。

  3. 設定を保存します。

注意

authorization.include_mountpoint = true を有効にした場合、すべての認可ルールはトピックマッチングパターンにトピックプレフィックスを含める必要があります。

例えば、クライアントがトピックプレフィックス tenantA/ を持つリスナー経由で接続し、test/topic をサブスクライブする場合、対応する認可ルールは tenantA/test/topic として設定する必要があります。