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. ネームスペースを解決するタイミング はデフォルトの 認証前 のままにします。

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

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

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 を模擬した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 として設定しなければなりません。