クイックスタート:ネームスペースの体験
このセクションでは、MQTTXクライアントを使ってEMQXに接続し、ネームスペース機能のコア機能であるテナント識別、クライアントおよびトピックの分離、ACL分離を素早く体験する方法を案内します。
ネームスペースソースの有効化(tns属性の生成)
ネームスペースソースを設定することで、EMQXはクライアント接続情報からネームスペースを識別し、クライアント接続時に対応するネームスペースを自動的に作成できます。
設定ファイルによる有効化
base.hoconに以下の設定を追加し、ユーザー名からネームスペース識別子を抽出します。
mqtt.client_attrs_init = [
{ expression = "nth(1, tokens(username, '-'))", set_as_attr = tns }
]例
クライアントがユーザー名 tenantA-user1 で接続すると、EMQXは tenantA をネームスペース識別子として抽出します。
ダッシュボードによる有効化
ダッシュボードでもネームスペースソースを設定できます。
管理 -> ネームスペース -> 設定 に移動します。
ネームスペースを解決するタイミング はデフォルトの 認証前 のままにします。
ネームスペースを取得する場所 に以下の式を入力します。
nth(1, tokens(username, '-'))確認 をクリックして設定を保存します。

ネームスペースの自動作成を確認
MQTTXを使ってテナント
tenantAを模擬したMQTTクライアント接続を作成します。- ユーザー名:
tenantA-user1 - EMQXに接続します。
- ユーザー名:
ネームスペース ページで 明示的に作成されたネームスペースのみ表示 を無効にします。
ネームスペース
tenantAが自動的に作成されていることを確認します。操作 列の クライアント をクリックし、このネームスペースに接続しているクライアントを表示します。

ネームスペース分離の設定と確認
クライアントIDおよびトピック分離の有効化
異なるネームスペース間でクライアントIDとトピックを分離するには、グローバルネームスペース設定で該当オプションを有効にする必要があります。
設定ファイルによる有効化
base.hoconに以下の設定を追加します。
mqtt.clientid_override = "concat([client_attrs.tns, '-', clientid])"
mqtt.namespace_as_mountpoint = trueこの例では、EMQXは認証前にユーザー名からネームスペースを取得し、client_attrs.tnsに格納します。
EMQX 6.3.0以降では、mqtt.clientid_overrideの式がエラーを返すか空文字列になる場合、接続を拒否します。すべてのクライアントがネームスペース式で期待される形式のユーザー名を提供していることを確認してください。その他のネームスペース解決モードについては、クライアントID分離を参照してください。
これらの設定により:
- クライアントIDにネームスペースのプレフィックスが自動的に付加され、ネームスペース間のクライアントID競合を防止します。
- ブローカー内部でトピックに
{namespace}/のプレフィックスが自動的に付加され、ネームスペース単位のトピック分離を実現します。
ダッシュボードによる有効化
ダッシュボードで 管理 -> ネームスペース -> 設定 に移動します。
以下のオプションを有効にします。
- クライアントID分離(デフォルト値は
concat([client_attrs.tns, '-', clientid])) - ネームスペースをマウントポイントとして使用
- クライアントID分離(デフォルト値は
確認 をクリックして設定を保存します。
クライアントおよびトピック分離の確認
MQTTXを使って、2つのテナント
tenantAとtenantBを模擬する2つのMQTTクライアント接続を作成します。クライアントA(テナント:tenantA):
パラメータ 値 クライアントID client1ユーザー名 tenantA-user1サブスクライブ test/topicクライアントB(テナント:tenantB):
パラメータ 値 クライアントID client1ユーザー名 tenantB-user2パブリッシュ test/topicクライアントBでメッセージをパブリッシュします。MQTTXとEMQXダッシュボードで結果を確認します。
- 両クライアントは同じクライアントID(
client1)を使用していますが、プレフィックスルールによりtenantA-client1とtenantB-client1として接続され、競合を回避しています。 - 両クライアントは同じトピック(
test/topic)を使用していますが、ネームスペースで分離されているため、クライアントAはクライアントBがパブリッシュしたメッセージを受信しません。
- 両クライアントは同じクライアントID(
モニタリング -> クライアント ページで以下を確認します。
- クライアントAのサブスクライブトピックは
tenantA/test/topicとして表示されます。 - クライアントBのパブリッシュトピックは
tenantB/test/topicとして表示されます。
- クライアントAのサブスクライブトピックは


マウントポイントベースのACLチェックを有効化
デフォルトでは、後方互換性のために認可(ACL)チェックはトピックのプレフィックス(マウントポイント)を含みません。つまり、認可ルールは名前空間付きトピック(例:tenantA/test/topic)ではなく、元のトピック名(例:test/topic)に対してマッチングされます。
EMQX 6.1以降では、トピックのプレフィックスを含む認可チェックを有効化して、ネームスペース単位のACL分離を強制できます。
設定ファイルによる有効化
base.hoconに以下の設定を追加します。
authorization.include_mountpoint = trueダッシュボードによる有効化
ダッシュボードで 管理 -> ネームスペース -> 設定 または アクセス制御 -> クライアント認可 -> 設定 に移動します。
認可にマウントプレフィックスを含める を有効にします。
設定を保存します。
補足
authorization.include_mountpoint = true を有効にすると、すべての認可ルールはトピックマッチングパターンにトピックプレフィックスを含める必要があります。
例えば、クライアントがトピックプレフィックス tenantA/ を持つリスナー経由で接続し、test/topic をサブスクライブする場合、対応する認可ルールは tenantA/test/topic として設定しなければなりません。